コンピューターを休止状態から再開するたびに、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
ただし、ロードの前に を追加するとWindow
、間違った場所に が表示され、設定が適切にロードされ、正しい設定に切り替わります。ウィンドウを元の場所から移動したため、再開時に場所が正しく修正され、コンピューターのロックを解除した後、何らかの形でTop = 0
. 奇妙なことは、Left
この問題にまったく悩まされていないことです。ソリューションでの両方のプロパティの使用法はすべて同じです。これはバニラの WPF アプリケーションでは発生しないため、これをさらに調査する方法がよくわかりません。奇妙なことに、コンピューターを休止状態にせずに手動でロックしただけでは、これは発生しません。
どういうわけか私Window
のTop
プロパティを変更しているものを見つける方法はありますか?
編集: 私の回避策は、そこから and を使用SystemEvents.SessionSwitch
しSessionSwitchReason.SessionUnlock
て呼び出すLoadUiSettings
ことですが、それでも実際の問題に対する応急処置です。何が原因なのかを突き止めて、根本から解決したいと思っています。
編集 2: Window が現在表示されていない場合、それを設定しても実際の位置は変更されません。可視性を一時的にオーバーライドしてから、次のことを実行しました。
while (Math.Abs(Top - SettingsHelper.Instance.Settings.WindowTop) > 0.1)
{
Top = SettingsHelper.Instance.Settings.WindowTop;
}
調整を待っている間、ウィンドウが一瞬表示され、再び消えた後、UI を介して手動で表示を切り替えると、再び上部に表示されます。すでに正しい場所にあるときに手動で切り替えると、この動作は発生しません。