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 qui perd le focus dès que l'on clique en dehors


Sujet :

Windows Presentation Foundation

  1. #1
    Membre du Club Avatar de Takumi
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2009
    Messages : 163
    Points : 62
    Points
    62
    Par défaut TextBox qui perd le focus dès que l'on clique en dehors
    Bonjour,

    J'ai dans mon application une TextBox et à son évènement LostFocus est associé une fonction. Ce que je souhaite faire c'est que cet évènement soit déclenché dès que l'on clic en dehors de la TextBox quand celle-ci avait le focus, et non pas de devoir forcement cliquer sur un autre Control qui aura récupérer le focus (car mon interface est composé de Control qui parfois ne le capture pas). J'ai un peu cherché sur le net sans succès, ni début de solution, donc je me tourne vers vous pour savoir si cela est techniquement possible. Pour info, j'essais d'appliquer le pattern MVVM dans mon application, donc j’espère que si solution il y a, elle ne risque pas de trop me faire sortir des sentiers de ce pattern.

    Je vous remercie d'avance.

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Août 2010
    Messages : 188
    Points : 129
    Points
    129
    Par défaut
    Moi aussi ca m'intéresse ca.
    Pareil je travail aussi avec MVVM

  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
    Points : 3 015
    Points
    3 015
    Par défaut
    Salut,

    Le problème est qu'un contrôle perd le focus lorsqu'un autre le prend, donc si tu cliques sur un conteneur ou un contrôle qui ne prend pas le focus, ton contrôle initial garde le focus.

    Quel est ton besoin réellement ?

  4. #4
    Membre du Club Avatar de Takumi
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2009
    Messages : 163
    Points : 62
    Points
    62
    Par défaut
    Bonjour,

    En faite j'ai crée un petit UserControl assez simple, un TextBlock et un TextBox. Quand je clique sur le TextBlock il disparaît et le TextBox apparait. Quand le TextBox perd le focus il disparait et le TextBlock revient. Mon objectif est donc que dès que le TextBox perd le focus celui disparaît car j'estime que l'utilisateur a finis de taper ce qu'il souhaitais ou bien qu'il ne souhaite plus écrire quoi que ce soit. Et quand je dit perdre le focus, c'est à partir du moment où il a cliqué en dehors de la TextBox, n'importe où (c'est un comportement que j'avais observé dans une autre application et que je souhaitais reproduire). Je sais qu'il faut qu'un autre contrôle prenne le focus pour que ma TextBox le perde, c'est pour cela que justement je vous demandais de l'aide car je ne voyais pas comment faire pour faire perdre le focus même sans qu'un autre contrôle le prenne.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    fait un petit exemple ca sera plus clair
    un projet complet

  6. #6
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 97
    Points : 106
    Points
    106
    Par défaut
    Hello,
    Voici un petit bout de code qui j'espère fait ce que tu veux.
    Il n'est pas très propre, à voir si tu peux l'améliorer.

    Le 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
    <Grid>   
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
     
            <Rectangle MouseDown="Rectangle_MouseDown" Fill="Aqua" Grid.RowSpan="2" />
     
            <TextBox x:Name="MyTxtBox" Text="Click pour modifier" Width="150" Height="30" Visibility="Hidden"></TextBox>
            <TextBlock x:Name="MyTxtBlock" MouseDown="MyTxtBlock_MouseDown" Text="{Binding ElementName=MyTxtBox,Path=Text}" Width="150" Height="30" Padding="5,3,0,0"/>
     
            <TextBox Grid.Row="1" x:Name="MyTxtBox2" Text="Click pour modifier" Width="150" Height="30" Visibility="Hidden"></TextBox>
            <TextBlock Grid.Row="1" x:Name="MyTxtBlock2" MouseDown="MyTxtBlock2_MouseDown" Text="{Binding ElementName=MyTxtBox2,Path=Text}" Width="150" Height="30" Padding="5,3,0,0"/>
     
        </Grid>
    Le code behind (je n'ai pas suivi le pattern MVVM pour ce petit exemple):
    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
    private void Rectangle_MouseDown(object sender, MouseButtonEventArgs e)
            {
                MyTxtBlock.Visibility = Visibility.Visible;
                MyTxtBox.Visibility = Visibility.Hidden;
     
                MyTxtBlock2.Visibility = Visibility.Visible;
                MyTxtBox2.Visibility = Visibility.Hidden;
            }
     
            private void MyTxtBlock_MouseDown(object sender, MouseButtonEventArgs e)
            {
                MyTxtBlock2.Visibility = Visibility.Visible;
                MyTxtBox2.Visibility = Visibility.Hidden;
     
                MyTxtBlock.Visibility = Visibility.Hidden;
                MyTxtBox.Visibility = Visibility.Visible;
                MyTxtBox.Focus();
            }
     
            private void MyTxtBlock2_MouseDown(object sender, MouseButtonEventArgs e)
            {
                MyTxtBlock.Visibility = Visibility.Visible;
                MyTxtBox.Visibility = Visibility.Hidden;
     
                MyTxtBlock2.Visibility = Visibility.Hidden;
                MyTxtBox2.Visibility = Visibility.Visible;
                MyTxtBox2.Focus();
            }
    Bon courage.

  7. #7
    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
    @ikeas :
    Des exemples de TextBlock éditables, tu en as sur la toile.

    @Cecile5 :
    Cette solution veut dire abonner tous les contrôles de la fenêtre ne prenant pas le focus à MouseDown. Ça peut vite devenir fastidieux. Mais ça peut peut-être faire l'affaire dans certains contextes...

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    ecoute chez moi ca marche .....
    quand on clique ca active la texte box
    si on clique en dehors ca la desactive

  9. #9
    Membre du Club Avatar de Takumi
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2009
    Messages : 163
    Points : 62
    Points
    62
    Par défaut
    Bonjour,

    Merci pour la textbox éditable, le principe est assez semblable à ce que je souhaitais faire mais le problème semble toujours rester le même, qui est la perte du focus. Ce que je voudrais surtout savoir maintenant c'est si cela est techniquement possible de faire perdre le focus même sans cliquer sur un autre Control qui va le prendre (et si possible compatible MVVM)? Car si cela demande trop de temps de programmation je me concentrerais là dessus plus tard et vais développer d'abord l'essentiel dans mon application puis reviendrais dessus quand le temps me le permettra.

    Je vous remercie d'avance.

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Regarde sur le net, il y a des exemples de code qui explique comment récupérer le focus sur un contrôle, en MVVM: il te suffira alors de l'adapter

  11. #11
    Membre régulier
    Inscrit en
    Octobre 2005
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 62
    Points : 85
    Points
    85
    Par défaut
    Ce qui est délicat, c'est qu'en plus, tu dois perdre 2 focus, le focus logique et le focus clavier. Essaye d'ajouter un handler à MouseDown directement sur ta fenêtre :
    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
    private void Window_MouseDown(object sender, MouseButtonEventArgs e)
    {
        var el = Keyboard.FocusedElement;
        if (el != null)
        {
            // La souris est normalement en dehors, mais on vérifie quand même
            var ht = VisualTreeHelper.HitTest(el as Visual, e.GetPosition(el));
            if (ht == null)
            {
                FocusManager.SetFocusedElement(FocusManager.GetFocusScope(this), null);
                Keyboard.ClearFocus(); // .NET 4 only
            }
        }
    }

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/05/2011, 16h52
  2. Réponses: 1
    Dernier message: 18/04/2007, 13h39
  3. Réponses: 18
    Dernier message: 13/12/2005, 13h27
  4. Réponses: 2
    Dernier message: 10/03/2004, 18h52
  5. Déterminer l'application qui a le Focus
    Par JakeGrafton dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 22/02/2004, 12h52

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