web-dev-qa-db-ja.com

ランタイム中に特定のグリッド行とセルにWPFコントロールを追加する方法は?

WPFの "ウィンドウ"に次のグリッドがあります(クラスはウィンドウです)。

<Grid Name="RequiredGrid">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="70" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
        </Grid>

ウィンドウに渡されたものに応じて、このグリッドに一度に1行ずつアイテムを追加したいと思います。つまり、左側の列にラベルを追加し、右側の列にテキストボックスを追加します。新しいコードを保持するために新しい行を追加する方法を知っていると私は信じています。

RequiredGrid.RowDefinitions.Add(new RowDefinition());

問題は、LabelとTextBoxを作成した後です。

Label AttrLabel = new Label();
TextBox AttrTextBox = new TextBox();

それをウィンドウに入れて表示する方法が本当にわかりません。私はこのようなことをするいくつかのスレッドを見てきました:

this.Controls.Add(AttrLabel);
this.Controls.Add(AttrTextBox);

これには2つの問題があります。 1)私のWindowクラスには、この "Controls"プロパティなどはありません。 2)これは、各UIアイテムの行と列を指定するのに役立ちません。

XAMLでは、次のような行と列を簡単に指定できます。

 <Label Grid.Column="0" Grid.Row="0"/>

これは、ここでの私の意図の「ダイナミックさ」を無効にします。動的に作成したUI要素をウィンドウに表示し、グリッドに表示する行と列を指定する方法を誰かが知っていますか?.

21
Ultratrunks

Grid.RowおよびGrid.Columnプロパティは 添付プロパティ であり、通常の.netプロパティのように設定されていません。コードからそれらを設定する正しい方法は次のとおりです。

Grid.SetRow(someLabel, 0);
Grid.SetColumn(someLabel, 0);

グリッドオブジェクトのChildrenコレクションに追加する前または後にこれを行うことができるはずですが、コントロールを追加する前にこれらを設定すると、ちらつきを防ぐことができます。

31
Chris Shain
  • 行ったようにグリッド(_<yourGrid>_)と行定義を作成します。
  • コントロールを作成します(_<yourcontrol>_)。次に、グリッドのColumnSpanとRowを設定します。

    Grid.SetColumnSpan(<yourControl>, 3); Grid.SetRow(<yourControl>, 0);

  • 次に、作成したグリッドにコントロールを追加します

    <yourGrid>.Children.Add(<yourControl>);

19
Alex Curtis