我在Silverlight工作,但可能WPF解决方案也可以。
我的问题非常简单。我有很多可以打开的模态子窗口,在它们的通用菜单中是一个主页按钮。该按钮应该关闭所有子窗口并返回基本屏幕。我有一些不同类型的'通用子窗口',它们托管了许多不同的UserControl,所以到目前为止,最简单的实现方法是,当窗口成为焦点时,检查全局ReturnToHome
布尔值是否为真,如果是,请关闭它。
我已经尝试了所有这些
private void ChildWindow_GotFocus(object sender, RoutedEventArgs e)
{
if (CommonResources.ReturnToHome) DialogResult = false;
}
private void ChildWindow_MouseEnter(object sender, MouseEventArgs e)
{
if (CommonResources.ReturnToHome) DialogResult = false;
}
private void ChildWindow_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if (CommonResources.ReturnToHome) DialogResult = false;
}
问题是,GotFocus
在我实际点击窗口之前不会触发。 MouseEnter
稍好一点,但在我移动鼠标之前不会开火。 IsEnabledChanged
永远不会触发,因为子窗口不会禁用任何内容。检查每个子窗口何时关闭以查看Home是否被点击是不容易的,因为您可以打开子窗口的地方数量很多,其中一些嵌套在用户控件中,我甚至无法轻易访问{ {1}}。知道怎么做吗?
另外我应该注意到,我希望每个窗口从上到下逐个关闭,因为关闭的每个窗口都会自行验证,看它是否应该在关闭之前警告用户(让用户选择取消关闭)
答案 0 :(得分:0)
TopMost
是bool
属性,设置为true
或false
,据我所知,没有public
属性比如Z-Index
会告诉您Window
设置为TopMost
的顺序。但是,有一个简单的解决方案......只需维护一个static int
变量来记录此订单。每次添加新Window
时,请将数字设置为Tag
属性:
Window childWindow = new Window();
childWindow.Tag = currentWindowNumber++;
...
childWindow.ShowDialog();
然后,当你想按顺序关闭它们时,你可以这样做:
foreach (Window window in Application.Current.Windows.OfType<YourWindowType>()
.OrderBy(w => (int)w.Tag))
{
((AnimationWindow)window).CloseWindow();
}