C#WPF按钮数组,按钮坐标

时间:2013-03-22 14:48:49

标签: c# button wpf-controls

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

    }

3 个答案:

答案 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
        }
   }