【解決方法】画面がスリープから復帰した後、WPF アプリケーション ウィンドウが完全に更新されない

プログラミングQA


今日、WPF アプリケーションの 1 つで少し奇妙な問題が見つかりましたが、それに対処する方法が正確にはわかりません。 ラップトップの 1 台でソフトウェアを実行すると、ユーザーの操作がなくなると、しばらくして画面がスリープ状態になります (黒くなります)。 アプリケーション自体はまだインターネットからデータをダウンロードし、データベースにテーブルを埋めるのに忙しいです。 プログレスバーとステータスバーもあります。
マウスを動かすだけで画面をスリープ解除すると、プログラムは再び表示されますが、ウィンドウの一部が更新されません。 プロセスが完了してもプログレスバーには値が表示されたままで、ステータスバーも間違っています。
この時点から、何事もなかったかのようにプログラムを操作できますが、プログレス バーとステータス バーは、ウィンドウ全体をタスク バーまで最小化し、再度最大化した場合にのみ再描画されます。 または、プログレスバーまたはステータスバーも使用する別のアクションを開始した場合。
この奇妙な動作は、画面がスリープから復帰した後、表示されるデータが間違っているように見えるため、多くの混乱を引き起こしました。実際に何が起こっているかを確認するには、ウィンドウを最小化または最大化する必要があります。
ここで何が間違っているのでしょうか?

解決策 1

イベントを処理する必要があります Microsoft.Win32.SystemEvents.PowerModeChanged、 見る http://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents(v=VS.100).aspx[^]。

このコードサンプルを見てください。 http://msdn.microsoft.com/en-us/library/hxkc1kwd.aspx[^]。

WPF ウィンドウを更新するには、次の呼び出しを試してください。 System.Windows.Window.UpdateLayout、 見る http://msdn.microsoft.com/en-us/library/system.windows.window.aspx[^]。

また興味深い質問をありがとうございます。

幸運を、

-SA

解決策 2

マテリアルデザイン ライブラリを使用している場合、スリープ モードに入った後だけでなく、単純な画面ロック (Windows-L ショートカット) の後でもこの問題が発生します。
xaml ファイルの Window 要素に次の行を追加することで解決しました。

materialDesign:ShadowAssist.CacheMode="{x:Null}"

それが役に立てば幸い。

コメント

タイトルとURLをコピーしました