【问题标题】:Application.Current.Activated doesn't fire while .ShowDialog() activeApplication.Current.Activated 在 .ShowDialog() 活动时不会触发
【发布时间】:2014-01-09 18:57:46
【问题描述】:

我正在使用Application.Current.Activated 在单击任何窗口时将所有窗口置于前面。这很好用,但是当我使用 .ShowDialog() 打开模式对话框时不起作用

单击应用程序的其他窗口(对话框除外)不会导致应用程序被激活。默认行为是什么都不做。 (点击似乎完全被忽略!

  • 我怎样才能使它在单击应用程序的任何窗口时,将打开的对话框置于最前面? (预期行为取决于每个应用程序的运行情况)

是的:我确实将对话框的所有者设置为我的主窗口,单击主窗口会产生所需的结果,但单击任何其他窗口都不会执行任何操作。

代码:
创建一个新的 WPF 项目并添加两个窗口。
然后在 MainWindow 上放一个按钮。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Window1 foo = new Window1();
        foo.Show();
    }
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Window2 modal = new Window2();
        modal.Owner = this;
        modal.ShowDialog();
    }
}

要查看我在说什么,请单击按钮以打开模式对话框。
所需的行为是单击 MainWindow 时发生的情况。
我希望在单击 Window1 时发生同样的情况。

【问题讨论】:

    标签: wpf events modal-dialog window


    【解决方案1】:

    AFAIK,一个模态对话框(.ShowDialog() 触发)阻止所有其他窗口,从而阻止激活事件。

    根据 MSDN:

    当一个 Window 类被实例化时,它默认是不可见的。 ShowDialog 显示窗口,禁用应用程序中的所有其他窗口,并且仅在窗口关闭时返回。这种类型的窗口称为模态窗口。

    http://msdn.microsoft.com/en-us/library/system.windows.window.showdialog(v=vs.110).aspx

    这可能是一个丑陋的 hack,但也许您可以通过在单独的线程上创建模态窗口来完成您需要的工作,从而让您的主应用程序继续处理激活(和其他)事件?您需要一种方法来阻止第二个模式对话框中的两个打开。

    【讨论】:

    • 嗯,我没想到。自从发布这个问题以来,我试图在我的 WPF 应用程序中消除模式窗口的使用。相反,我只需要模拟也非常混乱的对话行为。我正计划推出我自己的“准模态对话框”用户控件。 this, for example 之类的东西,但我还没有完全适应 MVVM。
    猜你喜欢
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    相关资源
    最近更新 更多