TextBox 重新获得焦点,而其他控件则没有

Posted

技术标签:

【中文标题】TextBox 重新获得焦点,而其他控件则没有【英文标题】:TextBox took back focus while other controls don't 【发布时间】:2021-10-10 06:13:42 【问题描述】:

当我离开另一个文本框时,我想专注于一个文本框。 假设我有 3 个文本框。焦点在第一个,当我点击第二个时,我想把焦点放在最后一个。 我订阅了第一个文本框的离开事件,并尝试关注第三个文本框,例如:third.Focus()。它获得了一段时间的焦点,但第二个最终得到了它(我点击的那个)。 奇怪的是,如果我将第二个 TextBox 替换为 MaskedTextBox(或任何其他控件),焦点仍然在第三个。 不过按 Tab 确实有效。

这些是工具箱中的纯文本框。

这是什么原因,我该如何解决?

【问题讨论】:

【参考方案1】:

尝试处理 textBox2 的 Enter 事件。 (在属性窗口中双击 Enter 事件)

//From Form1.Designer.cs

this.textBox2.Enter += new System.EventHandler(this.textBox2_Enter);
private void textBox2_Enter(object sender, EventArgs e)

   textBox3.Focus();

编辑:

这段代码看起来很奇怪,但它对我有用。根据这篇文章HERE 我使用ActiveControl 属性而不是Focus() 方法。但是 TextBox 的行为很奇怪,因为它会尝试多次聚焦。

    public partial class Form1 : Form
    
        public Form1()
        
            InitializeComponent();

            foreach (Control control in Controls)
            
                control.LostFocus += (s, e) => Console.WriteLine(control.Name + " LostFocus");
                control.GotFocus += (s, e) =>
                
                    Console.WriteLine(control.Name + " GotFocus");
                    if (!requestedFocusToTextBox2) return;
                    ActiveControl = textBox2; //textBox2.Focus() doesn't work
                    requestedFocusToTextBox2 = false;
                ;
            
        

        private bool requestedFocusToTextBox2;

        private void textBox1_Leave(object sender, EventArgs e)
        
            ActiveControl = textBox2;
            requestedFocusToTextBox2 = true;
        
    

【讨论】:

第二个文本框应保持可编辑/可点击状态,因此始终无法返回焦点。 我不理解您要求的行为。你可以使用TabOrderTabStop 属性吗?是否可以对Enter 事件实施某些条件? 当我离开一个特定的文本框(点击按钮或其他)时,另一个特定的文本框应该被聚焦,离开另一个文本框不应该激活聚焦。 我用另一个例子编辑了我的帖子。这对我有用,但我不知道这是否是最好的方法

以上是关于TextBox 重新获得焦点,而其他控件则没有的主要内容,如果未能解决你的问题,请参考以下文章

C# 简单的方法统一设置控件在焦点获得时,背景色改变,焦点离开时背景色恢复默认

WPF虚拟键盘如何不获得当前焦点

vb6 webbrowser 如何判断当前网页中获取焦点的是否一个文本框?

如何为Textbox控件添加一个鼠标单击(click)事件

WPF 复合控件焦点设置

如何在表单加载中对文本框设置焦点