wpfを使用して地雷探偵ゲームを作成しようとしています。グリッドの行と列の位置をItemsControlによって設定します。
<Window.Resources>
<DataTemplate x:Key="DataTemplateLevel2">
<Button Content="{Binding}" Height ="30" Width="40" Click ="Execute"/>
</DataTemplate>
<DataTemplate x:Key ="DataTemplateLevel1">
<ItemsControl ItemsSource ="{Binding}" ItemTemplate="{DynamicResource DataTemplateLevel2}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</DataTemplate>
</Window.Resources>
<Grid>
<ItemsControl x:Name ="Field" ItemTemplate="{DynamicResource DataTemplateLevel1}" />
</Grid>
と
List<List<int?>> buttonGrid = new List<List<int?>>();
for (int r = 0; r < Rows; r++)
{
buttonGrid.Add(new List<int?>());
for (int c = 0; c < Cols; c++)
{
buttonGrid[r].Add(null);
}
}
InitializeComponent();
Field.ItemsSource = buttonGrid;
:私は、次のコードを使用して、ボタンのグリッドとしてゲームボードを設計しました。
問題は、ボタンをクリックすると、イベントハンドラがボタンの行と列を知る必要がありますが、Grid.GetRow
とGrid.GetColumn
は常に0を返します。これは、グリッドに1つのItemsControlしか含まれていないためです。ダイナミックグリッドサイズを許可しながら、有意な行と列の値を取得するにはどうすればよいですか?
グリッドの子は、直接ItemsControlの子ではありません。それらにGrid.RowとGrid.Columnの値を一日中与えることができ、複数の行と列が定義されているグリッドの子ではないため、何の効果もありません。代わりに、あなたの 'ItemsPanelTemplate'によって作成されたStackPanelの子です。グリッドはありません。 StackPanelのみ。ここで何をしようとしていますか? –
グリッドはインデックスを提供しないので、ItemsControlsからインデックスを取得したいと考えています。クリックイベントハンドラは、どのボタンが押されたかを知っていますが、ItemsControlにその位置を問い合わせる方法はわかりません。 – Kevlarz