2016-11-28 5 views
1

私は、他の場所で定義された2D配列に基づいて、ボタンを動的に追加したスタックパネルを持っています。基本的にボタンのグリッドが作成されますが、スタックパネルの子として追加されます。私ができる必要があるのは、列と行の番号に基づいて子ボタンを指定することです。ここにStackpanelがあります。WPF Stackpanelの子供の隣人を取得

<StackPanel Name="myArea" HorizontalAlignment="Center" VerticalAlignment="Center"/> 

ここにいくつかのコードがあります。

Grid values = new Grid(); 
values.Width = 320; 
values.Height = 240; 
values.HorizontalAlignment = HorizontalAlignment.Center; 
values.VerticalAlignment = VerticalAlignment.Center; 

int x = valueBoard.GetLength(0); 
int y = valueBoard.GetLength(1); 

for (int i = 0; i < x; i++) 
{ 
    ColumnDefinition col = new ColumnDefinition(); 
    values.ColumnDefinitions.Add(col); 
} 
for (int j = 0; j < y; j++) 
{ 
    RowDefinition row = new RowDefinition(); 
    values.RowDefinitions.Add(row); 
} 
for (int i = 0; i < x; i++) for (int j = 0; j < y; j++) 
{ 
    Button button = new Button(); 
    button.Content = ""; 
    button.Click += ButtonClick; 
    button.MouseRightButtonUp += RightClick; 
    Grid.SetColumn(button, i); 
    Grid.SetRow(button, j); 
    values.Children.Add(button); 
} 
myArea.Children.Add(values); 

ここで、ボタンをクリックすると、グリッド内のすべての隣接ボタンを非表示にしたいと思います。ここに私のクリックイベントです:

private void ButtonClick(object sender, RoutedEventArgs e) 
{ 
    int col = Grid.GetColumn((Button)sender); 
    int row = Grid.GetRow((Button)sender); 
    Button source = e.Source as Button; 
    source.Visibility = Visibility.Hidden; 
} 

がどのように私は、ButtonClickで、colrow値を持つネイバーボタンを非表示にしますか?これらの値を入力してネイバーのVisibilityプロパティを編集できるよりも、何らかのゲッターやセッターがありますか?

+0

いくつかのゲームを作っていますか?はいの場合は、代わりにカスタムパネルを試してください。必要に応じてサンプルが見つかります。 –

答えて

1

次のことを試してください:あなたの子供を介してこれを反復処理

private void ButtonClick(object sender, RoutedEventArgs e) 
{ 
    int col = Grid.GetColumn((Button)sender); 
    int row = Grid.GetRow((Button)sender); 
    Button source = e.Source as Button; 
    source.Visibility = Visibility.Hidden; 
    Grid pGrid = source.Parent as Grid; 
    if (pGrid == null) throw new Exception("Can't find parent grid."); 

    for (int i = 0; i < pGrid.Children.Count; i++) { 
     Button childButton = pGrid.Children[i] as Button; 
     if(childButton == null) continue; 

     int childCol = Grid.GetColumn(childButton); 
     int childRow= Grid.GetRow(childButton); 

     if(Math.Abs(childCol - col) < 2 && Math.Abs(childRow - row) < 2) childButton.Visibility = Visibility.Hidden; 
    } 
} 

、それはButtonのタイプであればrowcolumnがあなたのSourceの隣にあり、それを非表示になります場合には、チェックします。

+0

これを利用しようとすると、 'Grid.Children'セグメントの下に赤い線が表示され、'静的でないフィールド、メソッド、またはプロパティ 'Panel.Children'にオブジェクト参照が必要です。私はWPFですばらしいことではありませんが、どうすればこのことを知ることができますか? – user3066571

+0

@ user3066571:私の答えを更新しました。今はうまくいくはずです。私の例では、以前にx:Name = "Grid"で 'Grid'を使用しました。さて、ソースの親を使用して、それは私のためにうまく動作します。 – WPFGermany

+0

ありがとう、それは本当にうまくいった。 – user3066571

関連する問題