如何为scaletransform和rotatetransform设置不同的原点中心?

How set different origin centers for scaletransform and rotatetransform?

如何为 scaletransform 和 rotatetransform 设置不同的原点中心?

示例xaml:

<ScaleTransform ScaleX="{Binding Zoom}"
                                        ScaleY="{Binding Zoom}"
                                        CenterX="0"
                                        CenterY="0" />
<RotateTransform Angle="{Binding RotateAngle}"
                                         CenterX="0.5"
                                         CenterY="0.5"/>

我想到的是:当您单击缩放或旋转滑块时,通过绑定更改 RenderTransformOrigin。这是正确的方法吗? P.S。

对不起我的工程师。

我可能会在每次操作前使用 TranslateTransforms 移动对象来解决这个问题。您还可以使用变换的 Inverse 来取消它(例如,在下一个操作之前将对象移回原点)。

H.B之后。回答 我解决了我的问题。也许有人会对我的解决方案有用。对我来说就像一个魅力:旋转原点= 0.5,0.5;像 0,0

一样缩放

XAML:

<ScrollViewer Grid.Row="1"
                      HorizontalScrollBarVisibility="Auto"
                      VerticalScrollBarVisibility="Auto">
            <Canvas x:Name="canvas"
                    HorizontalAlignment="Center"
                    VerticalAlignment="Center"
                    Width="{Binding CanvasW}"
                    Height="{Binding CanvasH}"
                    >
        <Image HorizontalAlignment="Center"
                       Stretch="None"
                       x:Name="image1"
                       VerticalAlignment="Center"
                       RenderTransformOrigin="{Binding TransformOrigin}">
                    <Image.RenderTransform>
                        <TransformGroup>
                            <ScaleTransform ScaleX="{Binding Zoom}"
                                            ScaleY="{Binding Zoom}" />
                            <RotateTransform Angle="{Binding RotateAngle}" />
                            <TranslateTransform X="{Binding TransX}"
                                                Y="{Binding TransY}" />
                        </TransformGroup>
                    </Image.RenderTransform>
        </Image>
        </Canvas>
<ScrollViewer/>

视图模型:

public double Zoom
        {
            get { return zoom; }
            set 
            {
                if (value != zoom)
                {
                    zoom = value;
                    RaisePropertyChanged("Zoom");
                    RaisePropertyChanged("CanvasH");
                    RaisePropertyChanged("CanvasW");
                    RaisePropertyChanged("TransX");
                    RaisePropertyChanged("TransY");
                }
            }
        }

public double TransX
        {
            get 
            {
                if (imageSource != null)
                {
                    return ((imageSource.Width *zoom - imageSource.Width)/2;
                }
                return 0;
            }
        }

public double TransY
        {
            get
            {
                if (imageSource != null)
                {
                    return (imageSource.Height * zoom - imageSource.Height) / 2;
                }
                return 0;
            }
        }
public double CanvasH
        {
            get 
            {
                if (imageSource!=null)
                {
                    return imageSource.Height*zoom;
                }
                return canvasH;
            }
}
public double CanvasW
        {
            get
            {
                if (imageSource != null)
                {
                    return imageSource.Width*zoom;
                }
                return canvasW;
            }