真的没有差异......正在发生的事情是你正在采取一些渲染非常小的东西(你的路径非常小):
![截屏](https://i.stack.imgur.com/2rdpS.png)
看看那些小盒子
...并将其放大到非常大,并通过以下方式告诉布局四舍五入到最接近的整个像素UseLayoutRounding
结果不可靠的原因是Path
s 独立于 s 进行缩放,Canvas
因为它实际上并没有布局其内容。因此,当您的路径点之一落在不均匀的像素边界上(这可能发生在某些屏幕分辨率而不是其他屏幕分辨率上)时,它会四舍五入到未缩放的画布内最近的虚拟像素,并且从 缩放Viewbox
然后再次四舍五入到最近的整个像素(使用Viewbox
由 的缩放确定的相同比例Canvas
)加剧了舍入误差。如果我们关闭StackPanel.Background
(默认为透明)设置Canvas.Background
为绿色并调低笔画颜色的不透明度,您可以更容易地看到这个图示:
![截屏](https://i.stack.imgur.com/dAyt2.png)
您可以看到路径舍入与画布不同
因此,您要么必须关闭,UseLayoutRounding
以便在操作中包含小数点,要么简化您的布局,以免发生错误。
例如,如果您通过删除不合适和多余的固定大小画布来让路径自行扩展,并设置Path.Stretch = Uniform
您最终得到:
<StackPanel Background="Red" Width="400" UseLayoutRounding="True">
<StackPanel.Resources>
<Style TargetType="Viewbox">
<Setter Property="Height" Value="400" />
<Setter Property="Margin" Value="0,0,0,50" />
</Style>
<Style TargetType="Path">
<Setter Property="Stroke" Value="Blue" />
<Setter Property="StrokeThickness" Value="2" />
<Setter Property="Stretch" Value="Uniform" />
</Style>
</StackPanel.Resources>
<Viewbox>
<Path Data="M 1,1 h 3 v 3 h -3 z" />
</Viewbox>
<Viewbox>
<Path Data="M 1,1 h 4 v 4 h -4 z" />
</Viewbox>
</StackPanel>
导致:
![截屏](https://i.stack.imgur.com/C6W4F.png)
可能是您真正想要的
但是,如果这是一个过度简化,并且您实际上有多个路径打算放入您的Canvas
.Grid
让Grid
他们保持同步(Canvas
s 不会布置他们的孩子)。代码如下所示:
<StackPanel Background="Red" Width="400" UseLayoutRounding="True">
<StackPanel.Resources>
<Style TargetType="Viewbox">
<Setter Property="Height" Value="400" />
<Setter Property="Margin" Value="0,0,0,50" />
</Style>
<Style TargetType="Path">
<Setter Property="Stroke" Value="Blue" />
<Setter Property="StrokeThickness" Value="2" />
<Setter Property="Stretch" Value="Uniform" />
</Style>
</StackPanel.Resources>
<Viewbox>
<Grid Width="5" Height="5">
<Path Data="M 1,1 h 3 v 3 h -3 z" />
</Grid>
</Viewbox>
<Viewbox>
<Grid Width="6" Height="6">
<Path Data="M 1,1 h 4 v 4 h -4 z" />
</Grid>
</Viewbox>
</StackPanel>
结果与没有辅助容器的结果相同
希望这会有所帮助-ck