wpf动态窗口

wpf动态窗口,wpf,window,dynamic-controls,Wpf,Window,Dynamic Controls,我试图创建一个窗口,作为测试我正在开发的应用程序的开关板,但在这样做时遇到了两个问题 第一个问题是试图设置需要动态添加到堆栈面板的按钮的大小和边距。在XAML中,属性如下所示: <StackPanel Name="_mainStackPanel" > <Button Height="Auto" Width="Auto" Margin="10,10,10,5" >Do Something</Button> </StackPanel> 下面是

我试图创建一个窗口,作为测试我正在开发的应用程序的开关板,但在这样做时遇到了两个问题

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

<StackPanel Name="_mainStackPanel" >
    <Button Height="Auto" Width="Auto" Margin="10,10,10,5" >Do Something</Button>
</StackPanel>
下面是我的“测试”中的设置(我没有断言任何东西,只是启动gui,看看它是否工作):

[TestFixture]
公共类交换板测试
{
专用配电盘视图\u配电盘;
私人应用程序(app),;
[设置]
公共作废设置(){
var命令=新列表{
新的StatusCommand(“你好…”,_交换机),
新的状态命令(“再见…”,_交换机),
};
_配电盘=新的配电盘视图(命令);
}
类StatusCommand:DisplayCommand
{
专用只读交换板视图_视图;
公共状态命令(字符串消息,开关板视图):基本(消息){
_视图=视图;
}
public override void Execute(){u view.Status=DisplayText;}
}
[测试]
公共空间显示(){
_app=新应用程序();
_应用程序运行(_交换机);
//_switcher.Show();
}
}
我只是在学习WPF,所以任何解决这两个问题的最佳实践都是非常受欢迎的

干杯,

Berryl

对于按钮的动态添加,您可以创建一个项目控件来代替StackPanel,并将项目资源绑定到要为(ObservableCollection创建按钮的列表中。您还需要一个DataTemplate来为列表定义ItemsTemplate,以便每个项目都显示为一个按钮,带有所需的边距和命令属性

下面是一个将ItemsControl绑定到模板的好例子

<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; }
}
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);
        }
    }
[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();
    }

}