WPF的原生控件并不具備自身的句柄,即使使用偏門(mén)的方式獲取的結果也都是控件所在窗體的句柄,并不代表該控件本身的資源,這是由WPF的自身的機制決定的。
csharp
IntPtr hwnd1 = new WindowInteropHelper(this).Handle;
IntPtr hwnd2 = ((HwndSource)PresentationSource.FromVisual(uielement)).Handle;到此需要了解下Winform與WPF的區別,WPF和winform最大的區別在于WPF底層使用的DirectX,winform底層使用的是GDI+,所以WPF的圖形界面上更勝一籌。
GDI+(Graphics Device Interface)圖形設備接口,它的主要任務(wù)是負責繪圖程序之間的信息交換、處理,所有windows程序的圖形輸出
DirectX(Direct Extension)多媒體編程接口,加強3D圖形和聲音效果,有很多API組成。按照性質(zhì)分類(lèi)可分為四大部分:顯示部分,聲音部分,輸入部分和網(wǎng)絡(luò )部分。
當我們直接使用WPF的控件句柄作為OSG等第三方控件的繪制視圖區域時(shí),我們會(huì )發(fā)現視圖區域占據了整個(gè)窗體,這與上面提到的WPF的原生控件并不具備自身的句柄的結論一致。
為解決上述問(wèn)題,在WPF中嵌入第三方控件時(shí),往往需要借助WindowFormsHost控件,使用該控件可以包裹Winform控件,再將Winform的句柄暴露給第三方控件,即可實(shí)現在指定區域進(jìn)行類(lèi)似OSG視圖的繪制。
xml
<WindowsFormsHost Name="FormsHost">
<winform:WebBrowser>
</WindowsFormsHost>三、WindowFormsHost的置頂缺陷
在WPF中調用windowFormsHost的控件時(shí),由于渲染機制的問(wèn)題總會(huì )出現各種問(wèn)題,讓許多人糾結頭疼的便是:
windowFormsHost控件在一個(gè)位置時(shí)會(huì )優(yōu)先顯示,而且完全設置不了順序,永遠在最上邊,WPF原生的控件無(wú)法對其遮蓋,更別說(shuō)透明了
四、解決WindowFormsHost的置頂問(wèn)題
經(jīng)過(guò)層層排除和篩選,最終找到一個(gè)可行方案:Microsoft.DwayneNeed。
訪(fǎng)問(wèn):Microsoft.DwayneNeed下載源碼
使用VS打開(kāi)Microsoft.DwayneNeed.sln解決方案,完成編譯
在WPF項目中添加Microsoft.DwayneNeed.dll引用
在xaml中添加
xml
<xmlns:interop=clr-namespace:Microsoft.DwayneNeed.Interop;assembly=Microsoft.DwayneNeed>
</xmlns>在xaml中使用AirspaceDecorator包裹WindowsFormsHost
完整例子如下
xml
<airspace:AirspaceDecorator AirspaceMode="Redirect" IsInputRedirectionEnabled="True" IsOutputRedirectionEnabled="True">
<WindowsFormsHost Name="FormsHost">
<winform:WebBrowser>
</WindowsFormsHost>
</airspace:AirspaceDecorator>
聯(lián)系客服