每当我从休眠状态恢复计算机时,我的位置似乎会Window
移动到屏幕顶部。我有以下记录我的窗口位置:
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
加载之前添加 a 时,它会Window
在不正确的位置显示 ,然后它会正确加载设置并切换到正确的设置。由于我将窗口从原始位置移开,我可以在恢复时看到它会正确修复位置,然后不知何故,在解锁我的计算机后,它会自行移动到Top = 0
. 奇怪的是,Left
它根本不受这个问题的困扰。解决方案中这两个属性的所有用法都是相同的。普通 WPF 应用程序不会发生这种情况,所以我不确定如何进一步调查。奇怪的是,如果我只是手动锁定计算机,而不是通过休眠,则不会发生这种情况。
有没有办法找出是什么改变了我Window
的Top
财产?
编辑:我的解决方法是使用SystemEvents.SessionSwitch
andSessionSwitchReason.SessionUnlock
并从那里调用LoadUiSettings
,但这仍然是围绕实际问题的创可贴。我仍然想弄清楚是什么原因导致它并从根本上解决它。
编辑2:如果窗口当前不可见,设置它仍然不会改变实际位置。我暂时覆盖了可见性,然后执行了以下操作:
while (Math.Abs(Top - SettingsHelper.Instance.Settings.WindowTop) > 0.1)
{
Top = SettingsHelper.Instance.Settings.WindowTop;
}
我看到窗口在等待调整时出现一瞬间,然后在它再次消失后,我通过 UI 手动切换可见性,它再次位于顶部。当它已经在正确的位置时手动切换它不会产生这种行为。