2010-02-17 24 views
6

Estoy usando el System.Windows.Controls.WebBrowser para varias cosas en mi aplicación y me he dado cuenta de que los adornos se cortan cuando se supone que aparecen sobre un WebBrowser. Me doy cuenta de que el control WebBrowser es realmente una envoltura alrededor de un componente COM y, probablemente, rinde de manera diferente, pero me preguntaba si alguien descubrió cómo resolver esto.Mostrar un Adorner sobre un control WebBrowser

Este es el problema que estoy viendo. Aquí tengo un adorno de muestra que se supone que dibuja un gran círculo rojo en la esquina superior de algo (como muestra).

Cuando adornar el WebBrowser con esto, puedo obtener este resultado:

espero ver el círculo completo.

Aquí está el código para este adorner sin valor, en caso de que sea útil:

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

Y aquí es cómo lo aplico al navegador en el método OnRender del control de host:

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

¿Alguien tiene hacks o soluciones para esto?

Editar: Estoy usando .NET 4.0, si eso hace la diferencia.

Edición # 2: WebBrowser parece heredar de HwndHost, lo que he visto otra pregunta o dos con respecto adorners y hwndsources, pero no estoy viendo todo lo que parece como si pudiera ponerlo en práctica para el WebControl, pero con suerte esta es información útil para alguien.

Respuesta

2

Esto es causado por airspace issues. Como WebBrowser es un control nativo que no pertenece a WPF, no hay forma de procesar directamente adornos (u otro contenido de WPF) encima.

Para hacer esto, necesita usar una ventana separada de algún tipo, y poner el contenido en esa ventana separada. Esto normalmente significa usar una ventana WPF transparente en capas sobre la parte superior de la ventana principal. Desafortunadamente, esto no será tan integrado de una solución como lo proporcionaría un verdadero control nativo de WPF.

5

No creo que funcione con un Adroner, pero puede flotar contenido sobre un control WebBroswer usando un control emergente transparente. Se pueden encontrar más detalles y un ejemplo de código here.

+0

Sí ... lo había visto en otro lugar. Parece que esto se debe a que una ventana emergente también es un hwnd, así que es útil. Lo único aquí es que se cortan adornos destinados a decorar otros objetos a su alrededor. Actualizaré mi respuesta para reflejar esto. Muy buena sugerencia, sin embargo ... Podría ver cómo envolver mi adorno en hwnd. –

Cuestiones relacionadas