2011-09-08 87 views
1

我有一個我正在研究的程序,有多個窗口。這些窗口在功能上是相似的,我希望有一個事件處理程序來覆蓋應用程序中每個窗口的按鈕按下事件。這可能嗎?跨多個窗口的XAML C#功能

回答

1

如果您需要在代碼後面綁定一個處理程序,您可以通過委託封裝一個處理程序,並注入到所需的Windows中。

例如使用Action<T>

Action<string> commonHandler = (parameter) => 
    { 
     // handler code here 
    }; 


class MyWindiow 
{ 

    public MyWindiow(Action<string> handler) 
    { 
     // store to local and assign to button click 
     // button.CLick += (o, e) => { handler(parameterToBepassed); } 
    } 
} 
+0

項目中的哪個文件應該放置操作代碼? – Will

+0

@威爾:它取決於你的項目結構,以及是否有人手動創建一些窗口。 – sll

+0

這些窗口都是在設計時創建的。我希望有一個解決方案可以讓我在某個地方放置一個函數,比如app.xaml.cs文件,我甚至不知道它是什麼或者它做了什麼,並根據需要在窗口中調用它。我認爲這與我想要的接近,但我仍然不確定如何實施它。 – Will

0

我會考慮使用一個框架,以幫助你在這裏。我的最愛是Prism v4

如果你按照M-V-VM的設計模式,你的生活將會變得更加簡單。你需要了解Data Binding and DataContext


話雖這麼說,如果你決定走這條路,你可以每個窗口綁定到一個命令:

<Button Command="{Binding DoFooCommand}" Content="DoFoo"/> 

你視圖模型將有一個DelegateCommand成員來執行。

public class SomeViewModel : NotificationObject 
{ 
    public SomeViewModel() 
    { 
     DoFooCommand = new DelegateCommand(ExecuteFoo); 
    } 

    public DelegateCommand DoFooCommand { get; set; } 

    private void ExecuteFoo() 
    { 
     //Use the EventAggregator to publish a common event 
    } 
} 

最後,在解決方案中的其他地方,你將有一個代碼文件/類,訂閱事件,等待有人來發布來處理這事件。

public class SomeOtherPlace 
{ 
    public SomeOtherPlace() 
    { 
     //Use the EventAggregator to subscribe to the common event 
    } 

    public void FooBarMethodToCallWhenEventIsPublished(SomePayload payload) 
    { 
     //Do whatever you need to do here... 
    } 
} 

我知道的一些事情被排斥在外(如什麼是「SomePayload」是...看看到EventAggregator信息),但我並不想進入太多。只要給你一份關於去哪裏尋找信息和一些基本代碼的指南。如果您決定使用EventAggregator,那麼您需要確保您的訂閱調用和發佈調用正在使用EventAggregator的SAME實例。您可以通過查看MEF來做到這一點。棱鏡被設置爲與MEF完美合作......我不會說謊。做所有這些都需要一點學習曲線,但最終你可以輕鬆地單元測試ViewModels並使代碼鬆散耦合,這將是值得的。 EventAggregator是不同班級彼此溝通而不依賴彼此瞭解的好方法。 MEF非常適合您的服務使用容器,您希望在您的應用程序中使用它。

希望能給你一點關於如何去做你想要在正確的道路上做什麼的見解。