【问题标题】:How to tell if a ChildWindow is the 'top most' window如何判断 ChildWindow 是否是“最顶层”窗口
【发布时间】:2014-01-13 10:53:01
【问题描述】:

我在 Silverlight 中工作,但 WPF 解决方案可能也可以工作。

我的问题很简单。我有很多可以打开的模态子窗口,它们的通用菜单中有一个主页按钮。该按钮应该关闭所有子窗口并返回基本屏幕。我有几种不同类型的“通用子窗口”,它们托管了许多不同的用户控件,所以到目前为止,实现这一点的最简单方法是,当窗口成为焦点时,检查全局 ReturnToHome bool 是否为真,并且如果是,请关闭它。

这些我都试过了

    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 并不容易,因为您可以打开子窗口的位置数量众多,其中有几个嵌套在用户控件中,我什至无法轻松访问 @ 987654326@。知道我该怎么做吗?

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

【问题讨论】:

    标签: c# wpf silverlight


    【解决方案1】:

    TopMost 是一个bool 属性,可以设置为truefalse,据我所知,没有像Z-Index 这样的public 属性会告诉你顺序其中您的Windows 设置为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();
    }
    

    【讨论】:

    • 我考虑过这样的事情,尽管它有一些问题。我不能只是按顺序关闭它们,我必须让每个子窗口自行关闭,这样它就有机会让你取消(比如该窗口是否有未保存的更改)并阻止其下方的所有窗口关闭。跨度>
    • 糟糕,发布得太早了。我几乎同意你的订单建议。我试图避免这种情况,因为创建了一些子窗口,但由于某种错误或加载中的任何原因,它们永远不会显示。因此,需要在编码方面进行大量额外的工作来检查这一点。我找到了一种方法来使用VisualTreeHelper 来获取对其后面的子窗口的引用,并从当前窗口的 Closed 事件处理程序调用该窗口的关闭。
    • 另外,令人讨厌的是,Silverlight 中没有 TopMost
    猜你喜欢
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多