2016-02-28 52 views
0

Когда я возобновляю свой компьютер из спящего режима, кажется, что мое местоположение Window смещается в верхнюю часть экрана. Я следующее протоколирует расположение окна:Как найти причину изменения местоположения окна WPF?

 LocationChanged += (sender, args) => 
     { 
      Logger.Info($"{Top},{SettingsHelper.Instance.Settings.WindowTop}"); 
     }; 

WindowTop это свойство, которое загружается в память из файла, который отслеживает, где Window последний был, прежде чем он был закрыт. Всякий раз, когда это печатает при запуске, оба значения верны, как ожидалось. Однако, после возобновления спящего режима, это печатает 0 для фактического значения, тогда как значение настройки остается неизменным. Это исключает неправильное значение параметра, которое загружается из причины.

Я также пытаюсь перезагрузить настройки, когда компьютер из спящего режима:

private void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e) 
    { 
     if (e.Mode == PowerModes.Resume) 
     { 
      LoadUiSettings(); 
     } 
    } 

    private void LoadUiSettings() 
    { 
     Left = SettingsHelper.Instance.Settings.WindowLeft; 
     Top = SettingsHelper.Instance.Settings.WindowTop; 
    } 

Это также не решает проблему. Однако, когда я добавлю в MessageBox перед загрузкой, он покажет Window в неправильном месте, затем он правильно загрузит настройки и переключится на правильный. Поскольку я переместил свое окно в исходное положение, я вижу, что при возобновлении он правильно установит местоположение, а затем, после разблокировки моего компьютера, он переместится в Top = 0. Странно то, что Left не страдает от этой проблемы вообще. Все применения обоих свойств в решении идентичны. Это не происходит с приложением WPF для ванилин, поэтому я не уверен, как исследовать это дальше. Как ни странно, этого не происходит, если я просто блокирую компьютер вручную, а не спящий режим.

Есть ли способ узнать, что меняет WindowTop недвижимость как-то?

Редактировать: Мое обходное решение заключается в использовании SystemEvents.SessionSwitch и SessionSwitchReason.SessionUnlock и звоните LoadUiSettings оттуда, но это все еще бандана вокруг фактической проблемы. Я все равно хотел бы выяснить, что вызывает его, и решить его в корне.

Редактировать 2: Если окно в настоящее время не отображается, установка его по-прежнему не изменяет фактическое положение. Я временно отменяю видимость, а затем выполняется следующее:

  while (Math.Abs(Top - SettingsHelper.Instance.Settings.WindowTop) > 0.1) 
      { 
       Top = SettingsHelper.Instance.Settings.WindowTop; 
      } 

Я вижу окно появляется на долю секунды, пока он ждет, чтобы быть отрегулирован, то после того, как она снова исчезает, и я переключать видимость вручную с помощью пользовательского интерфейса , он снова наверху. Переключение вручную, когда оно уже находится в правильном месте, не дает такого поведения.

ответ

0

Документов, касающийся вашего конкретный вопрос (то есть найти причину проблемы, но не прошу решения), то ответ можно найти, используя следующий фрагмент кода, чтобы выполнить анализ WPF изменений Window положения, соответствующим PowerModeChange события:

SystemEvents.PowerModeChanged += OnPowerChange; 

private void OnPowerChange(object s, PowerModeChangedEventArgs e) 
{ 
    switch (e.Mode) 
    { 
     case PowerModes.Resume: 
     // Log the position as it's done in your example 
     Logger.Info ("Mode Change: Resume"); 
     Logger.Info($"{Top},{SettingsHelper.Instance.Settings.WindowTop}"); 
     break; 
     case PowerModes.Suspend: 
     Logger.Info ("Mode Change: Suspend"); 
     Logger.Info($"{Top},{SettingsHelper.Instance.Settings.WindowTop}"); 
     break; 
    } 
} 

найдя причину вашей проблемы (а именно, какое событие вызывает Window вывих), вы можете развиваться относительно просто исправить, как, например, повторное позиционирование Window по событию PowerModes.Resume.

Надеюсь, это поможет.

+0

Не уверен, что вы разместили это до или после моего редактирования (я предполагаю после того, как вы отредактировали теги после моего последнего), но я упомянул, что он иногда меняет время между возобновлением и разблокировкой компьютера.У меня есть обходное решение уже, но я хочу узнать, как исправить его в корне. – Lunyx

+0

Я отвечаю на ваш оригинальный вопрос. Немного неясно: вы разрешили фактическую проблему дислокации Windows, вызванную спящим режимом, и, во-вторых, вы получили ответ на свой вопрос, используя либо фрагмент кода в моем ответе, либо ваш измененный код: пожалуйста, уточните. С уважением, –

+0

Нет, я вообще не использовал ваш фрагмент. Проблема по-прежнему не решена, потому что я не знаю, что ее вызывает, но у меня есть обходное решение, которое я сейчас применил для этого. – Lunyx

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