2015-11-03 6 views
0

Я ухожу от поиска и не могу найти решение этой предполагаемой легкой задачи. Я использую два события через триггеры событий, событие «Активировано» и «Закрыто».Возможно ли закрыть окно без активации активированного события?

Я использую событие «Активировано» для обновления своего окна, но я не хочу, чтобы его запускали, когда я закрываю приложение из панели задач. Есть идеи?

Моя программа содержит следующие EventTrigger в 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> 

ответ

0

Насколько мне известно, это не представляется возможным. И это не имеет никакого отношения к WPF или MVVM, так как Windows обрабатывает это сама. Когда вы щелкните правой кнопкой мыши на панели задач, вы вынуждаете фокус от приложения, поэтому вы получите деактивировать событие. Выбор закрытия из всплывающего меню заставляет окна отправлять WM_SYSCOMMAND/SC_CLOSE, но сначала он должен активировать ваше окно, и на уровне приложения нет способа узнать будущее намерение системного потока, инициирующего это действие.

Как я вижу, у вас есть 2 варианта. Во-первых, используйте DispatcherTimer, чтобы добавить небольшую задержку между активацией и обновлением вашего окна, достаточно долго для последующего закрытия сообщения.

Второй должен сделать ваше обновление в обработчике CompositionTarget.Rendering event. Это событие запускается даже тогда, когда приложение не имеет фокуса (seomthing, который вы, возможно, захотите отследить самостоятельно, если вам не нужны обновления фона), но событие SC_CLOSE, которое следует за событием WM_ACTIVATE, должно происходить достаточно быстро, чтобы оно прибыло до следующее событие CompositionTarget.Rendering, в котором вы знаете, что ваше приложение закрывается и поэтому может игнорировать все последующие обновления.

+0

Спасибо за подробный ответ. Я выбрал DispatcherTimer, и он работает очень хорошо! – Capone

 Смежные вопросы

  • Нет связанных вопросов^_^