16

WPF コントロールの再描画に問題があります。

WPF コントロールは、Windows フォームの ElementHost.Child として追加されます。

Windows 7 が省電力モードになり、(マウスを移動するか、キーボードのキーを押すことによって) 通常に戻ると、残りの Windows フォーム コントロールは再描画されますが、WPF 部分は再描画されません (そして、Win 7 の背景が画面に表示されます)。そのエリア)。

アプリケーションの最小化と最大化で、WPF 部分が再描画されます。

誰でもこの問題について何か考えがありますか?

4

2 に答える 2

1

この問題の解決策は、MSDN マガジンで少し前に提供されました。WPF アプリケーションを「電源対応」にする方法、つまり電源通知に応答する方法を示します。それは素晴らしい記事であり、「必読」です。

このリンクを確認してください: Make Your WPF Apps Power-Aware

ソース コードをオンラインで参照するか、ここからダウンロードできます: Code for PowerAware

使用された技術:

  • WPF
  • .Net フレームワーク 3.0
  • Windows Vista / Windows XP
于 2011-06-18T15:34:39.167 に答える
0

一般に、Windows フォームでは、コントロールで .Invalidate() を呼び出すと、コントロール自体が再描画されます (コントロール全体の検証範囲を「ダーティ」に設定し、独自のペイント イベントを非同期で呼び出すことにより)。 -- ペイントを呼び出すだけの場合最初に無効化せずに winform でメソッドを使用すると、以前にダーティとしてマークされた部分のみを再描画できます。Windows は再描画時間を節約するためにDirty Rectangles アプローチを使用するためです。)

うまくいけば、WPF ホスト コントロールで .Invalidate() を呼び出すか、フォーム自体で .Invalidate() を呼び出すことができます (例: "this.Invalidate();")。

フォームでダブル バッファリングを有効にすることも役立つかもしれませんが、これについては確信が持てません。ただし、実験する価値はあります。

上記の@Hasanは答えの一部を提供しました-WindowsメッセージポンプにフックしてWindows電源イベント通知を受け取る方法-しかし、それ自体ではウィンドウが再描画されることはありません(少なくとも私が知る限り)-それはどちらかと言えば、「やあ、あなたが嫌い​​な問題に直面しようとしているのよ。あなたにはうんざりだ」という通知のようなものです。

したがって、これはおそらく、Hasan のメッセージ ポンプにフックして、「this.Invalidate();」を呼び出すのと同じくらい簡単です。電源イベント通知を受信したとき。その解決策は少しやり過ぎかもしれませんが。

それだけでは不十分な場合は、WPF コントロール自体に Invalidate を指示する必要があるかもしれません...そのメソッドがないため、それはできません。ドキュメントは .InvalidateVisual() が同等であることを示唆していますが、私の経験ではそうではないと信じています。winform のレベルで無効にする以外に、私はあなたを助けることができません。答えを見つけたら、投稿してください!

于 2011-09-15T03:13:38.507 に答える