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

在更改X之前和之后,如何计算元素位置之间的YRenderTransformOrigin值?

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


  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>


将X和Y设置为1,即:ViewModel中的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,则旋转点将很好地位于元素本身的边界之外。 The transform will spin your element around in a big circle that originates beyond bottom right. The origin might be somewhere inside its parent element and could possibly be possibly out of frame or view.
  
  负点值相似,这些值将超出左上边界。
  Render transforms do not affect layout, and are typically used to animate or apply a temporary effect to an element

10-07 20:18