Вопрос:
У меня есть матрица кнопок, созданная в главной сетке в окне, а также создала событие для каждого из них. У меня также есть целочисленная матрица, которая содержит некоторые свойства каждой кнопки (например, int a [1,2] является свойством для кнопки btn [1,2]). Я планирую создать нечто вроде лабиринта, на котором вы можете перейти от одной кнопки к другой, прыгая в рыцаря (из шахмат). Я не знаю, как найти координаты кнопки нажатой, чтобы я мог изменить положение текущей кнопки.
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
Я просто сумасшедшая идея… Почему бы не создать свою собственную Button и назвать ее MazeButton или что-то еще? Выведите из Button и добавьте некоторые свойства, используйте наследование.
public class MazeButton : System.Windows.Controls.Button { private int left; private int top; //rest of implementation }
Таким образом, вы можете передать информацию, в которой кнопка в вашем лабиринте находится прямо в кнопке. Вы можете определить пользовательские события и все, что вам нужно.
Ответ №2
Попробуй это:
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. } } Ответ №3
это еще один подход к проблеме. Я сохраняю каждую кнопку в списке кортежей вместо массива, а затем я ищу, где кортеж содержит кнопку с 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 } }