如何 “解決” WPF中空域問題(Airspace issuse)


空域問題是由於Winform與WPF在底層渲染機制上有所區別而導致的。多數情況下,開發者為了實現不規則的窗體並承載Winform控件時,遇到此類問題。當WPF窗體設置為允許透明(也就是AllowsTransparency=True)時,Winform Control 會出現不顯示等情況,為了避免此問題,許多UI框架在實現不規則窗體時,用Win32 API 去實現不規則窗體的一些特效,比如透明,圓角等,這樣WPF窗口的AllowsTransparency屬性就可以設為FALSE,從而繞過了空域問題。但對於沒有接觸過Window底層開發的同學開發成本會比較高,而且有些特殊情況下,必須設AllowsTransparency為True時,該如何解決?

  • 第一種也是網絡上最普遍的方法,簡單說就是內嵌窗體,這個方法就不再說明。
  • 第二種也是我解決此問題的方法,使用第三方庫解決空域的問題

利用第三方庫解決空域問題

Microsoft.DwayneNeed(
https://microsoftdwayneneed.codeplex.com/
),這個庫在其項目介紹里也寫到

Mitigating "airspace" issues in WPF applications.

可能看出這個庫也不能完美的解決空域的問題,也只能等微軟去完善此問題了。
以Winform中強大的WebBrower為例,簡單說一下使用方法:

  • 新建WPF窗體項目並添加Microsoft.DwayneNeed.dll與Microsoft.DwayneNeed.Win32.dll的引用
  • 添加 xmlns:airspace="clr-namespace:Microsoft.DwayneNeed.Interop;assembly=Microsoft.DwayneNeed"的聲明
<airspace:AirspaceDecorator AirspaceMode="Redirect" IsInputRedirectionEnabled="True" IsOutputRedirectionEnabled="True">
        <WindowsFormsHost Name="FormsHost">
            <winform:WebBrowser/>
        </WindowsFormsHost>
</airspace:AirspaceDecorator>

結束

這種方法是不是使用起來簡單多了呢? 如果你有更好的解決方法,也要給大家分享哦!

鏈接分享

互操作性 https://msdn.microsoft.com/zh-cn/library/aa970688.aspx
使用內嵌窗體解決空域問題 http://blog.csdn.net/hikaliv/article/details/5922871
Microsoft.DwayneNeed https://microsoftdwayneneed.codeplex.com/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM