我在我的应用程序中使用System.Windows.Controls.WebBrowser进行各种操作,并且我注意到,当它们应该出现在WebBrowser上时,装饰者被切断。我意识到WebBrowser控件实际上是COM组件的包装,可能呈现不同,但我想知道是否有人想出了如何解决这个问题。通过WebBrowser控件显示Adorner
这是我看到的问题。在这里,我只是一个样本装饰者,应该在东西的顶角绘制一个大红色圆圈(作为示例)。
当我装饰与此web浏览器,我得到这样的结果:
我希望看到完整的圆。
下面是这个不值钱的装饰器的代码,因为是有帮助的情况下:
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:web浏览器似乎从HwndHost,这是我见过的关于装饰器和hwndsources另外两个问题继承,但我没有看到任何东西,看起来像我可以实现它的Web控件,但希望这是对某人有用的信息。
是的......我在其他地方看到过。看起来这是因为弹出窗口也是hwnd,所以这很方便。 这里唯一的东西就是切断装饰物来装饰周围的其他物体。我会更新我的答案以反映这一点。非常好的建议,虽然...我可能会看到关于在hwnd包装我的装饰。 – 2010-02-17 20:34:31