我在主窗口中有这个点击事件来打开一个新窗口
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();
}
这是询问窗口是否打开的正确或最佳方式吗?
答案 0 :(得分:8)
严格说不,这不是正确的方法。 IsLoaded
并不意味着Window
是可见的,只是加载(即使此可能在大多数情况下都是等效的,但这意味着此窗口已创建一次,它有一个句柄,没有提到它的可见性。)
您必须检查的是Visibility属性(最后,Show()将会更改),如果Window
当前可见,则为Visible或Hidden
如果尚未加载(或已加载但仍然存在但实际上已隐藏)。
总结:
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();
的更多信息
答案 3 :(得分:0)
如果你调用myWindow.Show()和myWindow.Close(),myWindow.IsLoaded会得到一个值,你可以用它来指示窗口是否打开。