C# 画布大小作为所包含元素的边界框

C# 画布大小作为所包含元素的边界框,c#,wpf,C#,Wpf,我正在实现一个用户控件,它是一个用于排列形状的视图,可以用鼠标移动和缩放,无论是整体还是单独。用户控件包含一个“根”画布,形状将添加到该画布中,其渲染变换确定其在视图中的位置和大小 我希望能够将画布的背景设置为一个矩形,该矩形包围了它包含的所有形状。这可能吗?当然,我可以设置宽度和高度属性,但它们似乎只从原点开始计算。但是形状也可以放置在相对于画布原点的负坐标上,因此画布的背景矩形也必须从负坐标开始 Canvas cnv = new Canvas(); // show the canvas' d

我正在实现一个用户控件,它是一个用于排列形状的视图,可以用鼠标移动和缩放,无论是整体还是单独。用户控件包含一个“根”画布,形状将添加到该画布中,其渲染变换确定其在视图中的位置和大小

我希望能够将画布的背景设置为一个矩形,该矩形包围了它包含的所有形状。这可能吗?当然,我可以设置宽度和高度属性,但它们似乎只从原点开始计算。但是形状也可以放置在相对于画布原点的负坐标上,因此画布的背景矩形也必须从负坐标开始

Canvas cnv = new Canvas();
// show the canvas' dimensions
cnv.Background = Brushes.AliceBlue;

for (int i = -5; i < 5; i++)
{
    for (int j = -5; j < 5; j++)
    {
        Rectangle newRectangle = new Rectangle();
        cnv.Children.Add(newRectangle);
        newRectangle.Width = 7;
        newRectangle.Height = 7;
        newRectangle.Fill = Brushes.Green;
        Canvas.SetTop(newRectangle, j * 10);
        Canvas.SetLeft(newRectangle, i * 10);
    }
}

// these are the right bounding dimensions, but with the wrong origin
cnv.Width = 107;
cnv.Height = 107;

// nothing available like that?
// cnv.Left = -50;
// cnv.Top= -50;
Canvas cnv=newcanvas();
//显示画布的尺寸
cnv.Background=brusks.AliceBlue;
for(int i=-5;i<5;i++)
{
对于(int j=-5;j<5;j++)
{
矩形newRectangle=新矩形();
cnv.Children.Add(new矩形);
新矩形。宽度=7;
newRectangle.Height=7;
newRectangle.Fill=画笔.Green;
Canvas.SetTop(新矩形,j*10);
Canvas.SetLeft(new矩形,i*10);
}
}
//这些是正确的边界标注,但原点错误
cnv.宽度=107;
cnv.高度=107;
//没有这样的吗?
//左cnv=-50;
//cnv.Top=-50;

当然,如果一切都失败了,我可以为边界添加另一个矩形。

画布是透明的,为什么不将其堆叠在网格中的矩形顶部:

<Grid>
    <Rectangle Fill="Lime" Stroke="Red" StrokeThickness="5" />
    <Canvas />
</Grid>

或者如果它真的必须看起来像边界:

<Border Background="Lime" BorderBrush="Red" BorderThickness="5">
    <Canvas />
</Border>


当然,这将是备用解决方案。但我问这个问题的一个原因是:如果我没有设置画布上/左边框的自由,那么我觉得这可能是一个迹象,表明我在使用画布做它不适合的东西。。。将子对象放置在负坐标处有问题吗?在我的两种解决方案中,边界不需要知道画布的坐标系。因此,在某种程度上,这要容易得多。但是请注意,当您在画布中以负坐标放置项目时,它们将被放置在画布之外。画布的坐标系是不可调整的,除非通过调整其所有子坐标。如果没有其他缺点,负的子坐标对我来说是可以的。在画布之外没有问题,因为我的用户控件将ClipToBounds设置为true,并且它也不会影响可见性,因为我可以移动/缩放画布,直到所有项目都可见。