WPFのウェブブラウザでWebBrowserコントロールは、すべてのコントロールの前でそうHwndHostを使用します。だから、ウェブブラウザは、コントロールのすべての同じレベルをカバーします。
今、この状況は、Win32APIのを使用することによって回避することができます。
最も重要なのは、これらのWin32APIです。
[DLLIMPORT(" user32.dllの" )] パブリック 静的 にextern BOOL SetWindowRgn(のIntPtr hWndは、のIntPtr HRGN、BOOL 再描画)。 [DLLIMPORT(" GDI32.DLL " )] パブリック 静的 にexternのIntPtr CreateRectRgn(int型左、int型トップ、int型 RectRightBottom_X、int型RectRightBottom_Y)。 [DLLIMPORT(" GDI32.DLL " )] パブリック 静的 にextern int型CombineRgn(のIntPtr hrgnDst、のIntPtr hrgnSrc1、のIntPtr hrgnSrc2、int型 iモード)。
[DLLIMPORT( "GDI32.DLL")]
パブリック静的にextern BOOL DeleteObjectの(のIntPtr objectHandle)。
何かの適切なを言います:
setwindowrgnアクティブ描画領域が設けられています。
createrectrgnは、四角形を作成することです
これは、2つの長方形の統合ですcombinergn、缶組合、交差点やSRC1一部SRC2は、最終的な結果でしょうhrgnDstには、含まれていません。
全体のイベントは、有効な描画領域を設定し続けるために使用WebBrowserコントロールの親をsizechangedました。
直接コード上のI、
Win32APIのクラス
[DLLIMPORT(" User32.dllの" )] パブリック 静的 にextern BOOL SetWindowRgn(のIntPtr hWndは、のIntPtr HRGN、BOOL 再描画); /// <まとめ> /// 矩形を作成するには、4つのパラメータは、元々のX1、Y1、X2とY2の意味であります左上のX1、Y1座標、右コーナーX2を下げ、Y2座標、便宜上、私はWPFを使用するが変更された /// 左矩形平均距離は左 /// 矩形との距離の上部縁ことトップ手段 /// rectrightbottom_x X矩形手段の右下隅の座標 /// rectrightbottom_y手段Yは、矩形の右下隅の座標 /// </要約> /// <PARAM名=「左」> </ PARAM> /// <PARAM NAME = "トップ「> </ param>の /// <PARAM名= "RectRightBottom_X"> </ PARAM> /// <PARAM NAME = "RectRightBottom_Y"> </ PARAM> /// <戻る> </戻り> [DLLIMPORT(" GDI32.DLL " )] パブリック 静的 EXTERN IntPtr CreateRectRgn(int型左、int型トップ、int型 RectRightBottom_X、int型RectRightBottom_Y)。
[DLLIMPORT( "GDI32.DLL")]
パブリック静的にextern BOOL DeleteObjectの(のIntPtr objectHandle)。
[DLLIMPORT(" GDI32.DLL " CombineRgn(のIntPtr hrgnDst、のIntPtr hrgnSrc1、のIntPtr hrgnSrc2、INT iモード); // マージオプション: // 。RGN_AND = 1; // RGN_OR = 2; // 。RGN_XOR = 3; // 。RGN_DIFF = 4; // 。RGN_COPY = 5。 } {領域をコピーします
追加のプロパティカテゴリ:
クラスATCH { パブリック 静的 読み取り専用たDependencyProperty PanelProperty = DependencyProperty.RegisterAttached(" パネル"、typeof演算(パネル)、typeof演算(ATCH)、新しい PropertyMetadata(NULL ))。 パブリック 静的 ボイド SetPanel(のDependencyObjectのD、パネル値)=> d.SetValue(PanelProperty、値)。 パブリック 静的パネルGetPanel(のDependencyObjectのD)=> (パネル)d.GetValue(PanelProperty)。 公共の 静的な 読み取り専用のDependencyProperty NameProperty = DependencyProperty.RegisterAttached(" 名前"、typeof演算(のFrameworkElement)、typeof演算(ATCH)、新しい PropertyMetadata(ヌル、新しいPropertyChangedCallback(OnNamePropertyChanged))); パブリック 静的 ボイド SetNameメソッド(のDependencyObject D、FrameworkElementの値)=> d.SetValue(NameProperty、値)。 パブリック 静的のFrameworkElement関連項目GetName(のDependencyObjectのD)=> (のFrameworkElement)d.GetValue(NameProperty)。 プライベート 静的 ボイドはOnNamePropertyChanged(のDependencyObject dを、DependencyPropertyChangedEventArgs電子) { VAR = Bd.GetValue(PanelProperty)。 もし(bがある ヌル!||(bがあるパネル)|| e.NewValueがある nullの) リターン。 VaRのパネル= B としてパネル。 VaRのウェブ= D などのWebブラウザー。 VAR UI = e.NewValue などのFrameworkElement。 SetRect(パネル、ウェブ、UI); panel.SizeChanged + =(送信者、引数)=> { SetRect(パネル、ウェブ、UI)。 }。 } プライベート静的のIntPtr C1。 プライベート 静的 無効SetRect(パネルパネル、Webブラウザーウェブ、FrameworkElementのUI) { のIntPtrハンドル = web.Handle。 Win32API.DeleteObject(C1)。 Win32API.SetWindowRgn(ハンドル、IntPtr.Zero、真の); RECT PanelRect = 新しいのRect(新サイズ(panel.ActualWidth、panel.ActualHeight)); C1 = Win32API.CreateRectRgn((INT)0、(INT)0、(INT)PanelRect.BottomRight.X、(INT )PanelRect.BottomRight.Y)。 RECT UIRect= 新しいのRect(新サイズ(ui.ActualWidth、ui.ActualHeight)); VAR D1 =(int型)ui.TransformToAncestor(パネル).Transform(新しいポイント(0、0 ))、X。 VAR D2 =(INT)ui.TransformToAncestor(パネル).Transform(新しいポイント(0、0 ))、Y。 VAR D3 =(INT)(D1 + UIRect.Width)。 VAR D4 =(INT)(D2 + UIRect.Height)。 VAR C2 = Win32API.CreateRectRgn(D1、D2、D3、D4)。 Win32API.CombineRgn(C1、C1、C2、4 )。 Win32API.SetWindowRgn(ハンドル、C1、真)。 } }
コードXAML
<グリッド> <WEBブラウザソース= " http://www.baidu.com " ローカル:ATCH.Panel = " {RelativeSourceバインディング= {RelativeSourceモード= FindAncestor、AncestorLevel = 1、AncestorType =グリッド}} "ローカル:ATCH.Name = " {バインディングのElementName = BTN} " /> <ボタンX:NAME = " BTN "高さ= " 50 "幅= " 100 "コンテンツ= " 覆盖测试" /> </グリッド>
スクリーンショット1:
スクリーンショット2: