2009-12-05 215 views
2

在我的WPF應用程序(csharp)中,我有一個事件處理程序,它在觸發時會打開應用程序的一個新窗口(窗口B)並顯示一些數據。但是,當再次觸發事件時,如果新窗口(窗口B)仍處於打開狀態,我不想生成窗口B的另一個實例,只是更新當前實例中顯示的數據。所以問題是:如何檢測窗口B是否已經打開,如果尚未打開,否則只是更新數據?wpf檢測打開的窗口

我發現Application.Current.Window集合,但不知何故,這對我還沒有工作。想法?

回答

5

您就可在窗口B一LOADWINDOW()方法,你可以調用加載(或刷新),將工作數據&無論如果窗口已經打開與否。有它採取委託打電話的時候,這個窗口被關閉:

private Action ParentCallbackOnClose; 

public void LoadWindow(Action parentCallbackOnClose) { 
    // load the data (set the DataContext or whatever) 

    ParentCallbackOnClose = parentCallbackOnClose;  

    // Open the window and activate/bring to the foreground 
    Show(); 
    Activate(); 
} 

,有你的窗口關閉事件調用close委託:

private void WindowClosed(object sender, EventArgs e) { 
    ParentCallbackOnClose.Invoke(); 
} 

現在,從打開窗口B您的課,有它保持它打開的實例,這樣如果有人試圖重新加載WindowB時,如果WindowB已經打開,它只會在現有實例上調用LoadWindow。喜歡的東西...

private WindowB WinB; 

private void LoadWindowB(Content content) 
{ 
    if (WinB == null){ 
     WinB = new WindowB(); 
    } 
    WinB.LoadWindow(content, WindowBClosed); 
} 

然後你可以把它空出來WinB上接近回調,所以如果WinB被關閉,那麼下一次LoadWindowB()被調用時,它將創建它的一個新的實例:

private void WindowBClosed(){ 
    WinB = null; 
} 
0

編輯:oops,我的答案是特定於Windows窗體。我剛纔看到了WPF的提及。我不確定WPF的具體代碼是什麼,但我會想象它在概念上並不完全一樣。我想在WPF的屬性被稱爲可見性,而不是可見光

你可以堅持自己的窗口的實例(或使其成爲Singleton),然後當你需要確定它是否是可見或不可見,檢查它的可見財產。

例如:

if(myWindow.Visible){ 
    myWindow.Hide(); 
}else{ 
    myWindow.Show(); 
} 
0

This article它是我發現用於在WPF頁面之間傳遞數據的最佳選擇。作者使用KISS方法提供了一個簡單的解決方案。

0

由於這是谷歌列出的第一個鏈接,幾年前發佈,爲解決方案檢查Window是否已經打開,我會發布我的答案,爲其他人,我覺得更容易實現。 ChildWindow只從MainWindow調用,所以沒有其他Window需要做任何檢查。

private void OpenChildWindow() 
{ 
    if (this.OwnedWindows.OfType<ChildWindow>().Count() > 0) 
    { 
     ChildWindow Win = this.OwnedWindows.OfType<ChildWindow>().First(); 
     Win.Activate(); 
    } 
    else 
    { 
     ChildWindow Win = new ChildWindow(); 
     Win.Owner = this; 
     Win.Show(); 
    } 
} 
0

有一種老式的方式來使用界面來做到這一點。我在Java中看到這很多,作爲彌補沒有委託的一種方式(糾正我,如果我錯了)。這種方法將允許你檢查是否有一個窗口已經打開(任何種類)。原始響應工作得很好,但你也可以做到這一點通過以下方式:

創建接口

public interface IWindowTracker 
{ 
    void WindowIsOpened(); 
    void WindowIsClosed(); 
} 

實現父接口(從正在打開):

public partial class MainWindow : Window, IWindowTracker 

在你的構造函數中,接受一個I​​windowTracker接口的對象。實例保存以備將來使用

IWindowTracker windowTracker; 
    public ProjectManager(IWindowTracker parentWindowTracker) 
    { 
     windowTracker = parentWindowTracker; 

     InitializeComponent(); 
    } 

設置調用到窗口跟蹤對象

protected override void OnActivated(EventArgs e) 
    { 
     windowTracker.WindowIsOpened(); 
     base.OnActivated(e); 
    } 

    protected override void OnClosed(EventArgs e) 
    { 
     windowTracker.WindowIsClosed(); 
     base.OnClosed(e); 
    } 

終於實現IWindowTracker在父WPF窗口

bool windowIsOpen = false; 

    public void WindowIsOpened() 
    { 
     windowIsOpen = true; 
    } 

    public void WindowIsClosed() 
    { 
     windowIsOpen = false; 
    } 

這將允許你跟蹤窗口是否仍然打開,如果是,則不需要打開它的新實例:

 if (!windowIsOpen) 
     { 
      remoteProjectManager = new ProjectManager(this); 
      remoteProjectManager.Show(); 
     } 

     remoteProjectManager.Focus(); 

調用顯示()已關閉窗口上似乎拋出一個異常,所以我的猜測是,有一些其他的方式,或者,如果你已經關閉了窗口,該窗口在技術上是「破壞」

的好的一點是,我可以檢測窗口是否仍然打開並關注它(以便再次顯示在前面)。

注意:這裏有一個缺點,因爲在這個設置中它限制了你一次只打開一個窗口(假設你所有的窗口都是這樣實現的)。就我而言,我只想在主窗口之外打開一個窗口。

您可能還想檢查您的窗口是否爲空,因爲它可能不是您必須打開的唯一窗口。