无法在WPF中使用Adorners在WindowsFormsHost上绘制矩形

时间:2016-11-26 09:20:46

标签: c# wpf winforms adorner windowsformshost

在我的WPF应用程序中,我在一个网格中添加了WindowsFormsHost,我想在WinFormsHost内的控件上绘制一个矩形。

应用程序布局:

Application Layout Image

我正在尝试的代码:

Adorner Class

public class SimpleRectAdorner : Adorner
    {
        // Be sure to call the base class constructor.
        public SimpleRectAdorner(UIElement adornedElement)
          : base(adornedElement)
        {
        }

        // A common way to implement an adorner's rendering behavior is to override the OnRender
        // method, which is called by the layout system as part of a rendering pass.
        protected override void OnRender(DrawingContext drawingContext)
        {
            Rect adornedElementRect = new Rect(this.AdornedElement.DesiredSize);

            // Some arbitrary drawing implements.
            SolidColorBrush renderBrush = new SolidColorBrush(Colors.Green);
            renderBrush.Opacity = 0.2;
            Pen renderPen = new Pen(new SolidColorBrush(Colors.Navy), 1.5);

            // Draw a circle at each corner.
            Rect rect = new Rect(new Point(adornedElementRect.TopLeft.X, adornedElementRect.TopLeft.Y + 50), new Size(150, 50));
            drawingContext.DrawRectangle(renderBrush, renderPen, rect);
        }
    }

添加广告的代码

 private void btnDraw_Click(object sender, RoutedEventArgs e)
        {
            AdornerLayer.GetAdornerLayer(viewerGrid.Children[0]).Add(new SimpleRectAdorner(viewerGrid.Children[0]));
        }

是否有任何可能的方法在ControlForntWost中绘制一个矩形?

提前致谢。

1 个答案:

答案 0 :(得分:0)

正如Clemens的评论中所指出的,WindowsFormsHost与Window的其余部分分开呈现,并且必然会在Window的顶部呈现。乍一看,这似乎是一个设计限制,你无能为力;但是,这并不完全正确。

如果在第一层上添加第二层,只需在第二层上添加第三层。另一个窗口或弹出窗口可以渲染到WindowsFormsHost的顶部,而你将不得不跳过一些箍,使它看起来像是同一个窗口的一部分 - 确保一切都在同一时间移动,最小化和恢复,等等 - 当然可以这样做。

您可以在第三层中使用透明度,以允许显示和访问WindowsFormsHost中的内容。例如,您可以在WPF弹出窗口中将AllowTransparency设置为true。这将是一项额外的工作,但如果你绝对需要这个功能,你可以做到。