3

我有几个按钮,我将它们放入 wrapPanel 循环中:

        for (int i = 0; i < wrapWidthItems; i++)
        {
            for (int j = 0; j < wrapHeightItems; j++)
            {
                Button bnt = new Button();
                bnt.Width = 50;
                bnt.Height = 50;
                bnt.Content = "Button" + i + j;
                bnt.Name = "Button" + i + j;
bnt.Click += method here ?
                wrapPanelCategoryButtons.Children.Add(bnt);
            }
        }

我想知道单击了哪个按钮并为每个按钮做一些不同的事情。例如生病有方法

private void buttonClicked(Button b)

生病发送点击按钮,检查类型,名称或ID,然后做一些事情。那可能吗?

4

3 回答 3

3

将此添加到您的循环中:

bnt.Click += (source, e) =>
{
    //type the method's code here, using bnt to reference the button 
};

Lambda 表达式允许您在代码中嵌入匿名方法,以便您可以访问本地方法变量。你可以在这里阅读更多关于它们的信息。

于 2012-07-27T12:22:29.683 回答
3

您连接到事件的所有方法都有一个参数sender,它是触发事件的对象。因此,在您的情况下,发送者单击了 Button 对象。你可以像这样投射它:

void button_Click(Object sender, EventArgs e)
{
    Button buttonThatWasClicked = (Button)sender;
    // your code here e.g. call your method buttonClicked(buttonThatWasClicked);
}
于 2012-07-27T12:22:50.633 回答
1

再次感谢您的回复 - 两者都有效。有完整的代码,也许其他人将来可能需要它

    for (int i = 0; i < wrapWidthItems; i++)
    {
        for (int j = 0; j < wrapHeightItems; j++)
        {
            Button bnt = new Button();
            bnt.Width = 50;
            bnt.Height = 50;
            bnt.Content = "Button" + i + j;
            bnt.Name = "Button" + i + j;
            bnt.Click += new RoutedEventHandler(bnt_Click);
           /* bnt.Click += (source, e) =>
            {
                MessageBox.Show("Button pressed" + bnt.Name);
            };*/
            wrapPanelCategoryButtons.Children.Add(bnt);
        }
    }

}

void bnt_Click(object sender, RoutedEventArgs e)
{

    Button buttonThatWasClicked = (Button)sender;
    MessageBox.Show("Button pressed " + buttonThatWasClicked.Name);

}

顺便说一句,我想知道是否可以(使用 wrapPanel)将按钮移动到另一个位置?我的意思是当我单击并拖动按钮时将能够在 wrappanel 中做到这一点?

于 2012-07-27T12:33:44.743 回答