1

作業中のアプリケーションをテストするためのスイッチ ボードとして機能するウィンドウを作成しようとしていますが、2 つの問題があります。

最初の問題は、スタック パネルに動的に追加する必要があるボタンのサイズとマージンを設定しようとすることです。XAML では、プロパティは次のようになります。

<StackPanel Name="_mainStackPanel" >
    <Button Height="Auto" Width="Auto" Margin="10,10,10,5" >Do Something</Button>
</StackPanel>

2 番目の問題はよりトリッキーです。次のように、スイッチ ボード ウィンドウに、公開されたプロパティを含むステータス バーを表示します。

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

そして、これが私の「テスト」のセットアップです(私は何も主張していません。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 を学んでいるので、これら 2 つの問題を解決することから得られるベスト プラクティスは大歓迎です!

乾杯、
ベリル

4

1 に答える 1

2

ボタンを動的に追加するには、StackPanel の代わりにItemsControlを作成し、 ItemsSourceをオブジェクトのリストにバインドして、ボタンを作成します ( ObservableCollection )。リストのItemsTemplateを定義するためのDataTemplateも必要です。これにより、各項目が必要な余白とコマンド属性を持つボタンとして表示されます。

これは、ItemsControl をテンプレートにバインドする良い例です。

WPF: ObservableCollection にバインドされた ItemsControl の例

于 2009-10-02T03:51:03.130 に答える