我正在尝试创建一个窗口作为开关板来测试我正在处理的应用程序,并且遇到两个问题。
第一个问题是尝试设置尺寸&需要动态添加到堆栈面板的按钮边距。在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; }
}
在我正在研究的测试用例中,我只想让每个按钮在点击时在状态栏中显示它的文本内容。调用click会得到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,所以欢迎解决这两个问题的最佳实践!
干杯,
Berryl
答案 0 :(得分:2)
对于动态添加按钮,您可以创建 ItemsControl 而不是StackPanel,并将 ItemsSource 绑定到您创建按钮的事物列表(的ObservableCollection 强>)。您还需要 DataTemplate 来为列表定义 ItemsTemplate ,以便每个项目都显示为具有所需边距和命令属性的按钮。
以下是将ItemsControl绑定到模板
的一个很好的示例WPF: Example of ItemsControl bound to an ObservableCollection