динамическое окно wpf
-
19-09-2019 - |
Вопрос
Я пытаюсь создать окно, которое будет выступать в качестве переключателя для тестирования приложения, над которым я работаю, и у меня возникают две проблемы.
Первая проблема заключается в попытке установить размер и поля кнопок, которые необходимо динамически добавлять на панель стека.В 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, поэтому любые лучшие практики, которые могут возникнуть в результате решения этих двух проблем, будут приветствоваться!
Ваше здоровье,
Беррил
Решение
Для динамического добавления кнопок вы можете создать Элементы управления вместо StackPanel и привяжите ПредметыИсточник в свой список вещей, для которых нужно создать кнопки (ObservableCollection).Вам также понадобится Шаблон данных определить ПредметыШаблон для вашего списка, чтобы каждый элемент отображался в виде кнопки с нужным вам полем и атрибутом команды.
Вот хороший пример привязки ItemsControl к шаблону.
ВПФ:Пример ItemsControl, привязанного к ObservableCollection