是否可以在不触发激活事件的情况下关闭窗口?

时间:2015-11-03 17:24:55

标签: c# xaml mvvm eventtrigger

我已经退出了一段时间,无法找到解决这个假设的简单任务的解决方案。我通过事件触发器使用了两个事件,即“激活”和“激活”。并且“关闭”#39;事件

我正在使用'已激活'更新我的窗口的事件,但是当我从任务栏关闭应用程序时,我不希望它被触发。有什么想法吗?

我的程序在XAML代码中包含以下eventtrigger:

   <i:Interaction.Triggers>
        <i:EventTrigger EventName="Activated" >
            <i:InvokeCommandAction Command="{Binding WindowActivated}" />
        </i:EventTrigger>
        <i:EventTrigger EventName="Closing">
            <i:InvokeCommandAction Command="{Binding ClosingCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>

1 个答案:

答案 0 :(得分:0)

据我所知,这是不可能的。而且它与WPF或MVVM无关,它就是Windows自己处理的方式。当您右键单击任务栏时,您会将焦点从应用程序中移开,这样您将获得一个停用事件。从弹出菜单中选择close将导致窗口发送WM_SYSCOMMAND / SC_CLOSE,但它必须首先激活您的窗口,并且在应用程序级别无法知道启动此操作的系统线程的未来意图。

我认为你有两个选择。第一种是使用DispatcherTimer在Activate和窗口更新之间添加一个小延迟,足够长的时间以便后续的关闭消息到达。

第二种是在CompositionTarget.Rendering event处理程序中进行更新。即使应用程序没有焦点也会触发此事件(如果您不想要后台更新,则可能需要跟踪自己的事件),但WM_ACTIVATE事件之后的SC_CLOSE事件应该足够快,以便它在到达之前到达下一个CompositionTarget.Rendering事件,此时您知道您的应用程序正在关闭,因此可以忽略所有后续更新。