Focus

Signaler
Messages postés
546
Date d'inscription
mardi 26 novembre 2002
Statut
Membre
Dernière intervention
4 mai 2007
-
MoDDiB
Messages postés
546
Date d'inscription
mardi 26 novembre 2002
Statut
Membre
Dernière intervention
4 mai 2007
-
Je dispose d'un FlowLayoutPanel contenu dans un SplitContainer
et d'un TreeView.
lorsque je clique avec la souris sur un item du treeview celui ci obtient le focus et je veux juste apres ce clique pouvoir utiliser le clavier pour
le FlowLayoutPanel ( je capture le KeyDown du container)
Mais voilà le focus reste au treeview et je n'arrive pas a lui enlever.
j'ai testé la méthode focus sur le container et le flowlayoutpanel mais rien de se passe .

Merci de votre aide !

13 réponses

Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
75
Bonjour,

Un panel ne peut pas recevoir le focus.

/*
coq
MVP Visual C#
*/
Messages postés
546
Date d'inscription
mardi 26 novembre 2002
Statut
Membre
Dernière intervention
4 mai 2007
1
Désolé je n'ai pas indiqué que lorsque jappuie sur la touche tabulation tout fonctionne sans probleme : quelle est donc le control qui recoit le focus ?
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
75
Le contrôle suivant du formulaire dans l'ordre de tabulation.
Tu peux reproduire ce comportement via SelectNextControl.

/*
coq
MVP Visual C#
*/
Messages postés
546
Date d'inscription
mardi 26 novembre 2002
Statut
Membre
Dernière intervention
4 mai 2007
1
Ca ne fonctionne pas la méthode renvoie false , j'ai vérifié le tabstoponly il n'y a pas de problème de ce coté là.
Merci d'essayer de m'aider en tout cas !
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
75
Euh, tu veux faire quoi au juste ?

/*
coq
MVP Visual C#
*/
Messages postés
546
Date d'inscription
mardi 26 novembre 2002
Statut
Membre
Dernière intervention
4 mai 2007
1
Je veux pouvoir naviguer dans mon FlowLayoutPanel à l'aide des touches du clavier.
Etant donné que le FlowLayoutPanel n'as pas d'évenement KeyDown j'utilise l'évenement Keydown du splitcontainer qui contient le FlowLayoutPanel.
Je veux pouvoir naviguer juste apres que l'utilisateur ai cliqué sur un treeNode or celui-ci garde le focus et si j'utilise le clavier je naviguerai dans le TreeView !
Euh si je ne suis toujours pas clair dis le moi :)
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
75
En gros tu voudrais que les notifications d'appuis sur les touches fléchées te soit transmises avant de l'être au contrôle ?

/*
coq
MVP Visual C#
*/
Messages postés
546
Date d'inscription
mardi 26 novembre 2002
Statut
Membre
Dernière intervention
4 mai 2007
1
Non car même si je le recois avant ca sera tout de même transmis au contrôle : le treeView gardera son element selectionné or veux qu'il perde le focus :/
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
75
Ah oui, je vois, je n'avais pas saisit le fait que la demande de changement de focus échoue du fait même qu'il s'agisse du contrôle TreeView.
Je pense que le contrôle redemande le Focus directement après la levée des events.

/*
coq
MVP Visual C#
*/
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
75
Et tout à l'heure j'ai fait une erreur : les panels peuvent prendre le focus.

/*
coq
MVP Visual C#
*/
Messages postés
546
Date d'inscription
mardi 26 novembre 2002
Statut
Membre
Dernière intervention
4 mai 2007
1
Ok mais que faire ?
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
75
Euh, une petite bidouille, faut de mieux : on vas utiliser les filtres de messages (implémentation de IMessageFilter) afin de reforcer la perte de focus, et ce après la fin de traitement des messages par le contrôle.
Mais bon si tu peux faire sans le contrôle TreeView ça serais peut être mieux.

Ca peut donner quelquechose de ce genre :

public partial class Form1 : Form, IMessageFilter
{
public Form1()
{
InitializeComponent();


// ajout du filtre
Application.AddMessageFilter(this);
}


private bool _mustKillTreeViewFocus = false;


#region IMessageFilter Members


public bool PreFilterMessage(ref Message m)
{
if (this._mustKillTreeViewFocus)
{
this.flowLayoutPanel1.Focus();


if ( !this.flowLayoutPanel1.Focused )
this._mustKillTreeViewFocus = false;
}


return false;
}


#endregion


protected override void OnClosed(EventArgs e)
{
try
{
// retrait du filtre
Application.RemoveMessageFilter(this);
}
catch { }


base.OnClosed(e);
}


private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
this._mustKillTreeViewFocus = true; // on demande à forcer la perte de focus du treeview
this.flowLayoutPanel1.Focus();
}
}

Mais bon, je voudrais bien avoir une autre solution si elle existe ^^

/*
coq
MVP Visual C#
*/
Messages postés
546
Date d'inscription
mardi 26 novembre 2002
Statut
Membre
Dernière intervention
4 mai 2007
1
Bon ca fonctionne mais c'est beaucoup de bidouillage.
On peut aussi imaginer un timer de quelques milliseconde qui se lance à la fin de l'event mais c'est encore plus bidouillage :)

Merci beaucoup pour ton aide et j'espère que quelqu'un nous donnera une solution satisfaisante afin
d'enfin pouvoir dormir l'esprit serein :)