2013-03-22 11 views
0

У меня есть матрица кнопок, созданная в главной сетке в окне, а также созданная для каждого из них событие. У меня также есть целочисленная матрица, которая содержит некоторые свойства каждой кнопки (например, int a [1,2] является свойством для кнопки btn [1,2]). Я планирую создать что-то вроде лабиринта, на котором вы можете переходить только от одной кнопки к другой, прыгая в рыцаря (из шахмат). Я не знаю, как найти координаты кнопки нажатой, чтобы я мог изменить положение текущей кнопки.C# WPF-массив кнопок, координаты кнопок

Button[,] btn = new Button[25, 25]; 
     for (x = 5; x <= n; x++) 
     { 
      for (y = 5; y <= n; y++) 
      { 
       btn[x, y] = new Button(); 
       left += 72; 
       btn[x,y].Margin =new Thickness(left,top,0,0); 
       btn[x,y].Height = 32; 
       btn[x,y].Width = 32; 
       btn[x, y].Click += new RoutedEventHandler(btn_Click); 

       if (a[x, y] == 2) 
        btn[x,y].Background = Brushes.Red; 
       else 
        btn[x,y].Background = Brushes.Blue; 
       main.Children.Add(btn[x, y]); 


      } 
      left = 0; 
      top += 72; 
     } 

    } 
    private void btn_Click(object sender, RoutedEventArgs e) 
    { 

    } 
+1

в btn_Click() вы можете сделать это: кнопка btn = (кнопка) отправителя; – Dilshod

+0

@Dilshod True, но для того, чтобы быть в безопасности 'Button btn = sender as Button;', если отправитель не является кнопкой, вместо генерируемого исключения будет возвращен 'null'. –

+1

Уверен, что вы правы. Или вы можете сначала проверить: if (отправитель - Button) {// затем бросить} – Dilshod

ответ

0

Я просто пойти сумасшедшую идею ... Почему бы не сделать свой собственный Button и назвать его MazeButton, или что-то? Вывести из Button и добавить некоторые свойства, использовать наследование.

public class MazeButton : System.Windows.Controls.Button { 
private int left; 
private int top; 

//rest of implementation 

} 

Таким образом вы можете передать информацию, в которой кнопка в вашем лабиринте находится прямо в кнопке. Вы можете определить пользовательские события и все, что вам нужно.

0

Попробуйте это:

private void btn_Click(object sender, RoutedEventArgs e) 
    { 

     Button btn = sender as Buttonl; 
     if(btn!=null) 
     { 
      Point renderedLocation = btn.TranslatePoint(new Point(0, 0), this); 
     } 
     else 
     { 
       //you may throw an exception if you want. 
     } 
    } 
+0

Здесь вы делаете две роли, сначала проверяете, является ли отправитель кнопкой, а затем снова, когда вы отбрасываете ее на кнопку. Вы можете использовать как и проверить значение null, в результате чего один из них. – Default

+0

Надеюсь, это будет достаточно хорошо. – Dilshod

+0

почти. Это не скомпилировалось :) (вы забыли ';' after 'as Button1' и' Button1', вероятно, должны быть 'Button'). Если целью 'else' является исключение, вы также можете сделать« Button btn = (Button) sender; », который будет генерировать исключение, если отправитель не является« Button »- это то, что я бы предпочел , Но другие могли бы больше любить «как кнопку». – Default

0

это еще один Approch проблемы. Я сохраняю каждую кнопку в списке кортежей вместо массива, а затем я ищу, где кортеж содержит кнопку с Linq.

Предполагается, что вы находитесь в .NET 4. Если нет, класс Tuple может быть записан (вы можете найти его на SO).

private List<Tuple<Button, Int32, Int32>> listButton; 
    private void SetButtons() 
    { 
     // TODO define what is n, left, top 

     listButton = new List<Tuple<Button, int, int>>(); 

     for (int x = 5; x <= n; x++) 
     { 
      for (int y = 5; y <= n; y++) 
      { 
       Button btn = new Button(); 
       left += 72; 
       btn.Margin = new Thickness(left, top, 0, 0); 
       btn.Height = 32; 
       btn.Width = 32; 
       btn.Click += new RoutedEventHandler(btn_Click); 

       if (a[x, y] == 2) 
        btn.Background = Brushes.Red; 
       else 
        btn.Background = Brushes.Blue; 

       listButton.Add(new Tuple<Button, int, int>(btn, x, y)); 

       main.Children.Add(btn); 
      } 
      left = 0; 
      top += 72; 
     } 
    } 

    private void btn_Click(object sender, RoutedEventArgs e) 
    { 
     Button button = (Button)sender; 

     var tuple = listButton.Where(t => t.Item1 == button).FirstOrDefault(); 

     if (tuple != null) 
     { 
      Int32 x = tuple.Item2; 
      Int32 y = tuple.Item3; 

      // Do whay you want this x and y found 
     } 
    } 
Смежные вопросы