wpf检测打开的窗口

nel*_*ebs 2 wpf events window

在我的WPF应用程序(csharp)中,我有一个事件处理程序,当触发时将打开应用程序的新窗口(窗口B)并显示一些数据.但是,当再次触发事件时,如果新窗口(窗口B)仍然打开,我不想生成窗口B的另一个实例,而只是更新当前实例中显示的数据.所以问题是:如何检测窗口B是否已经存在且仅在尚未打开时才打开,否则只需更新数据?

我找到了Application.Current.Window集合,但不知怎的,这对我来说还不起作用.想法?

Abb*_*ner 5

您可以在WindowB中创建一个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( ); 
}
Run Code Online (Sandbox Code Playgroud)

让你的窗口关闭事件调用close委托:

private void WindowClosed( object sender, EventArgs e ) {
     ParentCallbackOnClose.Invoke( );
}
Run Code Online (Sandbox Code Playgroud)

现在,从打开Window B的类开始,让它保持打开的那个实例,这样如果有人试图重新加载它时WindowB已经打开,它就会在现有实例上调用LoadWindow.就像是...

private WindowB WinB;

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

然后你可以让它在关闭回调上使WinB无效,所以如果WinB关闭,那么下次调用LoadWindowB()时它将创建一个新的实例:

private void WindowBClosed( ){
    WinB = null;
}
Run Code Online (Sandbox Code Playgroud)