2009-12-05 97 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(); 

调用显示()已关闭窗口上似乎抛出一个异常,所以我的猜测是,有一些其他的方式,或者,如果你已经关闭了窗口,该窗口在技术上是“破坏”

的好的一点是,我可以检测窗口是否仍然打开并关注它(以便再次显示在前面)。

注意:这里有一个缺点,因为在这个设置中它限制了你一次只打开一个窗口(假设你所有的窗口都是这样实现的)。就我而言,我只想在主窗口之外打开一个窗口。

您可能还想检查您的窗口是否为空,因为它可能不是您必须打开的唯一窗口。