WPF:缩放形状及其边界框以适合另一个 Canvas - 不影响描边粗细

WPF: Scale a shape and its Bounding Box to fit another Canvas - without affecting Stroke Thickness

我在 XAML 中描述了一些形状,主要是曲线。其中一些在边缘周围有填充,通过将它们放置在比形状大 Canvas 的位置来实现。此 Canvas 用作边界框。

例如,这个形状在设计器中是这样的。形状是曲线。外方块是边界 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>

现在我需要缩放 Canvas 及其形状以动态适应更大的 Canvas,同时保持形状 Geometry 相对于其边界 Canvas,并且同时保持 Stroke.Thickness.

这是没有缩放的形状(边界 Canvas 是红色,Canvas我需要缩放到是黄色):

这需要在缩放后查看,但不更改 Stroke.Thickness。我在这里使用 ViewBox:

对于我忽略的这个问题,是否有解决方案?

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

您只需将 Path.Stretch 属性 设置为 Fill ,几何图形将自动缩放到形状的大小。不幸的是,当几何体被拉伸时,它也是 "trimmed" 到一个最小的边界框,因此您将失去几何体周围的边距,但您始终可以将 Path.Margin 设置为所需的值。另外,你应该完全放弃包装 Canvas

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

<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 把它包起来。