如何为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;
}
如何为 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;
}