2016-11-21 1 views
0

У меня есть окно, в котором я в основном строил тральщик гетто. У меня есть сетка, в которую я коршу зубчатый массив, настроенный так, чтобы он адаптировался к любым изменениям в размере массива (без значений жесткого набора или строк/столбцов). Более того, у меня есть сетка пустых кнопок, которая просто адаптируется по размеру к сетке ниже.WPF C# Получить позицию решетки кнопки сетки из события Click

Когда вы нажимаете кнопку, он скрывает раскрывающееся значение под ним, и мне нужно каким-то образом вернуть позицию нажатой кнопки, поэтому я могу сравнить ее с оригинальным массивом с зубцами, чтобы узнать, не был ли этот элемент бомбить. (это также помогло бы мне выполнить действие заполнения пустых плит). Но, учитывая, как я его настроил, Grid.GetRow или Grid.GetColumn просто возвращают 0.

Кто-нибудь знает, как я могу получить позицию массива (предпочтительно строку и столбец) из настроек, которые у меня есть?

XAML Ниже следуют события C# click.

<Window x:Class="MinesweeperWPF.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Minesweeper" SizeToContent="WidthAndHeight" Height="Auto" Width="Auto"> 
    <Window.Resources> 
     <DataTemplate x:Key="Buttons_Template"> 
      <Button Content="" 
        Height="20" 
        Width="20" 
        Margin="0,0,0,0" 
        Visibility="Visible" 
        Click="ButtonClick" 
        MouseRightButtonUp="RightClick"/> 
     </DataTemplate> 
     <DataTemplate x:Key="DataTemplate_2"> 
      <TextBlock Text="{Binding}" 
          Height="20" 
          Width="20" 
          Margin="0,0,0,0" 
          FontFamily="Rockwell" 
          HorizontalAlignment="Center" 
          VerticalAlignment="Center" 
          Padding="5"/> 
     </DataTemplate> 
     <DataTemplate x:Key="DataTemplate_1"> 
      <ItemsControl ItemsSource="{Binding}" ItemTemplate="{DynamicResource DataTemplate_2}"> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <StackPanel Orientation="Horizontal"/> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
      </ItemsControl> 
     </DataTemplate> 
     <DataTemplate x:Key="Buttons_Template2"> 
      <ItemsControl ItemsSource="{Binding}" ItemTemplate="{DynamicResource Buttons_Template}"> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <StackPanel Orientation="Horizontal"/> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
      </ItemsControl> 
     </DataTemplate> 
    </Window.Resources> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 
     <Grid> 
      <TextBlock x:Name="RemainingMines" HorizontalAlignment="Left" /> 
      <TextBlock x:Name="Difficulty" HorizontalAlignment="Center" /> 
      <TextBlock x:Name="Timer" HorizontalAlignment="Right" /> 
     </Grid> 
     <Grid Name="ResetButton" Grid.Row="1"> 
      <Button Name="Reset" Content="Reset"/> 
     </Grid> 
     <Grid Name="GridBoard" ShowGridLines="True" Grid.Row="2"> 
      <ItemsControl x:Name="GridItems" ItemTemplate="{DynamicResource DataTemplate_1}"/> 
     </Grid> 
     <Grid Name="ButtonsBoard" ShowGridLines="True" Grid.Row="2"> 
      <ItemsControl x:Name="ButtonItems" ItemTemplate="{DynamicResource Buttons_Template2}"/> 
     </Grid> 
    </Grid> 
</Window> 

Нажмите методы в C#

private void ButtonClick(object sender, RoutedEventArgs e) 
{ 
    int col = Grid.GetColumn((Button)sender); //this just returns 0 
    int row = Grid.GetRow((Button)sender); //this just returns 0 
    Button source = e.Source as Button; 
    source.Visibility = Visibility.Hidden;   
    Console.WriteLine("L: {0} x {1}", col, row); //prints L: 0 x 0 
} 
private void RightClick(object sender, RoutedEventArgs e) 
{ 
    int col = Grid.GetColumn((Button)sender); //this just returns 0 
    int row = Grid.GetRow((Button)sender); //this just returns 0 
    Button source = e.Source as Button; 
    if(source.Content.Equals("")) 
    { 
     source.Content = "\u2691"; 
    } 
    else 
    { 
     source.Content = ""; 
    } 
    Console.WriteLine("R: {0} x {1}", col, row); //prints R: 0 x 0 
} 

Любая помощь будет оценена по этому вопросу.

+0

Вы пробовали 'e.Source, как UIElement' вместо' Button'? – Searching

+0

Вы знакомы с MVVM? и не могли бы вы представить картину того, чего вы хотите достичь? –

+0

var index = Array.FindIndex (Array, x => x == buttonClicked), может ли это работать? Затем верните индекс? – JohnChris

ответ

0

Вам нужно использовать соответствующий элемент управления для кнопок для размещения. В вашем xaml вы используете элементы управления внутри Grid. Но элемент управления не имеет индекса строки и столбца. Вот почему вы не можете получить индекс. Используйте UniformGrid или соответствующий элемент управления.

Вы можете обратиться в этой статье

https://stackoverflow.com/a/13588066/5273015

Поможет вам много других заданий, а