我在窗口的主网格中创建了一个按钮矩阵,并为每个按钮创建了事件。 我还有一个整数矩阵,其中包含每个按钮的一些属性(例如,int [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)
{
}
答案 0 :(得分:0)
我只是疯狂的想法...为什么不制作自己的Button
并将其称为MazeButton
,或者其他什么?
从Button
派生并添加一些属性,使用继承。
public class MazeButton : System.Windows.Controls.Button {
private int left;
private int top;
//rest of implementation
}
通过这种方式,您可以将迷宫中按钮所在的信息直接传递到按钮中。您可以定义自定义事件以及您想要的任何其他事件。
答案 1 :(得分: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.
}
}
答案 2 :(得分:0)
这是问题的另一个问题。我将每个按钮存储在一个元组列表而不是一个数组中,然后我搜索哪个元组包含带有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
}
}