7

我在我的应用程序中使用 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,我已经看到另一个或两个关于装饰器和 hwndsources 的问题,但我没有看到任何看起来我可以为 WebControl 实现它的东西,但希望这是有用的信息某人。

4

4 回答 4

5

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

于 2010-02-17T19:31:27.930 回答
3

这是我的博客文章,介绍了我为在任何 hwnd 上分层 WPF 装饰器而编写的库。一个简单的 Web 浏览器演示如下所示: 快照

于 2014-12-24T10:53:03.487 回答
2

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

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

于 2010-10-26T20:42:50.100 回答
1

尝试使用另一个透明的 TOP LEVEL 覆盖窗口。当然只支持 Windows 2000 或更高版本,Win9x 没有分层窗口。

于 2010-02-27T18:09:57.227 回答