7

アプリのさまざまなことに System.Windows.Controls.WebBrowser を使用していますが、WebBrowser に表示されるはずの装飾が切り取られていることに気付きました。WebBrowser コントロールは実際には COM コンポーネントのラッパーであり、おそらくレンダリングが異なることを認識していますが、これを解決する方法を誰かが理解しているかどうか疑問に思いました。

これが私が見ている問題です。ここでは、何かの上隅に (サンプルとして) 大きな赤い円を描画することになっているサンプル adorner を示します。

これで WebBrowser を装飾すると、次の結果が得られます。

私は完全な円を見ることを期待しています。

役立つ場合に備えて、この価値のない装飾者のコードを次に示します。

public class SillyAdorner : Adorner
{
    public SillyAdorner(UIElement element) : base(element)
    {

    }
    protected override void OnRender(DrawingContext drawingContext)
    {
        drawingContext.DrawEllipse(new SolidColorBrush(Colors.Red), new Pen(), new Point(7, 7), 30, 30);
        base.OnRender(drawingContext);
    }
}

そして、これをホスト コントロールの OnRender メソッドでブラウザーに適用する方法を次に示します。

    protected override void OnRender(DrawingContext drawingContext)
    {
        base.OnRender(drawingContext);            
        var layer = AdornerLayer.GetAdornerLayer(browser);
        layer.Add(new SillyAdorner(browser));
    }

これに対するハックや回避策はありますか?

編集:それが違いを生む場合、私は.NET 4.0を使用しています。

編集 #2: WebBrowser は HwndHost から継承しているように見えます。これは、アドナーと hwndsources に関する別の質問を 1 つまたは 2 つ見たことがありますが、WebControl に実装できるように見えるものは何も見られませんが、うまくいけば、これは有益な情報です誰か。

4

4 に答える 4

5

Adroner では機能しないと思いますが、透過的な Popup コントロールを使用して、WebBroswer コントロール上にコンテンツをフロートさせることができます。詳細とコード サンプルは、こちらにあります

于 2010-02-17T19:31:27.930 に答える
3

これは、任意の hwnd に WPF 装飾をレイヤー化するために作成したライブラリを紹介する私のブログ投稿です。簡単な Web ブラウザのデモは次のようになります。 スナップショット

于 2014-12-24T10:53:03.487 に答える
2

これは空域の問題が原因です。WebBrowser はネイティブの非 WPF コントロールであるため、その上に装飾 (または他の WPF コンテンツ) を直接レンダリングする方法はありません。

これを行うには、何らかの別のウィンドウを使用し、その別のウィンドウにコンテンツを配置する必要があります。これは通常、メイン ウィンドウの上部にレイヤー化された透明な WPF ウィンドウを使用することを意味します。残念ながら、これは真のネイティブ WPF コントロールが提供するほどにはソリューションに統合されません。

于 2010-10-26T20:42:50.100 に答える
1

別の透明な TOP LEVEL オーバーレイ ウィンドウを使用してみてください。もちろん、Windows 2000 以降でのみサポートされます。Win9x には階層化されたウィンドウがありません。

于 2010-02-27T18:09:57.227 に答える