2009-10-02 98 views
1

我正在尝试创建一个窗口,充当测试我正在处理的应用程序的开关板,并且遇到两个问题。wpf动态窗口

第一个问题是试图设置大小为&需要动态添加到堆栈面板的按钮边距。在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); 
     } 
    } 

这里是我的“测试”的设置(我不主张什么,只是发射了图形用户界面,看它是否工作) :

[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,这样可能会出来解决这两个问题将是最欢迎的最佳做法!

干杯,
Berryl

回答

2

对于动态添加的按钮,你可以做一个的ItemsControl,而不是一个StackPanel和的ItemsSource绑定到你的事名单为(的ObservableCollection创建按钮)。您还需要DataTemplate为您的列表定义ItemsTemplate,以便每个项目都显示为具有所需边距和命令属性的按钮。

这里是一个ItemsControl绑定到一个模板

WPF: Example of ItemsControl bound to an ObservableCollection

一个很好的例子