正确的方法来询问窗口是否在WPF中打开

Nat*_*izz 5 c# wpf window

我在主窗口中有这个点击事件来打开一个新窗口

private void Button_Click(object sender, RoutedEventArgs e)
{
    cm = new CanalesMain();

    cm.Show();

    cm.Canales.setValues();

}
Run Code Online (Sandbox Code Playgroud)

我的cm变量在我的主窗口中定义为成员类,因为我需要每5分钟加载/刷新一次setValues()方法(有一个TimeSpan和一个EventHandler)

问题是,在我的"刷新数据"方法中,我有这个if语句来询问cm变量是否已加载且不为空(我的意思是,如果窗口曾被打开或者如果打开,请询问是否未关闭)

if (cm!=null && cm.IsLoaded)
{
    cm.Canales.setValues();
}
Run Code Online (Sandbox Code Playgroud)

这是询问我的窗户是否打开的正确或最佳方式吗?

Adr*_*tti 10

严格说不,这不是正确的方法.IsLoaded并不意味着它Window是可见的,只是加载(即使在大多数场景中这可能是等效的,但它意味着这个窗口已经创建过一次,它有一个句柄,没有提到它的可见性).

您必须检查的是Visibility属性(最后,Show()将更改),如果当前可见或者尚未加载(或者它已被加载但它仍然是,则它将是可见Window)Hidden实际上隐藏了).

总结一下:

if (cm != null && cm.Visibility == Visibility.Visible)
{
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果Window是可见的,那么它是隐式的,它已被加载(它有一个句柄),但它不是真的反之亦然(加载的窗口可能不可见,也许它甚至不是在过去).