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

时间:2013-10-29 13:59:57

标签: c# wpf window

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

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

    cm.Show();

    cm.Canales.setValues();

}

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

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

if (cm!=null && cm.IsLoaded)
{
    cm.Canales.setValues();
}

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

4 个答案:

答案 0 :(得分:8)

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

您必须检查的是Visibility属性(最后,Show()将会更改),如果Window当前可见,则为VisibleHidden如果尚未加载(或已加载但仍然存在但实际上已隐藏)。

总结:

if (cm != null && cm.Visibility == Visibility.Visible)
{
}

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

答案 1 :(得分:0)

还有另一种方法可以检查哪些Window当前处于活动状态:

foreach (Window window in Application.Current.Windows)
{ 
    // Check for your Window here
}

如果您的Window属于特定类型,则可以改为:

foreach (Window window in Application.Current.Windows.OfType<YourWindow>())
{ 
    // Do something with your Window here
}

您的Window在显示之前不会显示在此处。

答案 2 :(得分:0)

我认为扩展方法在这种情况下非常有用,试试这个:

public static class WindowsExtensions
{
   public static bool IsOpened(this Window window)
   {
        return Application.Current.Windows.Cast<Window>().Any(x => x.GetHashCode() == window.GetHashCode());
   }
}

这使您能够在每个窗口上进行调用:

var wind = new ChildWindow();
wind.ShowDialog();
var isOpened = wind.IsOpened();

你也可以查看:How do I know if a WPF window is opened

有关Application.Windows

的更多信息

答案 3 :(得分:0)

如果你调用myWindow.Show()和myWindow.Close(),myWindow.IsLoaded会得到一个值,你可以用它来指示窗口是否打开。