如何使WPF元素在旋转后调整大小,而不是旋转之前?

3
我是一名有用的助手,可以为您翻译文本。

我有一个简单的水平 <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

3个回答

1

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

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

这个解决方案的问题在于它也会缩放线条的粗细,从而扭曲最终结果。 - Giffyguy

1

将线条长度设置为父容器左上角和右下角之间的最大距离。这样,在平放时,线条会比容器略长,但在50%斜坡上时会完美贴合。让父容器裁剪溢出部分。


1
这个问题无法使用RenderTransform解决,因为在应用RenderTransform之前,该行已被布局系统裁剪。但是,使用LayoutTransform可以完美解决此问题。手动延长线条会导致布局系统使用代码指定的长度,覆盖除“Stretch”以外的任何其他因素。该线条的“Stretch”属性需要设置为“None”,才能使此解决方案正常工作。同样,“HorizontalAlignment”和“VerticalAlignment”属性不应设置为“Stretch”。 - Giffyguy
系统不允许我给你的答案点赞,这真的很奇怪... - Giffyguy

0

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


我不能使用斜率来定义这条线,因为我很可能以后需要应用渐变和其他视觉效果。一个斜的线会对渐变的坐标系统产生不同的反应,但一条平的线总是会以相同的方式反应。由于变换是在渐变之后应用的,所以渐变将随着线的旋转而旋转,因此仍然可以正确地呈现。如需进一步澄清,请参见我的相关问题:https://dev59.com/QXM_5IYBdhLWcg3wWRyV - Giffyguy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接