如何将附加参数传递给集中式事件处理程序?

时间:2009-12-11 14:43:45

标签: c# wpf events event-handling

在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);

2 个答案:

答案 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);
    }
}

您需要调整类型以满足您的需求,但它显示了一般的想法。