我正在嘗試使用wpf來製作掃雷遊戲。我設計的遊戲板爲用下面的代碼按鈕的網格:獲取由一個ItemsControl填充的Grid和Colum位置
<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.我認爲這是因爲網格只包含一個ItemsControl。如何獲得有意義的行和列值,同時仍然允許動態網格大小?
ItemsControl的子項不是網格的直接子元素。您可以整天給它們使用Grid.Row和Grid.Column值,並且它不會起作用,因爲它們不是定義了多行和多列的Grid的子項。相反,它們是由'ItemsPanelTemplate'創建的StackPanel的子項。沒有網格。只有StackPanel。你想在這裏做什麼? –
由於網格不會提供索引,我想從ItemsControls獲取索引。點擊事件處理程序知道哪個按鈕被按下,我只是不知道如何詢問ItemsControl的位置。 – Kevlarz