[noob] WPF - quelques eclaircissements sur les transformations

NobrainNobrain59 Messages postés 2 Date d'inscription vendredi 12 février 2010 Statut Membre Dernière intervention 1 mars 2010 - 12 févr. 2010 à 00:47
MrFoXx Messages postés 1 Date d'inscription mercredi 27 juillet 2011 Statut Membre Dernière intervention 27 juillet 2011 - 27 juil. 2011 à 15:51
Bonjour à tous,

Je développe depuis quelques années en C++, et je bosse actuellement en c# sur le développement d'une application multitouch.

ma fenetre contient un canvas, dans lequel j'ajoute dynamiquement des controles perso. ce controle contient une image.



    
        
            <TransformGroup>
                <ScaleTransform ScaleX= "{Binding Path=ScaleX}" ScaleY="{Binding Path=ScaleY}"></ScaleTransform>
                <RotateTransform Angle="{Binding Path=Angle}" />
                <TranslateTransform X="{Binding Path=X}" Y="{Binding Path=Y}" />
            </TransformGroup>
        
    



l'image subit donc un transformgroup, contenant les classique scale, rotation et translation.

Dans le code c#, j'ai codé les données bindées comme ceci:

        public double scaleX
        {
            get { return (double)GetValue(scaleXProperty); }
            set { SetValue(scaleXProperty, value); }
        }
        public static readonly DependencyProperty scaleXProperty = 
                    DependencyProperty.Register("scaleX", typeof(double), typeof(Building), new UIPropertyMetadata(1.0));


problème : dans mon code, quand je modifie mes attributs X, Y, ou angle, aucun problème, ça se répercute sur le visuel. MAIS ça ne marche pas pour le scale. Mon image reste desespérément à la même taille.



Deuxième question:
j'utilise des events de manipulation sur ces controles, et je voudrais, à la fin de ma manip, récupérer leurs valeurs de position, l'angle, ainsi que les dimensions.
Sauf que dans tous les exemples que j'ai vu, tout le monde utilise une matrice pour coder les transformation de manipulation. ce qui donne un code comme ça

private void Manip_delta(object sender, ManipulationDeltaEventArgs e)
        {
            var element   = e.OriginalSource as UIElement;
            
            var transformation = element.RenderTransform
                                                 as MatrixTransform; 
            var matrix transformation null ? Matrix.Identity :
                                           transformation.Matrix;

            matrix.ScaleAt(e.DeltaManipulation.Scale.X,
                           e.DeltaManipulation.Scale.Y,
                           e.ManipulationOrigin.X,
                           e.ManipulationOrigin.Y);

            matrix.RotateAt(e.DeltaManipulation.Rotation,
                            e.ManipulationOrigin.X,
                            e.ManipulationOrigin.Y);

            matrix.Translate(e.DeltaManipulation.Translation.X,
                             e.DeltaManipulation.Translation.Y);

            element.RenderTransform = new MatrixTransform(matrix);
            e.Handled = true;
        }


question2: à l'heure actuelle, dans mon event manip_completed, je récupère les transformations issues de la matrice "à la main". Mais n'y a t il pas une méthode plus directe? Suis-je obligé de passer par cette satanée matrice? (d'autant que ma méthode actuelle ne marche qu'à moitié, puisque la gestion du centre des transformation me pose quelque problèmes)

voilà, désolé d'avoir écrit un roman, mais tout ça me semble un peu obscur :)

merci!

4 réponses

Jmix90 Messages postés 11 Date d'inscription mercredi 29 mai 2002 Statut Membre Dernière intervention 23 mars 2010
1 mars 2010 à 00:36
Hello,

Pour la première question, si le code que tu fournis est exactement celui que tu utilises, l'erreur est la suivante :
dans ton XAML tu bindes sur ScaleX (avec un S majuscule) et dans ton code tu déclare scaleX (avec un s minuscule)...


Jmix 90
0
NobrainNobrain59 Messages postés 2 Date d'inscription vendredi 12 février 2010 Statut Membre Dernière intervention 1 mars 2010
1 mars 2010 à 01:25
rôôôh la honte, j'avais rien vu

Super Jmix, merci de ton aide

je vais de ce pas me cacher derrière un petit rocher

sinon, pour ma deuxième question, à priori, j'ai pas trouvé mieux, donc je suis resté sur la matrice. J'ai pas besoin d'un code haute performance, donc ça fera l'affaire.

Tiens, tant que je t'ai sous la main, j'ai une nouvelle question si tu veux bien (une question plus conceptuelle que concrète)

dans mon canvas principal, j'ajoute dynamiquement des disques, en les plaçant à la souris (enfin au doigt en l'occurrence)
Maintenant, je voudrais pouvoir déplacer mes disques à la main, pour ajuster leur position.
J'envisage donc de leur assigner un évènement touchmove, et de modifier leur position en fonction du mouvement detecté (un drag&drop en somme)
Est-ce que c'est cohérent de faire ça comme ça, ou il y a un système "tout fait" pour draguer mes contrôles sur mon canvas?
(j'ai vaguement entendu parler d'un contrôle thumb, mais j'ai pas bien saisi à quoi ça servait)

j'essaie de perdre ma vilaine habitude de réinventer la roue à chaque fois, et avec wpf, ça arrive souvent :)

merci!
0
Jmix90 Messages postés 11 Date d'inscription mercredi 29 mai 2002 Statut Membre Dernière intervention 23 mars 2010
1 mars 2010 à 09:11
Hello,

Pour ma part j'utiliserai l'évent StylusMove en .Net 3.5 et ContactMove en .Net 4.0...

Mais sinon, cela se fait comme avec une souris, pas de choses toute faite.
Après, l'algo peut changer un peu si c'est du multitouch mais globalement c'est la même chose...

Jmix 90
0
MrFoXx Messages postés 1 Date d'inscription mercredi 27 juillet 2011 Statut Membre Dernière intervention 27 juillet 2011
27 juil. 2011 à 15:51
Salut,

je bosse actuellement sur une appication multi-touch en WPF (je débute). J'ai cependant un problème, je souhaiterai pouvoir récupérer les informations relatives aux Canvas présents dans mon application et qui ont subi des translations, rotation et autres joies tactile :D .
Par "information" j'entends les valeurs des Margin left, top, right, bottom ainsi que width et height du canvas. J'utilise une méthode similaire à la Manip_delta de NobrainNobrain59 pour ce qui est du travail sur la matrice de mon canvas.
Les canvas crées sont rudimentaires et ne comprennent que la mise à true de la propriété IsManipulationEnabled.

Je vous remercie d'avance pour votre réponse.
0
Rejoignez-nous