C#如何通过字符串为动态生成的Button绑定对应Click事件处理函数
解决方案
方案1:使用System.Reflection实现按方法名字符串绑定事件
你需要通过反射获取对应名称的方法实例,再转成对应事件的委托绑定即可,修改你的循环代码如下:
using System.Reflection; // 首先引入命名空间 for (int n=0;n<10;n++) { Button btn = new Button(); btn.Name = "AAA_"+n.ToString(); btn.HorizontalAlignment = HorizontalAlignment.Stretch; btn.VerticalAlignment = VerticalAlignment.Stretch; btn.Content = "BBB_"+n.ToString(); btn.BorderBrush = new SolidColorBrush(Windows.UI.Colors.Black); btn.BorderThickness = new Thickness(1); btn.Foreground = new SolidColorBrush(Windows.UI.Colors.Black); btn.Visibility = Visibility.Visible; // 反射绑定事件逻辑 string Btn_ClickTemp = "Btn_Click"+n.ToString(); // 获取当前类的私有实例方法 MethodInfo methodInfo = this.GetType().GetMethod(Btn_ClickTemp, BindingFlags.Instance | BindingFlags.NonPublic); if (methodInfo != null) { // 将方法转为RoutedEventHandler委托 RoutedEventHandler handler = (RoutedEventHandler)Delegate.CreateDelegate(typeof(RoutedEventHandler), this, methodInfo); btn.Click += handler; } }
注意点:
- 必须指定
BindingFlags.Instance | BindingFlags.NonPublic参数,才能匹配到你声明的private实例方法 - 要保证拼接出来的方法名和你实际定义的处理函数名完全一致,否则会找不到方法
方案2:更推荐的统一事件处理方案(无需反射)
如果不需要严格要求每个按钮对应独立的处理函数,更建议使用同一个事件处理函数,通过按钮的Name或Tag区分触发源,性能更优且维护成本更低:
循环绑定代码:
for (int n=0;n<10;n++) { Button btn = new Button(); btn.Name = "AAA_"+n.ToString(); // 其余属性赋值逻辑不变 btn.Click += Btn_CommonClick; // 所有按钮绑定同一个处理函数 }
统一处理函数:
private void Btn_CommonClick(object sender, RoutedEventArgs e) { Button btn = sender as Button; if (btn == null) return; // 根据按钮名称区分处理逻辑 switch (btn.Name) { case "AAA_0": // 原Btn_Click0的逻辑写在这里 break; case "AAA_1": // 原Btn_Click1的逻辑写在这里 break; // 其余case按需添加 default: break; } }
内容的提问来源于stack exchange,提问作者Yichao
相关产品推荐
相关产品推荐

