【问题标题】:C# - Adding an Event Handler for all instances of a classC# - 为类的所有实例添加事件处理程序
【发布时间】:2011-04-05 06:20:09
【问题描述】:
我必须在 WPF 中的表单中添加未知数量的按钮(它实际上是一个动态加载元素的工具箱)。我正在寻找一种方法来为所有这些实例创建一个事件处理程序。这可能吗?而且它们不仅仅是按钮,它是一个继承 Button 类并具有其他一些成员变量的类。我是否能够在每个实例的此类事件处理程序中访问这些变量。如果它有帮助或在某种程度上相关,我不得不说我不知道 C# 中的代表是什么。
非常感谢
【问题讨论】:
标签:
c#
events
button
event-handling
instance
【解决方案1】:
您可以将同一个事件处理程序附加到许多事件。
例如:
var handler = new MyEventHandler(MyMethod);
obj1.MyEvent += handler;
obj2.MyEvent += handler;
obj3.MyEvent += handler;
【解决方案2】:
您可以根据需要实现一个类工厂类来实例化和配置每个按钮实例(在您的情况下添加事件处理程序关联)。这将允许您在一个地方编写配置代码,并确保每次都使用正确的设置实例化按钮。
【解决方案3】:
回答我自己的问题是多么愚蠢。我是这样想的:我可以在类本身中为所有实例添加事件处理程序。呸!!代码如下:
public class Tool_Button:Button{
public String tool_name;
public Tool_Button(String toolname) {
this.Width = 32;
this.Height = 32;
this.BorderBrush = Brushes.Gray;
tool_name = toolname;
this.Background = new ImageBrush(new BitmapImage(new Uri(tool_name)));
this.Click += new RoutedEventHandler(Tool_Button_Click);
}
void Tool_Button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show(tool_name);
}
}
【解决方案4】:
是的,假设方法/属性是公开的,您应该能够访问派生按钮类上的自定义属性。事件处理程序的方法签名很可能包括 Handler(object sender, EventArgs e) ,在这种情况下,您可以将 sender 强制转换为派生按钮的类型。