Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法使用WPF中的装饰器在WindowsFormsHost上绘制矩形_C#_Wpf_Winforms_Adorner_Windowsformshost - Fatal编程技术网

C# 无法使用WPF中的装饰器在WindowsFormsHost上绘制矩形

C# 无法使用WPF中的装饰器在WindowsFormsHost上绘制矩形,c#,wpf,winforms,adorner,windowsformshost,C#,Wpf,Winforms,Adorner,Windowsformshost,在我的WPF应用程序中,我在一个网格中添加了WindowsFormsHost,我想在WinFormsHost中的控件上绘制一个矩形 应用程序布局: 我正在尝试的代码: 装饰类 添加装饰器的代码 是否有任何可能的方法在WindowsFormsHost内的控件上绘制矩形 提前感谢。正如Clemens在评论中所指出的,WindowsFormsHost与窗口的其余部分分开呈现,并且需要在窗口顶部呈现。乍一看,这似乎是一个设计限制,对此你无能为力;然而,严格来说,这不是事实 如果在第一层之上添加了第二层

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

应用程序布局:

我正在尝试的代码:

装饰类

添加装饰器的代码

是否有任何可能的方法在WindowsFormsHost内的控件上绘制矩形


提前感谢。

正如Clemens在评论中所指出的,WindowsFormsHost与窗口的其余部分分开呈现,并且需要在窗口顶部呈现。乍一看,这似乎是一个设计限制,对此你无能为力;然而,严格来说,这不是事实

如果在第一层之上添加了第二层,只需在第二层之上添加第三层即可。另一个窗口或弹出窗口可以呈现在WindowsFormsHost的顶部,虽然您必须跳过一些环,使其看起来像是同一个窗口的一部分--确保所有内容同时移动、最小化和恢复,等等--但确实可以这样做


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

正如Clemens在评论中所指出的,WindowsFormsHost与窗口的其余部分分开呈现,并且需要在窗口顶部呈现。乍一看,这似乎是一个设计限制,对此你无能为力;然而,严格来说,这不是事实

如果在第一层之上添加了第二层,只需在第二层之上添加第三层即可。另一个窗口或弹出窗口可以呈现在WindowsFormsHost的顶部,虽然您必须跳过一些环,使其看起来像是同一个窗口的一部分--确保所有内容同时移动、最小化和恢复,等等--但确实可以这样做

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

请参阅此处:请参阅此处:
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]));
        }