0

我在窗口的主网格中创建了一个按钮矩阵,并且还为每个按钮创建了事件。我还有一个整数矩阵,其中包含每个按钮的一些属性(例如,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)
    {

    }
4

3 回答 3

0

我只是想了一个疯狂的想法...为什么不自己制作Button并调用它MazeButton,或者其他什么?派生Button并添加一些属性,利用继承。

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

//rest of implementation

}

通过这种方式,您可以将迷宫中按钮所在的信息直接传递到按钮中。您可以定义自定义事件和您想要的任何其他内容。

于 2013-03-22T15:07:59.153 回答
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.
         }
    }
于 2013-03-22T15:10:23.537 回答
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
        }
   }
于 2013-03-22T15:17:57.130 回答