2009-12-11 100 views
1

在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上调用它们,我称它们为,当事件处理程序仅仅处于每个窗口的代码隐藏。

我该如何注入一个窗口对象到事件处理程序,以便该事件处理程序可以直接操纵它,像这样:

ButtonEdit.Click += EventFactory.Button_Edit_Click(this); 

回答

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

你需要适应的类型,以满足您的需求,但它显示了总体思路。

+0

感谢您的代码,运作良好,因为它是一个简单有用的模式将事件移出代码 – 2009-12-14 08:19:26

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"); 
} 

我不是特别喜欢这两种方法,但你去那里。

+0

不应该第一种方法是'ButtonEdit.Click + = EventFactory.ForConsumer(window1Instance).Button_Edit_Click;'? – 2009-12-11 14:54:21

+0

我尝试了这两种方法,但在(1)上我不需要通过Type “Page1”,我可以调用静态方法,但是我需要Page1本身的*实例*,所以我可以改变其Title属性。在(2)中我实际上使用UserControls,而不是Windows,并且我无法找到UserControl的Window.GetWindow(...)的等价物。 – 2009-12-11 15:20:12

+0

@Joao:是的,这就是我的意思 - 谢谢。得到了大脑的泛型;) – 2009-12-11 15:52:13

相关问题