2017-10-20 16 views
0

Je crée Path objets avec des bords sinueux sur un Canvas. Je veux pouvoir les faire pivoter et les déplacer autour de la toile. Mais lorsque j'essaie d'appliquer plusieurs transformations et objets, il affiche uniquement le dernier. Je suppose que c'est parce que les transformations sont appliquées aux coordonnées de l'objet Path et sont seulement affichées mais pas sauvegardées par la suite.Est-il possible d'appliquer RenderTransform aux UIElements réels?

Donc, si je courrais quelque chose comme:

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

il déplacerait mes Path 150 pixels vers le bas.

Y at-il un moyen que je peux enregistrer la progression de la transformation de RenderTransform ou dois-je recréer mon Path avec différents paramètres/écrire une méthode pour déplacer les pixels manuellement?

Modifier

Un autre exemple:

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

Ce code me permet de déplacer mon élément et il fonctionne très bien: je peux le ramasser, déplacer visuellement, et le laisser aller. Mais seulement une fois. Si vous essayez de le faire à nouveau, il essaie de faire la transformation en fonction de la position précédente des éléments. Et en tapant ceci, je me rends compte que je peux probablement résoudre cela en gardant une trace des décalages que les transformations provoquent.

+0

peut-être [cette ] (https://stackoverflow.com/questions/45208505/is-it-good-practice-to-position-uielements-via-rendertransform) peut vous aider. Jetez un coup d'œil :) –

+0

Lorsque vous affectez une transformation à la propriété RenderTransform d'un UIElement, vous remplacez évidemment la valeur précédemment affectée. Si vous souhaitez appliquer plusieurs transformations à la fois, ajoutez-les à un TransformGroup et attribuez-le une fois à RenderTransform. Puis réutilisez les éléments existants de TransformGroup. Voir [Comment: appliquer plusieurs transformations à un objet] (https://docs.microsoft.com/fr-fr/dotnet/framework/wpf/graphics-multimedia/how-to-apply-multiple-transforms-to-an -objet). – Clemens

+0

@Clemens Je veux être capable non seulement d'appliquer plusieurs transformations, mais de les appliquer en fonction de l'endroit où l'élément s'est terminé à la suite de la transformation précédente, si cela a du sens. Et pour ce faire, je dois réellement changer les coordonnées de l'élément. Y a-t-il une méthode qui accomplit cela? –

Répondre

0

Il suffit d'ajouter la traduction suivante aux valeurs X et Y du RenderTransform existant:

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

Ou utiliser Canvas.Left et Canvas.Top au lieu d'un TranslateTransform:

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

yup, merci je viens de réaliser que moi-même: D –