2010-02-17 2 views
6

Я использую System.Windows.Controls.WebBrowser для различных вещей в своем приложении, и я заметил, что рекламные ролики отключены, когда они должны появиться через WebBrowser. Я понимаю, что элемент управления WebBrowser на самом деле является оберткой COM-компонента и, вероятно, работает по-разному, но я задавался вопросом, выяснил ли кто-нибудь, как это решить.Показать Adorner над элементом управления WebBrowser

Это проблема, которую я вижу. Здесь у меня есть только образец adorner, который должен нарисовать большой красный круг в верхнем углу чего-то (в качестве образца).

Когда я украшаю WebBrowser с этим, я получаю этот результат:

Я ожидаю увидеть полный круг.

Вот код для этого бесполезного Adorner, в случае, если это полезно:

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, если это имеет значение.

Edit # 2: WebBrowser появляется унаследовать от HwndHost, который я видел еще один вопрос или два в отношении графических элементов и hwndsources, но я все, что выглядит, как я мог бы реализовать для WebControl не видя, но надеюсь, это полезная информация для кого-то.

ответ

2

Это вызвано airspace issues. Поскольку WebBrowser является нативным, а не WPF-элементом управления, нет способа напрямую визуализировать его (или другой контент WPF) поверх него.

Для этого вам нужно использовать какое-то отдельное окно и поместить содержимое в это отдельное окно. Обычно это означает использование прозрачного окна WPF, расположенного поверх главного окна. К сожалению, это не будет таким интегрированным решением, которое обеспечит настоящий встроенный элемент управления WPF.

5

Я не думаю, что это будет работать с Adroner, но вы можете плавать контент через элемент управления WebBroswer, используя прозрачный элемент управления всплывающим окном. Более подробную информацию и образец кода можно найти here.

+0

Да ... Я видел это в другом месте. Похоже, это потому, что всплывающее окно также является hwnd, так что это удобно. Единственное, что здесь происходит, это обрезание украшений, предназначенных для украшения других объектов вокруг него. Я обновлю свой ответ, чтобы отразить это. Очень хорошее предложение, хотя ... Я мог бы увидеть, как обернуть моего торговца в hwnd. –

1

Попробуйте использовать другой transparent TOP LEVEL overlay window. Поддерживается только в Windows 2000 или выше, Win9x не имеет многоуровневых окон.

Смежные вопросы