0

每当我从休眠状态恢复计算机时,我的位置似乎会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 应用程序不会发生这种情况,所以我不确定如何进一步调查。奇怪的是,如果我只是手动锁定计算机,而不是通过休眠,则不会发生这种情况。

有没有办法找出是什么改变了我WindowTop财产?

编辑:我的解决方法是使用SystemEvents.SessionSwitchandSessionSwitchReason.SessionUnlock并从那里调用LoadUiSettings,但这仍然是围绕实际问题的创可贴。我仍然想弄清楚是什么原因导致它并从根本上解决它。

编辑2:如果窗口当前不可见,设置它仍然不会改变实际位置。我暂时覆盖了可见性,然后执行了以下操作:

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

我看到窗口在等待调整时出现一瞬间,然后在它再次消失后,我通过 UI 手动切换可见性,它再次位于顶部。当它已经在正确的位置时手动切换它不会产生这种行为。

4

1 回答 1

0

针对您的具体问题(即找到问题的原因,但不寻求解决方案),可以使用以下代码片段对事件Window对应的 WPF 位置变化进行分析,找到答案: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错位)后,您可以开发相对简单的修复程序,例如重新定位WindowonPowerModes.Resume事件。

希望这可能会有所帮助。

于 2016-02-28T19:29:36.710 回答