如何在 WinForms 中从 TextBox 中移除焦点?

我需要从几个文本框中移除焦点:

textBox1.Focused = false;

它的 ReadOnly属性值是 true

然后我尝试将焦点设置在表单上,以便从所有 TextBox 中移除它,但这也不起作用:

this.Focus();

当选择一个文本框时,该函数返回 false

So, how do I remove the focus from a TextBox?

212932 次浏览

尝试禁用并启用文本框。

You need some other focusable control to move the focus to.

注意,可以将 Focus 设置为 Label。您可能需要考虑下一步要将[ Tab ]键放在哪里。

还要注意,您不能将它设置为 Form。像 Form 和 Panel 这样的容器控件将把 Focus 传递给它们的第一个子控件。也可能是你想让它远离的文本框。

Focus设置输入焦点,因此将焦点设置为表单不起作用,因为表单不接受输入。尝试将窗体的 ActiveControl属性设置为其他控件。还可以使用 Select选择特定的控件,或者使用 SelectNextControl按制表符顺序选择下一个控件。

我已经找到了一个很好的替代方案! 它对我来说最有效,而不是把注意力放在别的事情上。

试试这个:

private void richTextBox_KeyDown(object sender, KeyEventArgs e)
{
e.SuppressKeyPress = true;
}

专注于标签对我来说不起作用,做一些像 label1.Focus()的东西,对吗? 文本框在加载表单时仍然有焦点,但尝试 迅猛龙 answer, worked for me, setting the Form's Active control to the label like this:

private void Form1_Load(object sender, EventArgs e)
{
this.ActiveControl = label1;
}

看起来我不需要把焦点放在任何其他元素上。在 WindowsPhone7应用程序中,我一直在使用 Focus 方法来取消文本框的 Focus。

下面的命令不会让焦点集中到任何地方:

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

这对我有用,但我不知道为什么对你没用:/

试试这个:

First set up tab order.

然后在表单加载事件中,我们可以通过编程方式将制表符键发送给应用程序。因此,应用程序将把焦点放在第一个控件的制表符顺序。

在表格中加载甚至写这一行。

SendKeys.Send("{TAB}");

这确实对我有用。

一个简单的解决方案就是关闭焦点,创建你自己的类:

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);
}
}

还可以将窗体 activecontrol属性设置为 null,如

ActiveControl = null;

我在自定义控件上做了这个,我在 Focus ()上做了这个

this.Parent.Focus();

因此,如果文本框集中-它立即集中文本框父(形式,或面板...) 如果您想在自定义控件上使用此选项,那么这是一个很好的选择。

这篇文章引导我这样做:

ActiveControl = null;

这使我能够在顶层捕获所有键盘输入,而不会使其他控件失控。

    //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();
});
}
}
}

我绕过它的方法是放置所有的 winform 控件。我将所有的标签和非选择的 winform 控件设置为选项卡顺序0,然后将第一个控件设置为选项卡顺序2,然后将每个可选控件的顺序增加1,从而得到3、4、5等。.

这样,当我的 Winform 启动时,第一个 TextBox 没有焦点!

您可以添加以下代码:

this.ActiveControl = null;  //this = form

你可以用两种方法做到这一点

  • 只要将所需文本框的“ TabStop”属性设置为 false,即使只有一个文本字段,它也不会聚焦
  • 拖动两个文本框

    1. 使一个可见的,你不希望聚焦,这是文本框1
    2. 使第二个不可见,然后转到该文本字段的属性并选择

Tabindex 值为 textbox2的0

  1. 并选择 textbox1到1的 tabindex 现在它将不再关注 textbox1

如果你想要的只是文本框内容上没有蓝色选区的光学效果,只需要选择“没有文本”即可:

textBox_Log.SelectionStart = 0;
textBox_Log.SelectionLength = 0;
textBox_Log.Select();

在此之后,当添加内容与 .Text += "...",没有蓝色选择将显示。

请尝试将您的视图控件的 TabStop设置为 False,因为它没有被对焦。

例如:

txtEmpID.TabStop = false;

在保存 TextBox 的 Form 或 UserControl 的构造函数中写入

SetStyle(ControlStyles.Selectable, false);

在 InitializeComponent ()之后; 来源: http://stackoverflow/a/4811938/5750078 https://stackoverflow.com/a/4811938/5750078

例如:

public partial class Main : UserControl
{


public Main()
{
InitializeComponent();
SetStyle(ControlStyles.Selectable, false);
}

你可以试试:

textBox1.Enable = false;

使用 System.Windows.Input

Keyboard.ClearFocus();

Kinda late to the party in 2022, however none of the solutions here worked for me (idk why) using .Net_6.0_windows, so I've come up with this solution:

Label focusoutLabel = new Label() {
Text = "",
Name = "somegenericplaceholdernamethatwillneverbeusedinmyprogram",
Visible = false,
};
this.Controls.Add(focusoutLabel);
this.ActiveControl = focusoutLabel;

^ 将此代码放置到窗体加载处理程序 ^