динамическое окно wpf - PullRequest
       15

динамическое окно wpf

1 голос
/ 02 октября 2009

Я пытаюсь создать окно, которое будет действовать в качестве коммутационной панели для тестирования приложения, над которым я работаю, и у меня две проблемы при этом.

Первая проблема - попытаться установить размер и поле кнопок, которые нужно динамически добавлять на панель стека. В 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

1 Ответ

2 голосов
/ 02 октября 2009

Для динамического добавления кнопок вы можете создать ItemsControl вместо StackPanel и связать ItemsSource с вашим списком вещей для создания кнопок ( ObservableCollection ). Вам также понадобится DataTemplate , чтобы определить ItemsTemplate для вашего списка, чтобы каждый элемент отображался в виде кнопки с требуемым полем и атрибутом команды.

Вот хороший пример привязки ItemsControl к шаблону

WPF: пример ItemsControl, привязанного к ObservableCollection

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...