在WPF应用程序中,我在一个类中集中了事件,如下所示:
public class EventFactory
{
public static void Button_Edit_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("you clicked edit");
}
public static void Button_Add_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("you clicked add");
}
}
这样我就可以在很多 Windows 中重复使用,如下所示:
public Window1()
{
InitializeComponent();
ButtonEdit.Click += EventFactory.Button_Edit_Click;
ButtonAdd.Click += EventFactory.Button_Add_Click;
}
这很好用,但现在我希望事件在Windows上进行操作,当事件处理程序只是在每个窗口的代码隐藏中时,我能够做到这一点。< / p>
我该怎么做?将一个窗口对象注入事件处理程序,以便该事件处理程序可以直接操作它,如下所示:
ButtonEdit.Click += EventFactory.Button_Edit_Click(this);
答案 0 :(得分:2)
一种方式:
ButtonEdit.Click += EventFactory.ForConsumer<Window1>().Button_Edit_Click;
换句话说,将工厂类转换为基于某些上下文创建对象的实际工厂。在这种情况下,上下文是消耗事件的对象。
另一种方式:
public static void Button_Edit_Click(object sender, RoutedEventArgs e)
{
Window window = Window.GetWindow(sender as DependencyObject);
MessageBox.Show("you clicked edit");
}
我不是特别喜欢这两种方法,但你去了。
答案 1 :(得分:1)
您可以尝试这样的事情:
public class CommonEventHandler
{
private CommonEventHandler() { }
private object Context { get; set; }
public static EventHandler CreateShowHandlerFor(object context)
{
CommonEventHandler handler = new CommonEventHandler();
handler.Context = context;
return new EventHandler(handler.HandleGenericShow);
}
private void HandleGenericShow(object sender, EventArgs e)
{
Console.WriteLine(this.Context);
}
}
class Program
{
static void Main(string[] args)
{
EventHandler show5 = CommonEventHandler.CreateShowHandlerFor(5);
EventHandler show7 = CommonEventHandler.CreateShowHandlerFor(7);
show5(null, EventArgs.Empty);
Console.WriteLine("===");
show7(null, EventArgs.Empty);
}
}
您需要调整类型以满足您的需求,但它显示了一般的想法。