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 :

Event UserControl non soulevé


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 5
    Par défaut Event UserControl non soulevé
    Bonjour,

    Généralement je trouve une réponse à mes problèmes sur ce forum (ou d'autres) mais aujourd'hui je suis dans l'impasse je viens donc en quêtes de quelques réponse de la part de spécialistes wpf/forms.

    J'ai un form dans lequel il y a un datagridview lié à une base de données SQL. Lors d'un clique sur une cellule je gère l'évenement CellClick et créer dans le code un ElementHost qui affiche un UserControl WPF.
    Cet UserControl est enfaite un popup destiné à donner plus d'informations sur la cellule cliqué.
    Ce dernier s'affiche et lorsqu'on le survole avec la souris l'évenement MouseEnter se déclenche et l'UserControl reste affiché tant que la souris est à l'interieur.
    Dès la sortie de la souris, l'évenement MouseLeave se déclenche et cache puis supprime l'UserControl.
    Voila le fonctionnement dans le debugger de VS 2010.

    Mon soucis est que lorsque que je génère mon projet que je le teste en dehors de VS 2010 les évenements MouseEnter et MouseLeave ne se déclenchent pas quand l'UserControl apparait et que je le survole.
    Malgrès de multiple recherche je ne trouve pas de solution à mon problème

    Voici le code de l'UserControl :
    Code vb.net : 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
     
    Imports System.Threading
    Imports System.Windows.Data
     
    Public Class UserControlUtil
     
        Private Sub UserControl_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
            StackPanel1.DataContext = GPIadmin.DataSet1.Utilisateurs
            Canvas1.DataContext = GPIadmin.DataSet1.Utilisateurs
            If CellValue <> "" Then
                Dim myView As BindingListCollectionView
                myView = CType(CollectionViewSource.GetDefaultView(GPIadmin.DataSet1.Utilisateurs), BindingListCollectionView)
                myView.CustomFilter = "Nom_utilisateur = '" & CellValue & "'"
            End If
        End Sub
     
        Private Sub UserControl_MouseEnter(ByVal sender As System.Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles MyBase.MouseEnter
            OnUcImpri = True 'Variable public dans un module
        End Sub
     
        Private Sub UserControl_MouseLeave(ByVal sender As System.Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles MyBase.MouseLeave
            OnUcImpri = False
            MyElementHost.Hide()
            GPIadmin.Controls.Remove(MyElementHost)
            NoCellClick = False
        End Sub

    Il faut savoir que je lance un thread séparé pour laisser le temps de survoler l'UserControl :
    Code vb.net : 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
     
        Private Sub DataGridView2_CellMouseLeave(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView2.CellMouseLeave
            If NoCellClick = True Then 'on ne lance le thread pour quitter le pop up que si on a cliqué une cellule
                Thread.Sleep(1000) 'tempo pour laisser le temps a l'utilisateur de survoler le pop up
                MyThread = New Thread(AddressOf HideElementHost)
                MyThread.Name = "ThreadHideElementHost"
                MyThread.SetApartmentState(Threading.ApartmentState.STA)
                MyThread.Start()
            End If
        End Sub
        Sub HideElementHost()
            If MyElementHost.InvokeRequired = True Then
                Dim del As New HideElementHostDelegate(AddressOf HideElementHost)
                Try
                    Me.Invoke(del, New Object() {})
                Catch ex As Exception
                End Try
            Else
                If OnUcImpri = False And NoCellClick = True Then
                    MyElementHost.Hide()
                    Me.Controls.Remove(MyElementHost)
                    NoCellClick = False
                End If
            End If
        End Sub

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 5
    Par défaut
    J'ai fini par trouver une solution tout seul, je la donne au cas où quelqu'un rencontre le même problème.

    L'UserControl ne captait pas les événements car même si le thread qui était mis en pause n'était pas le thread principal, cela bloquait les événements de l'UserControl. Ce qui reste étrange c'est que cela ne s'opérait que en dehors de VS 2010...

    J'ai trouvé une alternative en utilisant un timer (pourquoi n'y ai je pas pensé plus tot ) ce qui ne bloque pas le thread, et garde la capture d'événements active tout en patientant 1sec le temps de survoler l'UserControl !

  3. #3
    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
    Par défaut
    Salut,

    C'est curieux cette différence entre l’exécution depuis Visual Studio et l'exécution depuis l'exécutable

    Après il faut noter que l'interop WPF / Windows Forms provoque quelques bizarreries dans certains contextes, mais ça reste curieux...

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 5
    Par défaut
    Je suis totalement d'accord mais je n'ai trouvé aucune explication possible

    Oui je le reconnais, car j'avais recrée une application de test simplifié (sans liaison de données avec moins de composant etc...) et là, avec l'exécutable, aucun soucis.
    J'avais du faire un truk qui ne plaisait pas à l'interop forms/wpf

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

Discussions similaires

  1. [Binding] UserControl non mis à jour
    Par matrix_ceg dans le forum Windows Presentation Foundation
    Réponses: 9
    Dernier message: 29/03/2010, 12h33
  2. Réponses: 10
    Dernier message: 16/09/2008, 11h06
  3. Réponses: 2
    Dernier message: 24/01/2006, 12h43
  4. [event] keyListener non pris en compte
    Par pierre.zelb dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 03/08/2005, 08h35

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