[noob] WPF - quelques eclaircissements sur les transformations

Signaler
Messages postés
2
Date d'inscription
vendredi 12 février 2010
Statut
Membre
Dernière intervention
1 mars 2010
-
Messages postés
1
Date d'inscription
mercredi 27 juillet 2011
Statut
Membre
Dernière intervention
27 juillet 2011
-
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

Messages postés
11
Date d'inscription
mercredi 29 mai 2002
Statut
Membre
Dernière intervention
23 mars 2010

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
Messages postés
2
Date d'inscription
vendredi 12 février 2010
Statut
Membre
Dernière intervention
1 mars 2010

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!
Messages postés
11
Date d'inscription
mercredi 29 mai 2002
Statut
Membre
Dernière intervention
23 mars 2010

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
Messages postés
1
Date d'inscription
mercredi 27 juillet 2011
Statut
Membre
Dernière intervention
27 juillet 2011

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.