2011-05-11 119 views
16

我遇到了重新繪製我的WPF控件的問題。WPF重繪問題

將WPF控件添加爲Windows窗體的ElementHost.Child。

當Windows 7進入powersave模式並恢復正常(通過移動鼠標或鍵盤上的按鍵),Windows窗體控件的其餘部分被重新繪製,但WPF部分未重新繪製(以及Win 7背景在該區域中可見)。

On最小化和最大化應用程序,WPF部分被重新繪製。

任何人有任何關於這個問題的想法?

+0

我不知道這是可能的,但你可以強制WPF通過掛鉤到窗體OnPaint事件重繪自己?我不確定這將如何通過互操作,但值得一試! http://msdn.microsoft.com/en-us/library/system.windows.forms.control.onpaint.aspx – stuartmclark 2011-06-15 14:06:30

+0

不要重寫OnPaint,主機控件已經有一個運行的OnPaint,它只是需要告訴重新繪製自己,例如通過調用Invalidate() - 請參閱下面的帖子以獲取更多信息。 – BrainSlugs83 2011-09-15 03:15:05

回答

1

此問題的解決方案早在MSDN雜誌中提供。它展示瞭如何讓WPF應用程序「瞭解功耗」,即響應電源通知。這是一篇不可思議的文章,也是「必讀文章」。

檢查此鏈接:Make Your WPF Apps Power-Aware

您可以在線瀏覽源代碼或從這裏下載:Code for PowerAware

用到的技術:

  • WPF
  • .Net框架3.0
  • Windows Vista/Windows XP
+0

我剛纔瀏覽了文章。我不確定這篇文章解決了如何讓窗口刷新,只是如何編寫一個將被調用的函數(您應該在其中插入刷新代碼)。 – 2011-09-15 03:18:53

0

通常,在Windows窗體中,調用控件的.Invalidate()會導致它重新繪製自己(通過將整個控件的驗證矩形設置爲「髒」,然後讓它異步調用自己的繪畫事件。 - 如果你只是援引的WinForms 畫圖方法,無需無效首先,你將只能重繪先前被標記爲髒的部分 - 如Windows使用Dirty Rectangles approach,以節省時間重繪)

。希望你可以在你的WPF主機控件上調用.Invalidate(),或者直接調用窗體本身的.Invalidate()(例如「this.Invalidate();」)

在窗體上啓用雙緩衝也可能有幫助,但我不確定這一點 - 但這是值得的實驗。

@Hasan上面給你的答案的一部分 - 如何掛鉤到Windows消息泵,並接收窗口電源事件通知 - 但它本身不會導致你的窗口被重新繪製(至少從我可以告訴) - 這更多的是一個通知,說:「嘿,你即將有這個問題,你討厭。糟透了就是你。」

所以這可能就像掛鉤哈桑的消息泵的東西,然後調用「this.Invalidate();」任何時候收到電源事件通知。雖然這個解決方案可能有點矯枉過正。

如果這還不夠,你可能不得不告訴WPF控件本身無效......它不能這樣做,因爲它沒有這個方法。文檔表明.InvalidateVisual()是等價的,但是我的經驗讓我相反。除了在winform級別失效之外,我無法幫助你。如果你找到答案,請發佈!