Как добавить обработчик событий, чтобы отслеживать стыковку окна с экраном?

У меня есть метод, который принимает высоту и ширину окна, когда WindowState изменяется с Window.StateChanged, но когда я использую стыковку MS Windows для стыковки окна, приложение обнаруживает изменение, запускает обработчик событий, затем стыкуется и дает мне неправильную высоту / ширину окна.

 private void Window_Loaded(object sender, RoutedEventArgs e) {
      Window.StateChanged += new EventHandler(Window_StateChanged);
 }

 void Window_StateChanged(object sender, EventArgs e) {
      EnvironmentalVariables.Instance.WindowHeight = Application.Current.MainWindow.Height - EnvironmentalVariables.MENUBARHEIGHT;
      EnvironmentalVariables.Instance.WindowWidth = Application.Current.MainWindow.Width - EnvironmentalVariables.TREEWIDTH - 55;
 }

Ручное изменение состояния

  • Изменения состояния окна
  • Window_StateChanged () вызывается

Использование стыковки пользовательского интерфейса Windows

  • Window_StateChanged () вызывается
  • Изменения состояния окна

Как сделать так, чтобы обработчик событий запускался после стыковки?

Чтобы было понятно, я не использую указанную док-станцию ​​Windows, я использую стыковку операционной системы в Windows 7, когда вы перетаскиваете ее в сторону экрана, и она стыкуется для вас.


person Bob.    schedule 14.08.2012    source источник
comment
Вы пытались использовать вместо этого событие SizeChanged? StateChanged?   -  person Renatas M.    schedule 14.08.2012
comment
Это была встроенная функция в оболочке Windows 7. Для этого нет никакого уведомления, все, что вы можете наблюдать, это изменение местоположения и размера окна. Затем вам нужно выяснить, что это произошло, когда Aero щелкнул окно или пользователь правильно разместил его. Нет никакой разницы. Что в значительной степени означает, что вам все равно.   -  person Hans Passant    schedule 14.08.2012


Ответы (1)


вы пробовали ActualHeight \ ActualWidth?

Изменить: (переместил ответ сюда) событие SizeChanged вызывается после StateChanged, и размер должен быть в порядке, тогда вы можете обновить размер там

person ZSH    schedule 14.08.2012
comment
Ага. Когда я отлаживал его, ActualHeight - это текущая высота окна, а высота - это высота окна после изменения состояния окна, но когда пользовательский интерфейс Microsoft Windows закрепляет окно, высота и фактическая высота одинаковы. То же самое касается ActualWidth и Width. - person Bob.; 14.08.2012
comment
событие SizeChanged вызывается после StateChanged, и тогда размер должен быть в порядке. - person ZSH; 14.08.2012
comment
Интересно, что когда вы используете стыковку Aero, фактический размер [Высота | Ширина] изменяется, а Высота | Ширина - нет. Что странно, потому что для обычного изменения состояния окна это противоположные значения. В итоге мне пришлось проверить WindowState.Maximized, а затем проверить, больше ли [Высота | Ширина], чем Фактическая [Высота | Ширина], и установить его соответствующим образом. - person Bob.; 14.08.2012