2016-11-21 25 views
0

Ich habe ein Fenster, das ich Ghetto Minesweeper im Grunde bauen bin. Ich habe ein Raster, dass ich ein gezacktes Array in, füttern, so dass es sich an jede Änderung anpassen wird in der Größe des Arrays (keine festen Werte oder Zeilen/Spalten). Darüber hinaus habe ich ein Raster aus leeren Knöpfen, das sich einfach an das darunter liegende Raster anpasst.WPF C# Array-Position der Grid-Schaltfläche von Click Event

Wenn Sie auf eine Schaltfläche klicken, verbirgt es den Wert darunter, und ich brauche eine Möglichkeit, um die Position der Schaltfläche geklickt zurückzugeben, so dass ich mit dem ursprünglichen gezackten Array vergleichen kann, ob das Element a war Bombe. (Dies würde mir auch helfen, eine Füllaktion auf leeren Kacheln auszuführen). Aber wie ich es eingerichtet habe, geben die Grid.GetRow oder Grid.GetColumn nur 0 zurück.

Weiß jemand, wie ich die Array-Position (vorzugsweise Zeile und Spalte) aus dem Setup, das ich habe, bekommen kann?

XAML Unten folgen die C# -Klick-Ereignisse.

<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> 

Klicken Sie Methoden in 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 
} 

Jede mögliche Hilfe auf diesem geschätzt.

+0

Haben Sie versucht, 'e.Source als UIElement' anstelle des' Button'? – Searching

+0

Kennen Sie MVVM? und, könnten Sie ein Bild von dem machen, was Sie erreichen wollen? –

+0

var index = Array.FindIndex (Array, x => x == buttonClicked), könnte das funktionieren? Dann den Index zurückgeben? – JohnChris

Antwort

0

Sie müssen die entsprechende Steuerung für die zu hostenden Schaltflächen verwenden. In Ihrem XAML verwenden Sie die Elementsteuerung in Grid. Das Items-Steuerelement hat jedoch keinen Zeilen- und Spaltenindex. Deshalb können Sie den Index nicht bekommen. Verwenden Sie UniformGrid oder ein entsprechendes Steuerelement.

können Sie beziehen sich dieser Artikel

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

Sie auch eine Menge anderer Aufgaben wird helfen