如何判断ChildWindow是否是“最顶层”的窗口

时间:2014-01-13 10:53:02

标签: c# wpf silverlight

我在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}}。知道怎么做吗?

另外我应该注意到,我希望每个窗口从上到下逐个关闭,因为关闭的每个窗口都会自行验证,看它是否应该在关闭之前警告用户(让用户选择取消关闭)

1 个答案:

答案 0 :(得分:0)

TopMostbool属性,设置为truefalse,据我所知,没有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();
}