大きさを固定したGridを使うことが多く、動的にGridに行を追加する方法がわからず試行錯誤してしまった。
簡単なことだけどメモ。
XAMLにはColumnDefinitionをして行は1個だけ入れておく。
Gridにはコードからアクセスできるように名前を付ける。
<ScrollViewer> <StackPanel> <Grid Name="mygrid"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> </Grid> </StackPanel> </ScrollViewer>
code behindではColumnごとのデータを作り、行はカウントアップ。ここでは自分で定義したクラスのメンバーをLabelで受けてGridに追加しているつもり。
最後にRowDefinitionsのAddメソッドでRowDefinitionを追加。
public MainWindow() { InitializeComponent(); MyPacket mp = new MyPacket(); for (int i = 0; i < 10; i++) { Label lbl = new Label(); lbl.Content = mp.Number; mygrid.Children.Add(lbl); Grid.SetColumn(lbl, 0); Grid.SetRow(lbl, i); lbl = new Label(); lbl.Content = mp.DateTime; mygrid.Children.Add(lbl); Grid.SetColumn(lbl, 1); Grid.SetRow(lbl, i); mygrid.RowDefinitions.Add(new RowDefinition()); }
Windows Formsの系統には、DataGridViewという便利なクラスがある。
スプレッドシート風なGUIを簡単に実現できる。WPFでこれを使用するには参照の追加で、System.Windows.Formsを追加しなければならない。
また、これをusingに追加すると、Labelのように同名のクラスがある場合にはあいまいになり、Controls.LabelとかForms.Labelとか指定する必要が出てくる。