2010-02-17 78 views
6

我在我的应用程序中使用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控件,但希望这是对某人有用的信息。

回答

2

这是由airspace issues造成的。由于WebBrowser是本机非WPF控件,因此无法在其上直接渲染装饰(或其他WPF内容)。

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

5

我不认为这将适用于Adroner,但您可以使用透明的Popup控件将内容通过WebBroswer控件浮动。更多细节和代码示例可参见here

+0

是的......我在其他地方看到过。看起来这是因为弹出窗口也是hwnd,所以这很方便。 这里唯一的东西就是切断装饰物来装饰周围的其他物体。我会更新我的答案以反映这一点。非常好的建议,虽然...我可能会看到关于在hwnd包装我的装饰。 – 2010-02-17 20:34:31