WPF:缩放形状及其边框以适合另一个画布 - 不影响笔触粗细

时间:2018-03-16 10:55:00

标签: c# wpf xaml canvas scaling

我在XAML中描述了一些形状,主要是曲线。它们中的一些在边缘处具有填充物,通过将它们放置在比形状大Canvas的位置来实现。这个Canvas充当边界框。

例如,此形状在Designer中显示如下。形状是曲线。外部正方形是边界Canvas,由红色箭头表示。

<Canvas Height="160"
        Width="160"
        Background="Red">
  <Path Stroke="#000000"
        Data="M27.9,108 c0,0 25,-63 48.5,-51.5 s34.5,64.5 68.5,37">
  </Path>
</Canvas>

enter image description here

现在我需要缩放Canvas及其形状以动态调整较大的Canvas,同时保持形状Geometry相对于其边界Canvas,同时保持Stroke.Thickness

这是形状在没有缩放的情况下显示的方式(边界Canvas为红色,Canvas我需要缩放为黄色):

enter image description here

这是如何处理缩放,但不更改Stroke.Thickness。我在这里使用ViewBox

enter image description here

我忽视了这个问题的解决方案吗?

我怀疑唯一的解决方案是将形状的Path.Stretch设置为Fill,更改其HeightWidth,然后将Margin应用于边界Canvas复制填充,听起来非常可怕。

1 个答案:

答案 0 :(得分:1)

您只需将Path.Stretch属性设置为Fill,几何图形就会自动缩放到形状的大小。不幸的是,当几何体被拉伸时,它也被修剪了#34;到最小边界框,因此您将松开几何体周围的边距,但您始终可以将Path.Margin设置为所需的值。此外,您应该完全放弃包裹Canvas

但是,根据具有所需效果的图像判断,您还希望边距与几何体本身一起缩放。在这种情况下,设置Path.Margin不会切断芥末 - 边距将保持不变&#34;。幸运的是,有一个简单的技巧可以解决这个问题 - 你需要做的就是在几何体中加入边距。要做到这一点,你只需要添加两个&#34;空&#34;移动到几何体,这将定义所需边界框的两个相对点。在您的情况下,如果您希望形状的标称尺寸为160x160,并自动缩放以适应可用空间,您只需要:

<Path Stroke="#000000"
      Data="M0,0 M160,160 M27.9,108 c0,0 25,-63 48.5,-51.5 s34.5,64.5 68.5,37"
      Stretch="Fill" />

Path没有Background属性,所以你可能想要用Border包裹它。