怎么指定button的click事件

pettyfly 2015-04-04 12:45:29
想要动态生成一组button按钮,不知道click事件要怎么加进去,求指导
xml:

<StackPanel Name="spWorkSheet" Margin="5"></StackPanel>

自定义类:

public class MyButton
{
public string btnText {get;set; }
public string btnName {get; set;}
public string btnCommand{get;set;}
}

主窗口代码实现

private void Window_Loaded(object sender, RoutedEventArgs e)
{
List<MyButton> btns = new List<MyButton>();
MyButton btn1 = new MyButton() { btnText = "Button1", btnName = "Button1", btnCommand = "Button1_Click" };
MyButton btn2 = new MyButton() { btnText = "Button2", btnName = "Button2", btnCommand = "Button2_Click" };
MyButton btn3 = new MyButton() { btnText = "Button3", btnName = "Button3", btnCommand = "Button3_Click" };
btns.Add(btn1);
btns.Add(btn2);
btns.Add(btn3);

foreach (MyButton item in btns)
{
Button btn = new Button()
{ Content = item.btnText, Name = item.btnName, Height = 30, Margin = new Thickness(30, 5, 30, 0) };
btn.Click += new RoutedEventHandler(item.btnCommand); // 这个地方不知道怎么用
spWorkSheet.Children.Add(btn);
}
}

private void Button1_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Button1 is clicked.");
}
private void Button2_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Button2 is clicked.");
}
private void Button3_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Button3 is clicked.");
}

...全文
261 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
一线光芒 2015-04-29
  • 打赏
  • 举报
回复
9楼正解...
Veary 2015-04-27
  • 打赏
  • 举报
回复
话说 就是这样吧

Button button = new Button();
            button.Background = Brushes.Aqua;
            button.Content = "+1";
            button.Width = 50;
            button.Height = 20;
            button.HorizontalAlignment = System.Windows.HorizontalAlignment.Right;
            button.VerticalAlignment = System.Windows.VerticalAlignment.Bottom;
            button.Margin = new Thickness(0,0,50,50);
            button.Click += button_Click;//button_Click是一个符合Button点击委托类型的方法,给了就行了,下边写这个方法

        private void button_Click(object sender, RoutedEventArgs e)
        {
            //do something...
        }  
subMain 2015-04-14
  • 打赏
  • 举报
回复
前台:

<StackPanel>
<TextBox Height="25" TextAlignment="Right" Text="{Binding Path=Value, Mode=TwoWay}" />
<WrapPanel x:Name="ButtonsPanel" Background="Azure" ItemWidth="50" ItemHeight="50" />
</StackPanel>


后台:

private string _value;

public string Value
{
get { return _value; }
set
{
_value = value;
OnPropertyChanged("Value");
}
}

public event PropertyChangedEventHandler PropertyChanged;

public Window1()
{
Value = "";
this.DataContext = this;
InitializeComponent();

InitializeButtons();
}

private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}

private void InitializeButtons()
{
// 动态生成9个按钮
for (int i = 1; i < 10; i++)
{
var newButton = new Button()
{
Content = i,
Width = 40,
Height = 40,
Tag = i, // 用于区分按钮
};
// 动态添加事件处理
newButton.Click += Button_Click;

ButtonsPanel.Children.Add(newButton);
}
}

// 该处理执行按钮的单击事件
private void Button_Click(object sender, RoutedEventArgs e)
{
// 取得按钮的Tag
var number = (int)((Button)sender).Tag;

Value += number.ToString();
}


thisishexiao 2015-04-14
  • 打赏
  • 举报
回复
引用 6 楼 pettyfly 的回复:
如果我把每一个button设定一个序号,在创建button的时候把这个序号赋值,在button_Click中得到这个序号,要怎么实现?
用Tag属性记录序号 btn1.Tag = 1; 然后获取 var btn = e.OriginalSource as Button; var index = btn.Tag as Int32;
pettyfly 2015-04-13
  • 打赏
  • 举报
回复
如果我把每一个button设定一个序号,在创建button的时候把这个序号赋值,在button_Click中得到这个序号,要怎么实现?
exception92 2015-04-07
  • 打赏
  • 举报
回复
引用 3 楼 pettyfly 的回复:
这样就可以了 btn.Click += new RoutedEventHandler(Button_Click);
事件不是 string类型的。 += 相当于指定事件,也就是你的Button_Click 供任何按钮使用触发使用。
thisishexiao 2015-04-07
  • 打赏
  • 举报
回复
引用 2 楼 pettyfly 的回复:
我用楼上的方法得到的btn一直是null,怎么回事?
不好意思,写错了,应该使用RoutedEventArgs参数e获取触发事件的按钮 var btn = e.OriginalSource as Button;
pettyfly 2015-04-05
  • 打赏
  • 举报
回复
这样就可以了 btn.Click += new RoutedEventHandler(Button_Click);
pettyfly 2015-04-05
  • 打赏
  • 举报
回复
我用楼上的方法得到的btn一直是null,怎么回事?
thisishexiao 2015-04-04
  • 打赏
  • 举报
回复
结构改一下,在StackPanel中设置ButtonBase.Click="Button_Click",这样StackPanel里的任何Button的Click事件都会传到StackPanel上。 然后在Handler中判断是哪个Button
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            var btn = sender as Button;
            var btnName = btn.Name;
            var msg = String.Format("{0} is clicked.", btnName);
            MessageBox.Show(msg );
        }

8,737

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧