2017-10-20 6 views
0

Canvasに曲線のついたオブジェクトPathを作成しています。私はそれらを回転させてキャンバスの周りに動かせたいと思っています。しかし、私はいくつかの変換を適用しようとすると、視覚的に最後のものを表示するだけです。変換は、Pathオブジェクトの座標に適用され、表示されますが後で保存されないため、私は仮定します。それがダウンして私のPath 150ピクセルを移動するRenderTransformを実際のUIElementsに適用できますか?

my_canvas.Children[0].RenderTransform = new TranslateTransform(0, 100); 
my_canvas.Children[0].RenderTransform = new TranslateTransform(0, 150); 

だから私のような何かを実行するならば。

RenderTransformの変換の進捗状況を保存する方法はありますか、またはPathを別のパラメータで再作成する必要がありますか/手動でピクセルを置き換える方法を記述しますか?

編集

もう一つの例:

my_canvas.Children[0].MouseDown += (object sender, MouseButtonEventArgs e) => 
      { 
       if (e.LeftButton == MouseButtonState.Pressed) 
       { 
        MouseDownLocation = e.GetPosition(my_canvas); 
       } 
      }; 

      my_canvas.Children[0].MouseMove += (object sender, MouseEventArgs e) => 
      { 
       if (e.LeftButton == MouseButtonState.Pressed) 
       {      
        my_canvas.Children[0].RenderTransform = new TranslateTransform(-(MouseDownLocation.X - e.GetPosition(my_canvas).X), -(MouseDownLocation.Y - e.GetPosition(my_canvas).Y));      
       } 
      }; 

このコードは私が私の要素を移動することができますし、それが正常に動作します:私は、それを拾う視覚的にそれを移動し、それを手放すことができます。しかし、一度だけ。再度それをしようとすると、要素の前の位置に基づいて変換を実行しようとします。そして私がこれをタイプしているとき、私はおそらく変換が引き起こしているオフセットを追跡することによってこれを解決することができることを認識しています。

+0

多分[これを](https://stackoverflow.com/questions/45208505/is-it-good-practice-to-position-uielements-via-rendertransform)を参考にしてください。ちょっと見てみてください:) –

+0

UIElementのRenderTransformプロパティにトランスフォームを割り当てるときは、以前に割り当てられた値を明らかに置き換えます。一度に複数のトランスフォームを適用する場合は、それらをTransformGroupに追加し、一度RenderTransformに割り当てます。次に、TransformGroupの既存の要素を再利用します。 [方法:オブジェクトに複数の変換を適用する方法](https://docs.microsoft.com/en-us/dotnet/framework/wpf/graphics-multimedia/how-to-apply-multiple-transforms-to-an)を参照してください。 - オブジェクト)。 – Clemens

+0

@Clemens私は、複数の変換を適用するだけでなく、前の変換の結果として要素がどこに終わったかに基づいて適用することができたいと思っています。そして、私は実際に要素の座標を変更する必要があります。これを実現する方法はありますか? –

答えて

0

ただ、既存のRenderTransformのXとYの値に次の翻訳を追加します。

my_canvas.Children[0].RenderTransform = new TranslateTransform(0, 100); 
((TranslateTransform)my_canvas.Children[0].RenderTransform).Y += 150; 

またはその代わりにTranslateTransformのでCanvas.LeftとCanvas.Topを使用します。

UIElement element = my_canvas.Children[0]; 
Canvas.SetTop(element, 100); 
Canvas.SetTop(element, Canvas.GetTop(element) + 150); 
+0

ええ、ありがとう私はちょうど自分自身を認識した:D –

関連する問題