IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

Déplacement d'un UserControl


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Lelio1407
    Inscrit en
    Juillet 2009
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 126
    Par défaut Déplacement d'un UserControl
    Bonjour à tous,

    J'ai un UserControl qui contient un label (le header du UserControl).
    Sur ce label, j'ai déclaré les évènements MouseLeftButtonDown, MouseMove et MouseLeftButtonUp.
    Dans le code du UserControl, je fait un RaiseEvent de ces évènements.

    Je place ensuite mon UserControl dans ma MainWindow en lui donnant le nom "MyUserControl", je déclare les 3 évenements dans son code Xaml et je les implémente ensuite dans mon code principal afin de pouvoir déplacer mon UserControl lorsque je clique sur son label.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    private void UserControlHeader_MouseLeftButtonDown(object sender, RoutedEventArgs e)
    {
     
       _isDragging = true;
       _userControlPoint = new Point(Canvas.GetLeft(MyUserControl), Canvas.GetTop(MyUserControl));
       mousePoint = new Point(Mouse.GetPosition((IInputElement)Canvas_UserControls.Parent).X, Mouse.GetPosition((IInputElement)Canvas_UserControls.Parent).Y);
       MyUserControl.Header.CaptureMouse();
    }
     
    private void UserControlHeader_MouseMove(object sender, RoutedEventArgs e)
    {
          if (_isDragging == true)
          {
                newMousePoint = new Point(Mouse.GetPosition((IInputElement)Canvas_UserControls.Parent).X, Mouse.GetPosition((IInputElement)Canvas_UserControls.Parent).Y);
                Canvas.SetLeft(MyUserControl, (_userControlPoint.X + newMousePoint.X - mousePoint.X));
                Canvas.SetTop(MyUserControl, (_userControlPoint.Y + newMousePoint.Y - mousePoint.Y));
            }
    }
     
     
    private void UserControlHeader_MouseLeftButton(object sender, RoutedEventArgs e)
    {
          if (_isDragging == true)
          {
                _isDragging = false;
                MyUserControl.Header.ReleaseMouseCapture();
            }
    }
    Cela fonctionne très bien.

    Maintenant, sachant que j'ai plusieurs UserControl de même type dans ma mainWindow, je pensais pouvoir capitaliser ce code en réutilisant ces trois fonctions tout simplement en remplaçant dans les fonctions l'appel nominatif "MyUserControl" par _controlSender où _controlSender serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    private void UserControlHeader_MouseLeftButtonDown(object sender, RoutedEventArgs e)
    {
        UserControl _controlSender = (UserControl)sender;
        _isDragging = true;
       _userControlPoint = new Point(Canvas.GetLeft(_controlSender ), Canvas.GetTop(_controlSender ));
        // etc.....
    }
    Et là, cela ne fonctionne plus...
    Quelqu'un pourrait-il m'expliquer comment procéder afin que je puisse réutiliser ces 3 fonctions pour tous mes UserControls (possédant un header de même type) plaçés dans ma MainWindow?

    Je vous remercie d'avance,

  2. #2
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 162
    Par défaut
    Salut
    Pourquoi tu ne le fais pas directement dans l'UserControl quand tu récupères les évents depuis ton Label?
    Si non est ce que tu t'abonnes aux events de chaqu'un de tes UC ou tu fais un seul abonnement sur le Canvas qui contient les UC? Si c'est le 2eme cas pour avoir l'user control il faut faire e.OriginalSource.

  3. #3
    Membre confirmé Avatar de Lelio1407
    Inscrit en
    Juillet 2009
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 126
    Par défaut
    Bonjour,
    Merci pour ton message.
    Je ne traite pas l'évènement directement dans le code du UserControl car je souhaite appeler pour tous les UC les mêmes 3 fonctions (déclarées dans la MainWindow) afin justement de ne pas avoir à les dupliquer dans le code-behind de chaque UC.
    Le Label (Header) fait bien remonter les 3 évènements et chaque UC déclaré dans ma MainWindow est bien abonné aux 3 évènements.

  4. #4
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 162
    Par défaut
    Quand tu dis que ca marche pas tu veux dire qu'il y a une exception?
    Si non pour capitaliser le code tu peux créer un UserControl commun dont vont hériter chacun de tes UserControls.

  5. #5
    Membre confirmé Avatar de Lelio1407
    Inscrit en
    Juillet 2009
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 126
    Par défaut
    Non, quand ça j'écris que cela ne fonctionne pas, je veux dire que mon UserControl ne se déplace plus dans ma fenêtre alors que c'était le cas lorsque j'utilisais son "nom" plutôt que le "sender" de l'évènement.
    En revanche, l'idée de l'héritage me semble une bonne piste. Je vais essayer de suite.
    Merci.

  6. #6
    Membre confirmé Avatar de Lelio1407
    Inscrit en
    Juillet 2009
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 126
    Par défaut
    Après avoir un peu regardé, il semblerait que l'héritage de Usercontrol ne soit pas aussi trivial. En effet, tous mes UserControl ont en commun un Header, un corps et un Footer mais ceux-ci sont déclarés en XAML et il n'est pas possible de faire de l'héritage dans ce cas là.

    Hors, c'est le click sur le Header qui déclenche le mouvement du UserControl dans la fenêtre.

    Une idée pour capitaliser le code du déplacement à la souris lors d'un clic sur le Header(un Label) de n'importe quel UserControl déclaré dans ma MainWindow?

  7. #7
    Membre confirmé Avatar de Lelio1407
    Inscrit en
    Juillet 2009
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 126
    Par défaut
    Pour clore ce post, voici la solution que j'ai trouvé (Merci à Goast pour m'avoir mise sur la piste!)

    J'ai créée une classe de base UserControlBaseClass qui hérite de UserControl.
    Dans cette classe, je déclare les 3 évènements LeftMouseDown, Up et MouseMove et je les fais remonter au niveau de la fenêtre principale (où mes UserControls sont positionnés).

    J'implémente ces 3 évènements dans le code de la fenêtre principale.

    Tous mes UserControls héritent ensuite de UserControlBaseClass et bénéficient donc de ces 3 évènements et du code associé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 01/12/2010, 23h09
  2. Afficher les coordonnées d'un usercontrol lors de son déplacement
    Par soso78 dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 14/11/2007, 21h48
  3. [VB6] [UserControl] Évènements personnalisés
    Par Frankywinky dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 27/05/2003, 17h56
  4. Déplacement "automatique" du curseur
    Par Amenofis dans le forum Composants VCL
    Réponses: 2
    Dernier message: 08/01/2003, 18h57
  5. Limiter le déplacement de la souris
    Par el_bouleto dans le forum C++Builder
    Réponses: 4
    Dernier message: 08/11/2002, 23h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo