Comment supprimer le focus d'une zone de texte dans WinForms?
Je dois supprimer le focus de plusieurs zones de texte. J'ai essayé d'utiliser:
textBox1.Focused = false;
Sa valeur de propriété ReadOnly
est true
.
J'ai ensuite essayé de mettre l'accent sur le formulaire, afin de le supprimer de toutes les zones de texte, mais cela ne fonctionne pas non plus:
this.Focus();
Et la fonction retourne false
lorsqu'une zone de texte est sélectionnée.
Alors, comment puis-je supprimer le focus d'une zone de texte?
18 réponses
Vous avez besoin d'un autre contrôle focusable pour déplacer le focus.
Notez que vous pouvez définir le Focus sur une étiquette. Vous voudrez peut-être considérer où vous voulez que la touche [Tab] la prenne ensuite.
Notez également que vous ne pouvez pas le définir sur le formulaire. Les contrôles de conteneur comme le formulaire et le Panneau passeront le Focus sur leur premier contrôle enfant. Ce qui pourrait être la zone de texte dont vous vouliez qu'elle s'éloigne.
Se concentrer sur l'étiquette n'a pas fonctionné pour moi, faire quelque chose comme label1.Focus()
n'est-ce pas?
la zone de texte a toujours le focus lors du chargement du formulaire, mais en essayant Velociraptors
réponse, a fonctionné pour moi, en définissant le contrôle actif du formulaire sur l'étiquette comme ceci:
private void Form1_Load(object sender, EventArgs e)
{
this.ActiveControl = label1;
}
, Vous pouvez ajouter le code suivant:
this.ActiveControl = null; //this = form
, Vous pouvez également définir les formes activecontrol
la propriété de null
comme
ActiveControl = null;
Focus
définit le focus d'entrée, donc le définir sur le formulaire ne fonctionnera pas car les formulaires n'acceptent pas l'entrée. Essayez de définir la propriété ActiveControl
du formulaire sur un contrôle différent. Vous pouvez également utiliser Select
pour sélectionner un contrôle spécifique ou SelectNextControl
pour sélectionner le contrôle suivant dans l'ordre de tabulation.
Essayez celui-ci:
Configurez D'abord l'ordre des onglets.
Ensuite, dans l'événement de charge de formulaire, nous pouvons envoyer une touche de tabulation par programme à l'application. De sorte que l'application donnera le focus au 1er contol dans l'ordre des onglets.
Dans le formulaire charger même écrire cette ligne.
SendKeys.Send("{TAB}");
Cela a fonctionné pour moi.
Ce post m'a amené à faire ceci:
ActiveControl = null;
Cela me permet de capturer toutes les entrées du clavier au niveau supérieur sans que les autres contrôles deviennent fous.
Il semble que je n'ai pas besoin de mettre l'accent sur d'autres éléments. Sur une application Windows Phone 7, j'ai utilisé la méthode Focus pour désactiver le Focus d'une zone de texte.
Donner la commande suivante définira le focus sur rien:
void SearchBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
Focus();
}
}
Http://msdn.microsoft.com/en-us/library/system.windows.forms.control.focus.aspx
Cela a fonctionné pour moi, mais je ne sais pas pourquoi cela n'a pas fonctionné pour vous: /
Une solution simple serait de tuer le focus, il suffit de créer votre propre classe:
public class ViewOnlyTextBox : System.Windows.Forms.TextBox {
// constants for the message sending
const int WM_SETFOCUS = 0x0007;
const int WM_KILLFOCUS = 0x0008;
protected override void WndProc(ref Message m) {
if(m.Msg == WM_SETFOCUS) m.Msg = WM_KILLFOCUS;
base.WndProc (ref m);
}
}
J'ai trouvé une bonne alternative! Cela fonctionne mieux pour moi, sans mettre l'accent sur autre chose.
Essayez ça:
private void richTextBox_KeyDown(object sender, KeyEventArgs e)
{
e.SuppressKeyPress = true;
}
Je l'ai fait sur mon contrôle personnalisé, j'ai fait ceci onFocus ()
this.Parent.Focus();
Donc, si texbox concentré-il se concentre instantanément textbox parent (formulaire, ou panneau...) C'est une bonne option si vous voulez faire cela sur le contrôle personnalisé.
//using System;
//using System.Collections.Generic;
//using System.Linq;
private void Form1_Load(object sender, EventArgs e)
{
FocusOnOtherControl(Controls.Cast<Control>(), button1);
}
private void FocusOnOtherControl<T>(IEnumerable<T> controls, Control focusOnMe) where T : Control
{
foreach (var control in controls)
{
if (control.GetType().Equals(typeof(TextBox)))
{
control.TabStop = false;
control.LostFocus += new EventHandler((object sender, EventArgs e) =>
{
focusOnMe.Focus();
});
}
}
}
La façon dont je le contourner est de placer tous mes contrôles winform. Je fais toutes les étiquettes et les contrôles winform non sélectionnables en tant qu'ordre de tabulation 0, puis Mon premier contrôle en tant qu'ordre de tabulation 2, puis incrémente l'ordre de chaque contrôle sélectionnable par 1, donc 3, 4, 5 etc...
De cette façon, lorsque mes Winforms démarrent, la première zone de texte n'a pas de focus!
Vous pouvez le faire par deux méthodes
- Il suffit de faire les propriétés" TabStop " de la zone de texte souhaitée à false maintenant, il ne se concentrera pas même si vous avez un champ de texte
-
Faites glisser deux zones de texte
- rendre visible sur lequel vous ne voulez pas foucus qui est textbox1
- rendez le 2ème invisible et accédez aux propriétés de ce champ de texte et sélectionnez
Tabindex valeur à 0 de textbox2
- et sélectionnez le tabindex de votre textbox1 à 1 maintenant, il ne se concentrera pas sur textbox1
Si tout ce que vous voulez est l'effet optique que la zone de texte n'a pas de sélection bleue sur tout son contenu, il suffit de sélectionner aucun texte:
textBox_Log.SelectionStart = 0;
textBox_Log.SelectionLength = 0;
textBox_Log.Select();
Après cela, lors de l'ajout de contenu avec .Text += "..."
, Aucune sélection bleue ne sera affichée.
Essayez de définir TabStop
sur False
pour votre contrôle de vue qui n'est pas focalisé.
Pour par exemple:
txtEmpID.TabStop = false;
Dans le constructeur du formulaire ou UserControl contenant la zone de texte, écrivez
SetStyle(ControlStyles.Selectable, false);
Après L'InitializeComponent(); Source: https://stackoverflow.com/a/4811938/5750078
Exemple:
public partial class Main : UserControl
{
public Main()
{
InitializeComponent();
SetStyle(ControlStyles.Selectable, false);
}