2010-09-11 182 views
2

我在WPF C#Blend項目中設置了兩個窗口。現在我想知道的是(如何在應用程序啓動時運行這兩個窗口,以及以何種方式將代碼從窗口傳遞到窗口)(我無法找到一些明確的文檔)。多個窗口

感謝

回答

3

app.xaml文件的解決方案,它指定了窗口在啓動時運行。打開另一個窗口的快速解決方案是在啓動窗口的Loaded事件的事件處理程序上打開第二個窗口。

但是,如果這是一個大型項目的一部分,那麼解決方案的可擴展性不是太大。有一個單獨的類可以打開每個窗口,那麼這兩個窗口都不需要知道另一個窗口。

至於在它們之間傳遞數據,使用事件可以提供更鬆散耦合的解決方案。我會推動更多MVVM(Model-View-ViewModel)架構,然後讓每個ViewModel引發其他人可以響應的事件。你可以聲明自己的子類EventArgs,它將提供需要傳遞的信息。

更新

對不起,響應延遲。簡單地說,要讓一個窗口與另一個窗口共享數據,接收方必須有辦法接收這些數據。在接收者中定義一個公共屬性將允許發送者通過簡單的屬性調用來指定數據。默認情況下,窗口的控件是內部的,所以你可以在同一個程序集中訪問它們,但這不是最好的方法。

WPF有一個非常豐富的綁定基礎結構,您應該利用它。要做到這一點,向窗口提供數據的對象需要實現INotifyPropertyChanged接口。這將提醒用戶界面數據已更改,並且綁定應使用已更改的數據更新目標。描述接口的MSDN頁面以及示例實現可以在here找到。

當你實現該接口時,會暴露一個事件(PropertyChanged),當數據發生變化時它將觸發。向另一個窗口提供數據的對象可以註冊一個事件處理程序來偵聽這些更改,然後它將具有更新的值。

下面是帶有FirstName和LastName屬性的簡單類的示例實現。

class FirstNameViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private string firstName; 
    public string FirstName 
    { 
    get { return firstName; } 
    set 
    { 
     if(firstName == value) 
     return; 

     firstName = value; 
     if(PropertyChanged != null) 
     PropertyChanged(this, new PropertyChangedEventArgs("FirstName")); 
    } 
    } 

    private string lastName; 
    public string LastName 
    { 
    get { return lastName; } 
    set 
    { 
     if(lastName == value) 
     return; 

     lastName = value; 
     if(PropertyChanged != null) 
     PropertyChanged(this, new PropertyChangedEventArgs("LastName")); 
    } 
    } 
} 

你可以看到這裏有一些代碼重複 - 這通常被重構爲一個基本的ViewModel類。你會看到這暴露了PropertyChanged事件。將事件處理程序附加到它,並在處理程序收到的PropertyChangedEventArgs對象中,PropertyName屬性將包含已更改屬性的名稱(與傳遞給上面每個設置器中的構造函數的字符串相同)。 sender參數將是對象本身的引用。將其轉換爲正確的類型,您將可以訪問屬性。

希望能讓你開始。我寫了一個非常有人氣的樣本,如果你想看,我可以上傳到某個地方。它打開2個窗口,然後您可以看到在一個窗口中鍵入會使輸入的文本出現在另一個窗口中,反之亦然。

+0

謝謝,你能給我一個例子如何將數據從一個窗口傳遞到另一個窗口?例如,我可以簡單地從另一個窗口訪問UI控件嗎? – internetmw 2010-09-11 21:42:15

+0

我添加了一些更多的細節以及代碼示例。這有幫助嗎? – 2010-09-13 03:33:01

0

如果你想通過窗口之間的數據,你應該有一個指針在每個窗口中的另一個窗口。要麼是這樣,要麼你可以閱讀使用單例類。如果您希望Windows共享設置,而不是在它們之間發送大量數據,這很方便。

http://www.yoda.arachsys.com/csharp/singleton.html