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 :

TextBox et DoDragDrop ==> Exception


Sujet :

Windows Presentation Foundation

  1. #21
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    Citation Envoyé par tomlev Voir le message
    J'ai testé ton code, j'obtiens la même erreur. Et mon intuition était juste : il passe plusieurs fois dans le MouseMove et exécute donc plusieurs fois le DoDragDrop. En ajoutant un flag pour ne le faire qu'une fois, ça fonctionne normalement. Par contre je ne sais pas trop à quel moment il faut remettre le flag à false...
    Comment tu as fait ?
    Chez moi ce code ne passe pas
    Erreur :
    Le traitement du répartiteur a été suspendu, mais les messages continuent à être traités.
    et pourtant je mets bien un flag.
    Code c# : 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
    using System.Threading;
    using System.Windows;
    using System.Windows.Input;
    using System.Windows.Threading;
     
    namespace WpfApplication1
    {
        /// <summary>
        /// Interaction logic for Window1.xaml
        /// </summary>
        public partial class Window1 : Window
        {
            bool l_boolean = false;
            public Window1()
            {
                InitializeComponent();
            }
     
            private void textBox1_MouseMove(object sender, MouseEventArgs e)
            {
                if (e.LeftButton == System.Windows.Input.MouseButtonState.Pressed)
                {
                    if (l_boolean == true) return;
                    l_boolean = true;
                    DragDrop.DoDragDrop(tbxSId, tbxSId, DragDropEffects.Move);
                }
                //Dispatcher.BeginInvoke(DispatcherPriority.Background, new ParameterizedThreadStart(DoDragDrop), e);
            }
     
            void DoDragDrop(object parameter)
            {
                MouseEventArgs e = parameter as MouseEventArgs;
                if (e.LeftButton == System.Windows.Input.MouseButtonState.Pressed)
                {
                    DragDrop.DoDragDrop(tbxSId, tbxSId, DragDropEffects.Move);
                }
            }
     
            private void listBox1_Drop(object sender, DragEventArgs e)
            {
                MessageBox.Show("toto");
            }
        }
    }

  2. #22
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par Harry_polin Voir le message
    Comment tu as fait ?
    Chez moi ce code ne passe pas
    Bizarre, pourtant j'ai presque exactement le même code :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            bool _isDragging = false;
            private void textBox1_MouseMove(object sender, MouseEventArgs e)
            {
                if (e.LeftButton == System.Windows.Input.MouseButtonState.Pressed)
                {
                    if (!_isDragging)
                    {
                        Debug.Print("test");
                        _isDragging = true;
                        DragDrop.DoDragDrop(tbxSId, tbxSId, DragDropEffects.Move);
                    }
                }
            }

    (testé avec VS2010/WPF4)

  3. #23
    Membre éprouvé Avatar de jmix90
    Homme Profil pro
    Consultant .Net
    Inscrit en
    Juillet 2007
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 576
    Points : 998
    Points
    998
    Par défaut
    Blop,

    Effectivement avec le safeguard de tomlev, le problème semble disparaitre : mea culpa !

  4. #24
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Bizarre, pourtant j'ai presque exactement le même code :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            bool _isDragging = false;
            private void textBox1_MouseMove(object sender, MouseEventArgs e)
            {
                if (e.LeftButton == System.Windows.Input.MouseButtonState.Pressed)
                {
                    if (!_isDragging)
                    {
                        Debug.Print("test");
                        _isDragging = true;
                        DragDrop.DoDragDrop(tbxSId, tbxSId, DragDropEffects.Move);
                    }
                }
            }

    (testé avec VS2010/WPF4)

    Avec ton code ça fait la même erreur qu'avec le miens.
    Sous Visual C# 2008. .Net 3.5 SP1.

    Et en mettant n'importe quel autre contrôle qu'une textbox ca marche très bien (même sans utiliser le flag)

  5. #25
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Mais en fait, pour une TextBox, tu n'as pas besoin de gérer le drag/drop toi-même... c'est déjà géré automatiquement : le texte sélectionné est automatiquement draggé

    Ca fonctionne parfaitement en ne gérant pas du tout le MouseMove

  6. #26
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Salut,

    Le problème semble en effet venir de la TextBox lorsque sa propriété Focusable est à True (ça le fait aussi avec la RichTextBox).
    Essaies de la passer à False, tu verras ça fonctionne. Pourquoi ça c'est une autre histoire ...

    La question maintenant, c'est quel est ton besoin ?
    • Tu crées une sorte de designer ? Une ToolBox avec des contrôles que tu drag & drop ?
    • Ou bien est ce que tu souhaites faire un déplacement de ta TextBox dans ton interface ?


    Pour ces cas de figure, je pense que tu dois pouvoir te mettre / passer dans un mode "édition" (dans lequel la(les) TextBox seront à Focusable=False) sans que ça pose de problème.

    Si t'es dans un autre cas de figure, essaies de voir si tu peux utiliser ce contournement ?

  7. #27
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    Tomlev, tu as raison le drag & drop est géré automatiquement... mais il faut avoir pour cela sélectionné tout ou partie du texte auparavant. J'aurais aimé que ca fonctionne même sans qu'il n'y ait quelque chose de sélectionné.

    Binoo, effectivement ca marche en mettant focusable à false... mais je ne peux plus rien écrire dans la textbox.

    Mon besoin est d'avoir effectivement une sorte de designer, où (pour faire simple car c'est un peu plus compliqué que ça) lorsque je drag & drop la textbox dans une certaine partie de mon application, elle disparaisse.

    J'ai essayé de mettre le Focusable à false juste avant le dodragDrop mais ca ne marche pas mieux.

  8. #28
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par Harry_polin Voir le message
    Tomlev, tu as raison le drag & drop est géré automatiquement... mais il faut avoir pour cela sélectionné tout ou partie du texte auparavant. J'aurais aimé que ca fonctionne même sans qu'il n'y ait quelque chose de sélectionné.
    Fais un SelectAll dans l'évènement MouseDown

  9. #29
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Fais un SelectAll dans l'évènement MouseDown
    J'y avais bien pensé mais l'utilisateur peut avoir envie de cliquer juste pour positionner son curseur au bon endroit avant d'éditer le contenu du textbox.

  10. #30
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Citation Envoyé par Harry_polin
    Tomlev, tu as raison le drag & drop est géré automatiquement... mais il faut avoir pour cela sélectionné tout ou partie du texte auparavant. J'aurais aimé que ca fonctionne même sans qu'il n'y ait quelque chose de sélectionné.
    Citation Envoyé par Harry_polin
    Mon besoin est d'avoir effectivement une sorte de designer, où (pour faire simple car c'est un peu plus compliqué que ça) lorsque je drag & drop la textbox dans une certaine partie de mon application, elle disparaisse.
    Donc, il y a deux besoins différents.

    Le premier : une sorte d'optimisation pour que tout le texte soit automatiquement glisser/déplacer.
    Perso, je ne suis pas convaincu par cette optimisation et je ne suis pas sûr que ça choque l'utilisateur (il est habitué ^^). Et ça ajoute surtout des effets de bord à gérer (sélectionner une partie du texte et non la totalité devient difficile, il faut gérer ce cas).

    Le deuxième : Moi je gèrerai ça avec un booléen "IsModeEdition" via une coche ou un raccourci clavier :
    • quand "IsModeEdition" passe à false, tu met tes TextBox à Focusable=true et tu désabonnes tes TextBox de l'événement MouseMove ;
    • quand "IsModeEdition" passe à true, tu met tes TextBox à Focusable=false et tu abonnes tes TextBox de l'événement MouseMove.

  11. #31
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    Citation Envoyé par binoo Voir le message
    Donc, il y a deux besoins différents.

    Le premier : une sorte d'optimisation pour que tout le texte soit automatiquement glisser/déplacer.
    Perso, je ne suis pas convaincu par cette optimisation et je ne suis pas sûr que ça choque l'utilisateur (il est habitué ^^). Et ça ajoute surtout des effets de bord à gérer (sélectionner une partie du texte et non la totalité devient difficile, il faut gérer ce cas).

    Le deuxième : Moi je gèrerai ça avec un booléen "IsModeEdition" via une coche ou un raccourci clavier :
    • quand "IsModeEdition" passe à false, tu met tes TextBox à Focusable=true et tu désabonnes tes TextBox de l'événement MouseMove ;
    • quand "IsModeEdition" passe à true, tu met tes TextBox à Focusable=false et tu abonnes tes TextBox de l'événement MouseMove.
    Oui, c'est une solution de contournement qui se tient, et on pourrait même imaginer ( ce qui serait le plus propre je pense) un template qui passe d'un textbox à un Label (qui lui ne plante pas) et réciproquement si on appuie sur la touche F2... mais je ne sais pas faire.

    Pour l'instant la solution de contournement que j'ai trouvée et de mettre une image devant la textbox et de suggérer via tooltip que l'utilisateur fasse un drag & drop à partir de cette image.

  12. #32
    Membre éprouvé Avatar de jmix90
    Homme Profil pro
    Consultant .Net
    Inscrit en
    Juillet 2007
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 576
    Points : 998
    Points
    998
    Par défaut
    Citation Envoyé par Harry_polin Voir le message
    J'ai essayé de mettre le Focusable à false juste avant le dodragDrop mais ca ne marche pas mieux.
    Peut être qu'il faut déplacer le focus sur un autre contrôle une fois que tu as changé la propriété aussi.

    Bon courage,

  13. #33
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    Citation Envoyé par jmix90 Voir le message
    Peut être qu'il faut déplacer le focus sur un autre contrôle une fois que tu as changé la propriété aussi.

    Bon courage,
    Même erreur en déplaçant le focus.

Discussions similaires

  1. Exception made in DoDragDrop
    Par Nalfeim dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 04/08/2008, 10h35
  2. Réponses: 3
    Dernier message: 01/11/2002, 14h30
  3. [VB6] [Interface] ScrolBar & TextBox
    Par DarkVader dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 25/10/2002, 18h40
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11

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