C# WPF如何改变RenderTransformOrigin但保持位置不变?

3

我想知道如何在不改变元素位置的情况下更改RenderTransformOrigin。我注意到更改RenderTransformOrigin会影响元素位置。

我该如何计算更改RenderTransformOrigin前后元素位置的XY值?

XAML

<Button 
   Content="Button" 
   Height="100" 
   Width="100" 
   RenderTransformOrigin="0, 0"> 
          <Button.RenderTransform> 
                 <TransformGroup> 
                        <ScaleTransform/> 
                        <SkewTransform/> 
                        <RotateTransform Angle="90"/> 
                        <TranslateTransform/> 
                 </TransformGroup> 
          </Button.RenderTransform> 
   </Button

RenderTransformOrigin="0.5,0.5" 你确定这会改变位置吗? - Abin
2
我有一个按钮(高度=100,宽度=100): 当前的RenderTransformOrigin设置为(0,0)。 现在我正在应用一个Angle为90的RotationTransform。由于旋转,按钮的视觉位置发生了移动(X-100,Y 0)。在下一步中,我将RenderTransformOrigin更改为(0.5,0.5),整个按钮都会移回到其旧位置(X 0,Y 0)。而正是这种移位我不想要,因为旧的变换被丢失了。 - KingSora
1个回答

0

RenderTransformOrigin

根据MSDN的说明,获取或设置相对于元素边界的任何可能由System.Windows.UIElement.RenderTransform声明的渲染变换的中心点。这是一个依赖属性。

因此,位置肯定不会受到影响。位置可以根据TranslateTransform进行调整。

<TranslateTransform  X="{Binding LX}" Y="{Binding LY}" />


<Button Content="Hello" Width="100" Height="100" RenderTransformOrigin=".5,.5" BorderThickness="2" BorderBrush="Black">
    <Button.LayoutTransform>
        <TransformGroup>
            <ScaleTransform 
                            ScaleX="{Binding X}" 
                            ScaleY="{Binding Y}"/>
            <RotateTransform 
                            Angle="{Binding RotateAngle}"/>
        </TransformGroup>
    </Button.LayoutTransform>
</Button>

在您的ViewModel中将X和Y设置为1,即:X = Y = 1;

我尝试过这种方法,但对于更改RenderTransformOrigin的位置没有影响

MSDN

RenderTransformOrigin在Point结构值方面有一些非标准的用法,因为Point并不代表坐标系中的绝对位置。相反,0到1之间的值被解释为当前元素在每个x、y轴上范围的因子。例如,(0.5,0.5)将导致渲染变换以元素为中心,或者(1,1)会将渲染变换放置在元素的右下角。NaN不是一个被接受的值。 超出0和1的值也被接受,并且将导致更不寻常的变换效果。例如,如果您将RenderTransformOrigin设置为(5,5),然后应用RotateTransform,旋转点将远远超出元素本身的边界。变换将使您的元素在一个起源于右下方的大圆圈中旋转。原点可能在其父元素内的某个地方,可能超出帧或视图。 负点值类似,这些将超出左上边界。 渲染变换不影响布局,通常用于动画或对元素应用临时效果。

我在我的第一篇帖子上发表了评论...也许这是一个很好的例子! - KingSora
我从不应用ScaleTransform? - KingSora
这行不通,因为你正在应用LayoutTransform。我正在寻找RenderTransform的解决方案。 - KingSora
<Button Content="按钮" Height="100" Width="100" RenderTransformOrigin="0, 0"> <Button.RenderTransform> <TransformGroup> <ScaleTransform/> <SkewTransform/> <RotateTransform Angle="90"/> <TranslateTransform/> </TransformGroup> </Button.RenderTransform> </Button> 现在将RenderTransformOrigin更改为其他值(例如0.5, 0.5),您会看到按钮会向后移动。 - KingSora
@KingSora,请检查我的编辑。请分享您期望的行为,以便我们可以查看。位置更改对您显示是因为RenderTransformOrigin,需要进一步了解您的期望行为。 - Abin
显示剩余3条评论

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