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 :

UserControl déplaçable en WPF


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4
    Par défaut UserControl déplaçable en WPF
    Bonjour,

    J'ai codé un petit contrôle utilisateur qui devra être réutilisé par la suite dans mes applications. Je suis arrivé pratiquement au but fixé mais un bug persiste et je n'arrive pas à mettre la main dessus.

    J'ai utiliser MS Expression blend 2.5 March preview et MS Visual Studio 2008, avec framework 3.5


    fichier : DraggableUserControl.xaml.cs
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
     
    namespace MesControles
    {
        public partial class DraggableUserControl : UserControl
        {
            bool DragEnCours = false;
            Point DragOffset;
     
            public DraggableUserControl()
            {
                InitializeComponent();
     
                // Evénements attachés
                this.MouseLeftButtonDown += DragMouseLeftButtonDown;
                this.MouseLeftButtonUp += DragMouseLeftButtonUp;
                this.MouseMove += DragMouseMove;
     
     
                // Position par rapport au control parent / haut, gauche
                base.HorizontalAlignment = HorizontalAlignment.Left;
                base.VerticalAlignment = VerticalAlignment.Top;
            }
     
            public void Move(Point Cible)
            {
                this.RenderTransform = new TranslateTransform(Cible.X, Cible.Y);
            }
     
            public void DragMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
            {
                if (DragEnCours)
                    this.StopDrag();
                DragEnCours = true;
                DragOffset = e.GetPosition(null);
                this.CaptureMouse();
            }
     
            void DragMouseMove(object sender, MouseEventArgs e)
            {
                if (DragEnCours)
                    this.DoDrag(e.GetPosition(this.Parent as UIElement));
            }
     
            void DragMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
            {
                if (DragEnCours)
                    this.StopDrag();
            }
     
            void DoDrag(Point Cible)
            {
                this.Move(new Point(Cible.X - DragOffset.X, Cible.Y - DragOffset.Y));
            }
     
            void StopDrag()
            {
                DragEnCours = false;
                this.ReleaseMouseCapture();
            }
        }
    }
    fichier : DraggableUserControl.xaml
    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
     
    <UserControl x:Class="MesControles.DraggableUserControl"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="300" Width="300">
        <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        	<Border HorizontalAlignment="Stretch" VerticalAlignment="Stretch" BorderBrush="#FFFFFFFF" CornerRadius="8,8,8,8" BorderThickness="2,2,2,2">
        		<Border.Background>
        			<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
        				<GradientStop Color="#FF000000" Offset="0"/>
        				<GradientStop Color="#FFFFFFFF" Offset="1"/>
        			</LinearGradientBrush>
        		</Border.Background>
        	</Border>
     
        </Grid>
    </UserControl>

    En mode éxécution :
    Le contrôle se déplace bien à la souris. Quand je relache le bouton gauche, il reste bien en place. Lorsque je re-clique dessus le contrôle, il reprends sa position initiale (celle mise dans le designer).


    Si vous avez une idée, car à force d'avoir le nez collé dans le code, je n'arrive pas à trouver mon erreur ou oubli.

    Capture d'écran ci-dessous.

    Merci à vous

    Philippe
    Images attachées Images attachées  

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Il fatuqeu tu concerves la dernière position du contrôle

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4
    Par défaut
    J'y avais bien pensé mais je ne trouve pas les fonctions qui me permettent de trouver le coin haut/gauche.

  4. #4
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Dans le DragMouseLeftButtonUp, tu récupères la position de la souris/du controle.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4
    Par défaut
    J'ai essayé un Canvas.GetLeft(this) mais ça donne rien
    Je fais aussi un calcul genre position de la souris - l'offset pour les 2 valeurs de X et Y mais je comprends pas pourquoi j'ai un reset de la position à 0,0 quand on reclique sur le contrôle.

    pfou c fou ce WPF, ha mon bon vieux GDI me posait moins de problème lol.

  6. #6
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 27
    Par défaut
    Dans un programme j'ai créer une interface permettant de rendre certains de mes user control déplacable, ceux ci contiennent un Panel qui gere une transparence, pour masquer ce qu'il y a derriere, et un autre contener qui ici est un border et qui contient mes controles. Et j'implémente une interface a mes UserControl :

    Mon interface et son comprtement :

    publicinterfaceIModaleMove
    {
    Panel panelModal
    {
    get;
    }
    Border modalWindow
    {
    get;
    }
    }
    publicstaticclassUtilsModaleMove
    {
    staticPoint controlPoint, mousePoint, newMousePoint;
    publicstaticvoid ModalMouseMove(thisIModaleMove moi, MouseEventArgs e)
    {
    if (e.LeftButton == MouseButtonState.Pressed)
    {
    newMousePoint =
    newPoint(Mouse.GetPosition((UserControl)moi).X, Mouse.GetPosition((UserControl)moi).Y);
    //panelModal
    double x = controlPoint.X + newMousePoint.X - mousePoint.X;
    if (x > 0 && x < (moi.panelModal.ActualWidth - moi.modalWindow.ActualWidth))
    Canvas.SetLeft(moi.modalWindow, (x));
    double y = controlPoint.Y + newMousePoint.Y - mousePoint.Y;
    if (y > -1 && y < (moi.panelModal.ActualHeight - moi.modalWindow.ActualHeight))
    Canvas.SetTop(moi.modalWindow, (y));
    }
    }
    publicstaticvoid ModalMouseDown(thisIModaleMove moi, MouseButtonEventArgs e)
    {
    controlPoint =
    newPoint(Canvas.GetLeft(moi.modalWindow), Canvas.GetTop(moi.modalWindow));
    mousePoint =
    newPoint(Mouse.GetPosition((UserControl)moi).X, Mouse.GetPosition((UserControl)moi).Y);
    }
    publicstaticvoid ModalLoad(thisIModaleMove moi)
    {
    Canvas.SetLeft(moi.modalWindow, (moi.panelModal.ActualWidth / 2) - (moi.modalWindow.ActualWidth / 2));
    Canvas.SetTop(moi.modalWindow, (moi.panelModal.ActualHeight / 2) - (moi.modalWindow.ActualHeight / 2));
    }
    }


    et les les evenement qui utilisent des methodes d'extension a cette interface :

    privatevoid titleWindow_MouseMove(object sender, MouseEventArgs e)
    {
    this.ModalMouseMove(e);
    }
    privatevoid titleWindow_MouseDown(object sender, MouseButtonEventArgs e)
    {
    this.ModalMouseDown(e);
    }


Discussions similaires

  1. Obtenir une fenêtre non-déplaçable C# WPF
    Par NahMean dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 10/01/2013, 10h17
  2. [WPF] UserControl -> binding ??
    Par UNi[FR] dans le forum C#
    Réponses: 1
    Dernier message: 10/09/2007, 11h31
  3. [WPF] UserControl pour un historique de nav
    Par UNi[FR] dans le forum Windows Presentation Foundation
    Réponses: 8
    Dernier message: 10/09/2007, 11h19
  4. [WPF] UserControl: impossible à ajouter à la toolbox
    Par SoBaKa dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 23/05/2007, 09h14

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