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
,更改其 Height
和 Width
,然后将 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
把它包起来。
我在 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
,更改其 Height
和 Width
,然后将 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
把它包起来。