使用RenderTransform,路径RenderTransform不等于它周围的边框?

时间:2014-09-17 16:58:19

标签: wpf xaml rendertransform

我原本期望以下两个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>

1 个答案:

答案 0 :(得分:2)

您对第二个示例中与Stretch属性相关的旋转点是正确的。 要对此进行测试,您可以更改XAML,以便两个示例都有Stretch="None",您可以看到它们完全重叠。

你的第二个例子就是如何不这样做的一个很好的例子。 :)当你有一个路径对象并且将它拉伸一些未知数量时,你的默认RenderTransformOrigin也会被拉伸/移动。

第一个示例按预期工作,因为您正在执行TranslateTransformRotateTransform对象上尚未展开或缩放的Border。然后,边框内的Path对象可以自由扩展到所需的尺寸,而不会受到父对象(Border)上发生的变换的不利影响。

为了使您的第二个示例与第一个示例完全相同,您需要确定Path拉伸以适合您的100x200大小边界时出现的确切比例因子。然后,您必须使用该数字来计算新的RenderTransformOrigin或计算TranslateTransform的新X和Y值。

.. ..或

更改第二个Data对象中的Path,以便最初以完全'拉伸'尺寸绘制V形。

鉴于这两种解决方案的复杂性,将Path保留在Border对象内是迄今为止最简单的路径。