0

コンピューターを休止状態から再開するたびに、Windowの位置が画面の上部に移動するようです。ウィンドウの場所を記録するために次のものがあります。

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

WindowTopWindowファイルからメモリに読み込まれるプロパティで、最後に閉じられる前の場所を追跡します。これが起動時に出力されるときはいつでも、両方の値が期待どおりに正しいです。ただし、休止状態から再開した後、実際の値として 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プロパティを変更しているものを見つける方法はありますか?

編集: 私の回避策は、そこから and を使用SystemEvents.SessionSwitchSessionSwitchReason.SessionUnlockて呼び出すLoadUiSettingsことですが、それでも実際の問題に対する応急処置です。何が原因なのかを突き止めて、根本から解決したいと思っています。

編集 2: Window が現在表示されていない場合、それを設定しても実際の位置は変更されません。可視性を一時的にオーバーライドしてから、次のことを実行しました。

            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 に答える