在WebBrowser控件上显示Adorner

And*_*mes 6 com wpf hwnd adorner webbrowser-control

我在我的应用程序中使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是我在主机控件的OnRender方法中将其应用于浏览器的方法:

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

有没有任何黑客或解决方法?

编辑:我正在使用.NET 4.0,如果这有所作为.

编辑#2:WebBrowser似乎继承自HwndHost,我已经看到了关于adorners和hwndsources的另外一两个问题,但我没有看到任何看起来像我可以为WebControl实现它的东西,但希望这是有用的信息有人.

Joh*_*zek 5

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


Ree*_*sey 2

这是由空域问题引起的。由于 WebBrowser 是本机非 WPF 控件,因此无法直接在其上呈现装饰器(或其他 WPF 内容)。

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