在WebBrowser控件上显示Adorner

时间:2010-02-17 19:04:29

标签: wpf com webbrowser-control hwnd adorner

我正在使用System.Windows.Controls.WebBrowser来处理我的应用程序中的各种内容,我注意到当它们应该出现在WebBrowser上时,装饰器会被切断。我意识到WebBrowser控件实际上是一个COM组件的包装器,可能呈现不同的方式,但我想知道是否有人想出如何解决这个问题。

这是我看到的问题。在这里,我只有一个样本装饰器,它应该在某个东西的顶角绘制一个大的红色圆圈(作为样本)。

当我用这个装饰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,我已经看到了关于adorners和hwndsources的另外一两个问题,但是我没有看到任何看起来像我可以为WebControl实现它的东西,但是希望这对某人来说是有用的信息。

4 个答案:

答案 0 :(得分:5)

我认为这不适用于Adroner,但您可以使用透明的Popup控件在WebBroswer控件上浮动内容。可以找到更多详细信息和代码示例here

答案 1 :(得分:3)

在这里,我的博客post介绍了library我写的用于在任何hwnd上分层WPF装饰。一个简单的Web浏览器演示如下所示: snapshot http://i58.tinypic.com/kej3bd.png

答案 2 :(得分:2)

这是由airspace issues引起的。由于WebBrowser是原生的非WPF控件,因此无法直接在其上呈现装饰器(或其他WPF内容)。

为此,您需要使用某种单独的窗口,并将内容放入单独的窗口中。这通常意味着使用分层在主窗口顶部的透明WPF窗口。不幸的是,这不会像真正的原生WPF控件那样集成解决方案。

答案 3 :(得分:1)

尝试使用其他transparent TOP LEVEL overlay window。仅在Windows 2000或更高版本上受支持,当然,Win9x没有分层窗口。