【问题标题】:WPF: Scale a shape and its Bounding Box to fit another Canvas - without affecting Stroke ThicknessWPF:缩放形状及其边界框以适合另一个画布 - 不影响描边粗细
【发布时间】:2018-03-16 10:54:59
【问题描述】:

我有一些用 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>

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

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

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

我忽略了这个问题是否有解决方案?

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

【问题讨论】:

  • Path.Data 是一个 Geometry,它有一个 Transform 属性。
  • 不要使用Canvas 代替Path.Margin

标签: c# wpf xaml canvas scaling


【解决方案1】:

您可以简单地将Path.Stretch 属性设置为Fill,几何图形将自动缩放到形状的大小。不幸的是,当几何体被拉伸时,它也会被“修剪”成一个最小的边界框,所以你会松开几何体周围的边距,但你总是可以将Path.Margin 设置为所需的值。此外,您应该完全放弃包装 Canvas

但是,根据具有所需效果的图像判断,您还希望边距与几何体本身一起缩放。在这种情况下,设置 Path.Margin 不会切芥末 - 边距将保持“不变”。幸运的是,有一个简单的技巧可以解决这个问题——您需要做的就是将边距合并到几何体本身中。为此,您只需向几何图形添加两个“空”移动,这将定义所需边界框的两个相对点。在您的情况下,如果您希望形状的名义尺寸为 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 包装它。

【讨论】:

  • 添加额外的移动命令很有效。谢谢!我有一种感觉,在某处潜伏着一个有点不直观但简单的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 2019-07-24
  • 2018-08-01
相关资源
最近更新 更多