【问题标题】:How can I make a WPF element resize after rotation, rather than before?如何让 WPF 元素在旋转之后而不是之前调整大小?
【发布时间】:2010-11-29 00:55:08
【问题描述】:

我有一个简单的水平 <Line> 元素。这条线应用了一个 RotateTransform,它以我选择的任何角度倾斜这条线。问题是线条的渲染长度是在应用转换之前计算的。结果是该线在旋转后不再适合其父元素。

我当前的代码看起来与此类似,以 15° 为例:

<Grid Background="Orange">
    <Line   HorizontalAlignment="Left" VerticalAlignment="Bottom"
            RenderTransformOrigin="0,0" Stretch="UniformToFill"
            StrokeThickness="1" Stroke="Green" X1="0" Y1="0" X2="1" Y2="0">
        <UIElement.RenderTransform>
            <RotateTransform Angle="-15" />
        </UIElement.RenderTransform>
    </Line>
</Grid>

结果是这样的:
http://img179.imageshack.us/img179/2592/slantpartial.png
如图所示,由于旋转,该线不与控件的右侧接触。我需要将线条拉伸到可能的最大尺寸并完全填充其父控件,无论我将角度设置为什么。角度会在运行时动态变化,我不能在我当前的项目中使用斜率计算。我需要保持 RotateTransform 作为倾斜线的手段。

我需要完成的一个示例 - 再次以 15° 为例:
http://img42.imageshack.us/img42/8276/slantcomplete.png

【问题讨论】:

    标签: .net wpf xaml .net-3.5 layout


    【解决方案1】:

    使线与父容器的左上角和右下角之间的最大距离一样长。这将使线在平放时比容器略长,但在 50% 的坡度上完美贴合。让父级裁剪溢出。

    【讨论】:

    • 这在使用 RenderTransform 时不起作用,因为在应用 RenderTransform 之前,布局系统会裁剪线条。但是,此解决方案可以与 LayoutTransform 完美配合。手动加长线会导致布局系统使用代码指定的长度,覆盖除“拉伸”之外的任何其他因素。需要将线的“Stretch”属性设置为“None”才能使此解决方案起作用。同样,“Horizo​​ntalAlignment”和“VerticalAlignment”属性不应设置为“Stretch”。
    • (系统不允许我为你的答案投票。这真的很奇怪......)
    【解决方案2】:

    您可以在旋转变换之前尝试缩放变换:

    <UIElement.RenderTransform>
      <TransformGroup>
        <ScaleTransform ScaleX="2.0" />
        <RotateTransform Angle="-15" />
      </TransformGroup>
    </UIElement.RenderTransform>
    

    【讨论】:

    • 这个解决方案的问题是它也会缩放线条的粗细,从而扭曲最终结果。
    【解决方案3】:

    最简单的解决方案是动态更改 X 和 Y 值而不使用 RenderTransform。为什么斜率计算不能用?

    【讨论】:

    • 我不能使用斜率来定义线条,因为我很可能需要在以后对这条线条应用渐变和其他视觉效果。斜线对梯度坐标系的反应不同,但平线总是以相同的方式反应。由于变换是在渐变之后应用的,渐变将随着线条旋转,因此它仍然可以正确渲染。如需进一步说明,请参阅我的问题:stackoverflow.com/questions/1412833
    猜你喜欢
    • 2017-08-05
    • 1970-01-01
    • 2013-12-20
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多