我原本期望以下两个XAML产生相同的输出。但是,路径上的RenderTransform使用了一些我不太了解的时髦旋转点。有人可以向我解释为什么这两个XAML不相同吗?
<Window x:Class="CenterPathTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Canvas>
<Canvas.RenderTransform>
<TranslateTransform X="50" Y="50"/>
</Canvas.RenderTransform>
<Border Width="100" Height="200">
<Border.RenderTransform>
<TransformGroup>
<TranslateTransform X="70" Y="-100"/>
<RotateTransform Angle="90"/>
</TransformGroup>
</Border.RenderTransform>
<Path Width="100" Height="200" Stretch="Uniform"
Data="M 0,20M 20,0M 6.04,4.51 C6.04,4.51 7.54,3 7.54,3 7.54,3 14.5,10 14.5,10 14.5,10 7.54,17 7.54,17 7.54,17 6.04,15.48 6.04,15.48 6.04,15.48 11.5,10 11.5,10 11.5,10 6.04,4.51 6.04,4.51 z" />
</Border>
</Canvas>
</Window>
我认为后续行为不正确:
<Window x:Class="CenterPathTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Canvas>
<Canvas.RenderTransform>
<TranslateTransform X="50" Y="50"/>
</Canvas.RenderTransform>
<Path Width="100" Height="200" Stretch="Uniform"
Data="M 0,20M 20,0M 6.04,4.51 C6.04,4.51 7.54,3 7.54,3 7.54,3 14.5,10 14.5,10 14.5,10 7.54,17 7.54,17 7.54,17 6.04,15.48 6.04,15.48 6.04,15.48 11.5,10 11.5,10 11.5,10 6.04,4.51 6.04,4.51 z">
<Path.RenderTransform>
<TransformGroup>
<TranslateTransform X="70" Y="-100"/>
<RotateTransform Angle="90"/>
</TransformGroup>
</Path.RenderTransform>
</Path>
</Canvas>
</Window>
答案 0 :(得分:2)
您对第二个示例中与Stretch
属性相关的旋转点是正确的。
要对此进行测试,您可以更改XAML,以便两个示例都有Stretch="None"
,您可以看到它们完全重叠。
你的第二个例子就是如何不这样做的一个很好的例子。 :)当你有一个路径对象并且将它拉伸一些未知数量时,你的默认RenderTransformOrigin
也会被拉伸/移动。
第一个示例按预期工作,因为您正在执行TranslateTransform
和RotateTransform
对象上尚未展开或缩放的Border
。然后,边框内的Path
对象可以自由扩展到所需的尺寸,而不会受到父对象(Border
)上发生的变换的不利影响。
为了使您的第二个示例与第一个示例完全相同,您需要确定Path
拉伸以适合您的100x200大小边界时出现的确切比例因子。然后,您必须使用该数字来计算新的RenderTransformOrigin
或计算TranslateTransform
的新X和Y值。
.. ..或
更改第二个Data
对象中的Path
,以便最初以完全'拉伸'尺寸绘制V形。
鉴于这两种解决方案的复杂性,将Path
保留在Border
对象内是迄今为止最简单的路径。