我正在使用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实现它的东西,但是希望这对某人来说是有用的信息。
答案 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没有分层窗口。