如何找到WPF窗口位置更改的原因?

问题描述:

每当我从休眠状态恢复电脑时,我的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.SessionSwitchSessionSwitchReason.SessionUnlock,并从那里调用LoadUiSettings,但是这仍然是围绕实际问题绷带。我仍然想知道是什么原因造成的,并从根本上解决它。编辑2:如果窗口当前不可见,设置它仍然不会改变实际位置。我暂时推翻了可见性,然后进行以下操作:

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

我看到窗口显示出来的一瞬间,而它的等待调整,它再次消失在此之后,我手动通过UI切换知名度,它再次位居前列。当它已经在正确的位置时手动切换不会产生这种行为。

相关的特定问题(即找到了问题的原因,但不是要求的解决方案),答案可以使用下面的代码片段对应PowerModeChange事件进行WPF Window位置变化的分析可以发现:

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错位)的根本原因,您可以开发相对简单修复,像如在PowerModes.Resume事件中重新定位Window

希望这可能有所帮助。

+0

不知道你是否在我的编辑之前或之后发布过这个内容(自从你编辑标签后,我假设在我的最新版之后),但是我提到它在恢复和解锁计算机之间有时会发生变化。我已经有一个解决方法,但我想找出如何解决它的根。 – Lunyx

+0

我正在回应您的原始问题。有点不清楚:你是否解决了由于休眠引起的Window错位的实际问题,其次,你是否通过使用我的答案中的代码片段或修改后的代码得到了你的问题的答案:请澄清。最好的问候, –

+0

不,我没有使用你的片段。这个问题仍然没有解决,因为我不知道是什么原因造成的,但是我确实有一个解决方法,我现在已经为它做好了准备。 – Lunyx