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

Is it possible to close a window without firing the activated event?

我已经停止寻找一段时间了,但找不到解决这个本应简单的任务的方法。我通过事件触发器使用两个事件,'Activated' 和 'Closed' 事件。

我正在使用 'Activated' 事件来更新我的 Window,但我不希望它在我从任务栏关闭应用程序时触发。有什么想法吗?

我的程序在 XAML-代码中包含以下事件触发器:

   <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>

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

据我所知,您有 2 个选择。第一种是使用 DispatcherTimer 在 window 的激活和更新之间添加一个小的延迟,足够让后续的关闭消息到达。

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