2016-03-24 7 views
2

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.

私の電子メールに申し訳ありません。

+0

なぜあなたはまた、CenterXとCenterYプロパティをバインドしませんか? – Clemens

+0

問題を解決するためにこれを行う方法がわかりません。たとえば、スケールの後でRenderTransformOriginを変更し、異なる起点で回転すると、私の以前のスケールは新しいスケールで再レンダリングされます。私は 連続したtranformationsが必要だと思います。 – Vilix

答えて

1

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/> 

のViewModel:

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; 
      } 
2

これは、操作のたびにオブジェクトを移動するためにTranslateTransformsを使用してこれに近づけると思います。トランスフォームのInverseを使用して無効にすることもできます(たとえば、次の操作の前にオブジェクトを元の位置に戻すなど)。

+0

私はそれぞれの変換後にTranslateTransformsを使うべきだと思います。これは私の問題を解決するかもしれません。右方向のThx。 – Vilix

関連する問題