我遇到了重新繪製我的WPF控件的問題。WPF重繪問題
將WPF控件添加爲Windows窗體的ElementHost.Child。
當Windows 7進入powersave模式並恢復正常(通過移動鼠標或鍵盤上的按鍵),Windows窗體控件的其餘部分被重新繪製,但WPF部分未重新繪製(以及Win 7背景在該區域中可見)。
On最小化和最大化應用程序,WPF部分被重新繪製。
任何人有任何關於這個問題的想法?
我遇到了重新繪製我的WPF控件的問題。WPF重繪問題
將WPF控件添加爲Windows窗體的ElementHost.Child。
當Windows 7進入powersave模式並恢復正常(通過移動鼠標或鍵盤上的按鍵),Windows窗體控件的其餘部分被重新繪製,但WPF部分未重新繪製(以及Win 7背景在該區域中可見)。
On最小化和最大化應用程序,WPF部分被重新繪製。
任何人有任何關於這個問題的想法?
此問題的解決方案早在MSDN雜誌中提供。它展示瞭如何讓WPF應用程序「瞭解功耗」,即響應電源通知。這是一篇不可思議的文章,也是「必讀文章」。
檢查此鏈接:Make Your WPF Apps Power-Aware
您可以在線瀏覽源代碼或從這裏下載:Code for PowerAware
用到的技術:
我剛纔瀏覽了文章。我不確定這篇文章解決了如何讓窗口刷新,只是如何編寫一個將被調用的函數(您應該在其中插入刷新代碼)。 – 2011-09-15 03:18:53
通常,在Windows窗體中,調用控件的.Invalidate()會導致它重新繪製自己(通過將整個控件的驗證矩形設置爲「髒」,然後讓它異步調用自己的繪畫事件。 - 如果你只是援引的WinForms 畫圖方法,無需無效首先,你將只能重繪先前被標記爲髒的部分 - 如Windows使用Dirty Rectangles approach,以節省時間重繪)
。希望你可以在你的WPF主機控件上調用.Invalidate(),或者直接調用窗體本身的.Invalidate()(例如「this.Invalidate();」)
在窗體上啓用雙緩衝也可能有幫助,但我不確定這一點 - 但這是值得的實驗。
@Hasan上面給你的答案的一部分 - 如何掛鉤到Windows消息泵,並接收窗口電源事件通知 - 但它本身不會導致你的窗口被重新繪製(至少從我可以告訴) - 這更多的是一個通知,說:「嘿,你即將有這個問題,你討厭。糟透了就是你。」
所以這可能就像掛鉤哈桑的消息泵的東西,然後調用「this.Invalidate();」任何時候收到電源事件通知。雖然這個解決方案可能有點矯枉過正。
如果這還不夠,你可能不得不告訴WPF控件本身無效......它不能這樣做,因爲它沒有這個方法。文檔表明.InvalidateVisual()是等價的,但是我的經驗讓我相反。除了在winform級別失效之外,我無法幫助你。如果你找到答案,請發佈!
我不知道這是可能的,但你可以強制WPF通過掛鉤到窗體OnPaint事件重繪自己?我不確定這將如何通過互操作,但值得一試! http://msdn.microsoft.com/en-us/library/system.windows.forms.control.onpaint.aspx – stuartmclark 2011-06-15 14:06:30
不要重寫OnPaint,主機控件已經有一個運行的OnPaint,它只是需要告訴重新繪製自己,例如通過調用Invalidate() - 請參閱下面的帖子以獲取更多信息。 – BrainSlugs83 2011-09-15 03:15:05