2010-02-17 10 views
6

Ich verwende den System.Windows.Controls.WebBrowser für verschiedene Dinge in meiner App und ich habe festgestellt, dass Adorner abgeschnitten sind, wenn sie über einen WebBrowser angezeigt werden sollen. Ich stelle fest, dass das WebBrowser-Steuerelement wirklich ein Wrapper um eine COM-Komponente ist und wahrscheinlich unterschiedlich rendert, aber ich fragte mich, ob jemand herausgefunden hat, wie das zu lösen ist.Anzeigen eines Adorner über ein WebBrowser Steuerelement

Das ist das Problem, das ich sehe. Hier habe ich nur einen Beispiel-Adorner, der einen großen roten Kreis in der oberen Ecke von etwas (als Beispiel) zeichnen soll.

Als ich das WebBrowser mit diesem schmücken, ich dieses Ergebnis:

Ich erwarte, dass der Kreis zu sehen.

Hier ist der Code für diesen wertlos adorner, falls die hilfreich ist:

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); 
    } 
} 

Und hier ist, wie ich es an den Browser in der OnRender Methode der Host-Steuerung anwenden:

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

Hat jemand irgendwelche Hacks oder Workarounds dafür?

Edit: Ich benutze .NET 4.0, wenn das einen Unterschied macht.

Edit # 2: WebBrowser erscheint von HwndHost zu erben, was ich noch eine Frage oder zwei bezüglich Adornern und hwndsources gesehen habe, aber ich sehe nichts, das aussieht wie ich es für die WebControl implementieren könnte, aber hoffentlich ist das eine nützliche Information für jemanden.

Antwort

2

Dies wird durch airspace issues verursacht. Da ein WebBrowser ein systemeigenes Steuerelement ohne WPF-Steuerung ist, können keine Adorner (oder anderer WPF-Inhalt) direkt darauf gerendert werden.

Um dies zu tun, müssen Sie ein separates Fenster von irgendeiner Art verwenden, und legen Sie den Inhalt in diesem separaten Fenster. Dies bedeutet normalerweise, dass Sie ein transparentes WPF-Fenster verwenden, das über dem Hauptfenster liegt. Leider wird dies nicht so integriert sein wie eine echte native WPF-Steuerung.

5

Ich glaube nicht, dass das mit einem Adroner funktioniert, aber Sie können Inhalt über ein WebBroswewer Steuerelement mithilfe eines transparenten Popup-Steuerelements übertragen. Weitere Details und ein Codebeispiel finden Sie unter here.

+0

Ja .... Ich hatte das anderswo gesehen. Es sieht so aus, als wäre ein Popup auch ein hwnd, also ist es praktisch. Das einzige, was hier ist, ist, dass ausgeschnitten Adorners um andere Objekte um ihn zu dekorieren. Ich werde meine Antwort aktualisieren, um dies zu reflektieren. Sehr guter Vorschlag, obwohl ... Ich könnte sehen, wie ich meinen Adorner in einem hwnd verpacke. –

Verwandte Themen