C# OnRender()方法中的DrawGeometry()

C# OnRender()方法中的DrawGeometry(),c#,wpf,user-controls,render,visualbrush,C#,Wpf,User Controls,Render,Visualbrush,我有一个UserControl,它覆盖OnRender方法,如下所示: MyUsercontrol.cs: MyUserControl: UserControl { protected override void OnRender(DrawingContext dc) { dc.DrawRectangle(Brushes.White, new Pen(Brushes.Black,1), new Rect(0,10,50,30)); var visua

我有一个UserControl,它覆盖OnRender方法,如下所示:

MyUsercontrol.cs:

MyUserControl: UserControl
{
    protected override void OnRender(DrawingContext dc)
    {
       dc.DrawRectangle(Brushes.White, new Pen(Brushes.Black,1), new Rect(0,10,50,30));

       var visualBrush = new VisualBrush(new UserControl1{Height=30, Width=50});           
       dc.DrawGeometry(visualBrush, null, new RectangleGeometry(new Rect(50,10,50,30)));           
    }
}
上面使用的UserControl如下所示(在xaml中定义,没有额外的代码隐藏代码):



看到大小不同的矩形的原因很简单。当你用钢笔画一个长方形时,笔线以矩形的边缘为中心,或者换句话说,边缘位于直线的中间。因此,画笔宽度的一半位于每个方向的矩形之外。因此,您必须在矩形的宽度和高度中添加一个笔宽,以获得图形输出的总大小,在您的示例中为51 x 31


您也许可以通过以下方法检查此问题。

您指的是什么透明边框?如果这真的是在两个矩形的顶部绘制,这是最复杂和最令人困惑的方法。左边的用户控件(带圆角)比右边的小。在我看来,dc.DrawGeometry()即使传递了“null”,也要使用钢笔。也许这看起来很复杂。事实上,我只想在OnRender()方法期间将UserControl放入另一个。是的,还有其他(更好的)方法可以使用UserControl(比如在xaml中)。但是我只修改了使用这种机制的现有用户控件。
<UserControl x:Class="VisualBrushExample.UserControl1" ...>
<Grid>
   <Border BorderThickness="1" BorderBrush="Black" Background="White" CornerRadius=8,0,0,8"/>
</Grid>
</UserControl>