轉(zhuǎn)帖|其它|編輯:郝浩|2011-05-26 14:44:48.000|閱讀 3697 次
概述:WPF本身并沒有提供WPF實現(xiàn),但是有個簡單的方法可以實現(xiàn)MDI方法。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
WPF本身并沒有提供MDI實現(xiàn),但是有個簡單的方法可以實現(xiàn)MDI方法。
第一步:添加引用API方法
第二步:子父窗口設置
雖然實現(xiàn)了MDI窗口,但是還有一些問題:先設置好主窗口背景圖片(為了能演示出效果),然后創(chuàng)建一個子窗口,當移動子窗口時,子窗口的邊緣產(chǎn)生了花屏效果。
分析了原因,應該是當窗口移動時,渲染產(chǎn)生了問題。所以我迫切希望在子窗口的LocationChanged事件中重繪,WPF中沒有Invalidate方法,試了很多方法也沒有成功。請教高手如何解決這個問題,或者如何重繪子窗口,使其邊緣不產(chǎn)生花屏效果。
我的臨時解決方案:我發(fā)現(xiàn)當窗口大小發(fā)生變化后,窗口會自動重繪,邊緣的花屏也就沒了,正常了。于是我在LocationChanged事件中更改窗口大小
微軟論壇對于該問題的回答:
很遺憾的是,WPF本身沒有實現(xiàn)MDI,所以你會想到用Host的方式,將一個窗體的句柄設置為另一窗體的子窗體 (調(diào)用 SetParent API)
這一點就會引起問題,WPF不同于一般的Win32程序,本身內(nèi)容是沒有句柄的,因為它通過DX去實現(xiàn)繪制,所以消息循環(huán)就不同于Win32的窗體了,不能有一個消息隊列來對應每一個組件,來各自處理不同的消息,來處理每一次的重繪消息。何況,WPF使用DX后,為了提高性能,緩存了大量的UI信息,使并不是每次窗體區(qū)域被遮住或者改變都要進行重繪的,所以上述兩點就很顯然會導致大小改變的時候邊緣有無效區(qū)域或者花屏產(chǎn)生。
你的臨時方案是可行的,但是我還是要推薦你使用下面的WPF MDI解決方案://wpfmdi.codeplex.com/
他已經(jīng)很好的實現(xiàn)了父子窗體間的消息傳遞了。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務必注明出處、不得修改原文相關鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:CSDN學生大本營