【问题标题】:wpf dynamic windowwpf动态窗口
【发布时间】:2009-10-02 00:05:38
【问题描述】:

我正在尝试创建一个窗口来充当开关板来测试我正在处理的应用程序,但这样做有两个问题。

第一个问题是尝试设置需要动态添加到堆栈面板的按钮的大小和边距。在 XAML 中,属性如下所示:

<StackPanel Name="_mainStackPanel" >
    <Button Height="Auto" Width="Auto" Margin="10,10,10,5" >Do Something</Button>
</StackPanel>

第二个问题比较棘手。我希望开关板窗口有一个带有公开属性的状态栏,如下所示:

<StatusBar BorderBrush="Black" BorderThickness="1" DockPanel.Dock="Left">
    <TextBlock Name="_statusBar" Foreground="Black" TextWrapping="Wrap">blah</TextBlock>
</StatusBar>

public string Status {
        get { return _statusBar.Text; } 
        set { _statusBar.Text = value; }
}

在我正在处理的测试用例中,我只希望每个按钮在单击时在状态栏中显示其文本内容。调用点击会得到一个 NullReferenceException...

我正在使用命令模式来告诉按钮在单击时要执行的操作。这是开关板窗口中的代码,其中命令变成了按钮:

private void _addButtons() {
        foreach (var cmd in _commands)
        {
            var b = new Button
                    {
                        Content = cmd.DisplayText,
                        // height = "Auto" double.NaN ?
                        // width = "Auto"
                        // margin = "10,10,10,5
                    };
            var command = cmd;
            b.Click += ((sender, args) => command.Execute());
            _mainStackPanel.Children.Add(b);
        }
    }

这是我的“测试”中的设置(我没有断言任何东西,只是启动 gui 并查看它是否有效):

[TestFixture]
public class SwitchBoardTests
{
    private SwitchBoardView _switchboard;
    private Application _app;

    [SetUp]
    public void SetUp() {
        var commands = new List<IDisplayableCommand> {
                                                         new StatusCommand("Hello...", _switchboard),
                                                         new StatusCommand("Good Bye...", _switchboard),
                                                     };
        _switchboard = new SwitchBoardView(commands);
    }

    class StatusCommand : DisplayCommand
    {
        private readonly SwitchBoardView _view;
        public StatusCommand(string message, SwitchBoardView view) : base(message) {
            _view = view;
        }
        public override void Execute() { _view.Status = DisplayText; }
    }

    [Test]
    public void Display() {
        _app = new Application();
        _app.Run(_switchboard);
        //_switchboard.Show();
    }

}

我只是在学习 WPF,因此任何解决这两个问题的最佳实践都将受到欢迎!

干杯,
浆果

【问题讨论】:

    标签: wpf window dynamic-controls


    【解决方案1】:

    为了动态添加按钮,您可以制作一个 ItemsControl 而不是 StackPanel,并将 ItemsSource 绑定到要为其创建按钮的列表( ObservableCollection)。您还需要一个 DataTemplate 来为您的列表定义 ItemsTemplate,以便每个项目都显示为具有所需边距和命令属性的按钮。

    这是将 ItemsControl 绑定到模板的一个很好的示例

    WPF: Example of ItemsControl bound to an ObservableCollection

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      • 2013-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多