2009-12-11 52 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

相關問題