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