2010-02-17 13 views
6

Sto utilizzando System.Windows.Controls.WebBrowser per varie cose nella mia app e ho notato che gli ornamenti sono tagliati quando devono apparire su un browser web. Mi rendo conto che il controllo WebBrowser è davvero un involucro attorno a un componente COM e probabilmente lo rende in modo diverso, ma mi chiedevo se qualcuno avesse capito come risolverlo.Visualizzazione di un frontatore su un controllo WebBrowser

Questo è il problema che sto vedendo. Qui ho solo un sample adorner che dovrebbe disegnare un grande cerchio rosso nell'angolo in alto di qualcosa (come esempio).

Quando adornano il browser web con questo, ottengo questo risultato:

Mi aspetto di vedere il cerchio completo.

Ecco il codice per questo strumento decorativo privo di valore, nel caso in cui è utile:

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

Ed ecco come l'applico al browser nel metodo OnRender del controllo host:

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

Chiunque ha qualche hack o soluzione alternativa per questo?

Modifica: sto usando .NET 4.0, se questo fa la differenza.

Edit # 2: browser web sembra ereditare da HwndHost, che ho visto un altro paio di domande per quanto riguarda adorners e hwndsources, ma io non sto vedendo tutto ciò che sembra come se avessi potuto attuarlo per il WebControl, ma si spera che questa sia un'informazione utile per qualcuno.

risposta

2

Questo è causato da airspace issues. Poiché un WebBrowser è un controllo nativo non WPF, non è possibile eseguire il rendering diretto degli adorners (o di altri contenuti WPF) su di esso.

Per fare ciò, è necessario utilizzare una finestra separata di qualche tipo e inserire il contenuto in quella finestra separata. Questo in genere significa utilizzare una finestra WPF trasparente sovrapposta alla parte superiore della finestra principale. Sfortunatamente, questo non sarà integrato come soluzione di un vero controllo WPF nativo.

5

Non penso che funzionerà con un Adroner, ma è possibile spostare il contenuto su un controllo WebBroswer usando un controllo Popup trasparente. Maggiori dettagli e un esempio di codice possono essere trovati here.

+0

Sì ... l'avevo già visto altrove. Sembra che questo sia dovuto al fatto che un popup è un hwnd, quindi è comodo. L'unica cosa qui è che è tagliare gli ornamenti destinati a decorare altri oggetti intorno ad esso. Aggiornerò la mia risposta per riflettere questo Un ottimo consiglio però ... Potrei vedere di avvolgere il mio adornatore in una massa. –

Problemi correlati