2016-11-26 67 views
1

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

应用布局:我想

Application Layout Image

代码:

装饰器类

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])); 
     } 

是否有任何可能的方式来绘制在WindowsFormsHost内的控制矩形?

在此先感谢。

+1

请参阅:http://stackoverflow.com/q/9920480/1136211 – Clemens

回答

0

正如Clemens的评论中指出的那样,WindowsFormsHost与窗口的其余部分分开呈现,并且必要时它会呈现在窗口顶部。乍一看,这似乎是一个设计限制,你无法做任何事情;然而,这并不完全正确。

如果在第一层上添加第二层,只需在第二层上添加第三层即可。另一个窗口或弹出窗口可以在WindowsFormsHost的顶部渲染,并且您必须跳过一些环节才能使它看起来像是同一个窗口的一部分 - 确保一切都在同时移动,最小化和恢复,等 - 这当然是可以的。

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