2016-11-28 15 views
1

У меня есть стек, в который я добавляю динамически добавленные кнопки на основе 2D-массива, определенного в другом месте. Поэтому по существу он создает сетку кнопок, но добавляется как дочерние элементы стекапанели. Что мне нужно сделать, это указать дочернюю кнопку на основе номера столбца и строки. Вот стопка.WPF Get Stackpanel children neighbors

<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, скрыть соседние кнопки с col и row ценности? Есть ли какой-то геттер или сеттер, чем я могу передать эти значения и редактировать свойство соседа 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: обновил свой ответ. теперь он должен работать. В моем примере я раньше использовал «Grid» с x: Name = «Grid». Теперь, используя исходный родитель, он отлично работает для меня. – WPFGermany

+0

Спасибо, это сработало очень хорошо. – user3066571