C# 如何在WinForms中从文本框中删除焦点?

C# 如何在WinForms中从文本框中删除焦点?,c#,.net,winforms,textbox,focus,C#,.net,Winforms,Textbox,Focus,我需要从几个文本框中删除焦点。我尝试使用: textBox1.Focused = false; 其ReadOnly属性值为true 然后,我尝试将焦点设置在表单上,以便将其从所有文本框中删除,但这也失败了: this.Focus(); 当选择文本框时,函数返回false 那么,如何从文本框中移除焦点呢?尝试禁用并启用文本框。您需要一些其他可聚焦控件来将焦点移动到文本框 请注意,可以将焦点设置为标签。您可能想考虑下一个[Tab]键在哪里取它。 还请注意,不能将其设置为表单。像Form和Pane

我需要从几个文本框中删除焦点。我尝试使用:

textBox1.Focused = false;
ReadOnly
属性值为
true

然后,我尝试将焦点设置在表单上,以便将其从所有文本框中删除,但这也失败了:

this.Focus();
当选择文本框时,函数返回
false


那么,如何从文本框中移除焦点呢?

尝试禁用并启用文本框。

您需要一些其他可聚焦控件来将焦点移动到文本框

请注意,可以将焦点设置为标签。您可能想考虑下一个[Tab]键在哪里取它。
还请注意,不能将其设置为表单。像Form和Panel这样的容器控件将焦点传递给它们的第一个子控件。这可能是你想让它离开的文本框

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

我找到了一个很好的替代方法!它最适合我,不会把注意力放在其他事情上

试试看:

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

专注于标签对我来说不起作用,比如做
label1.Focus()
对吗? 加载表单时,文本框仍然具有焦点,但仍在尝试 回答,为我工作,将窗体的活动控件设置为标签,如下所示:

private void Form1\u加载(对象发送方,事件参数e)
{ 
this.ActiveControl=label1;
}

似乎我不必将焦点设置为任何其他元素。在WindowsPhone7应用程序中,我一直在使用Focus方法来取消文本框的焦点设置

发出以下命令将焦点设置为“无”:

void SearchBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        Focus();
    }
}

它对我有效,但我不知道为什么对你无效://

试试这个:

首先设置选项卡顺序

然后在FormLoad事件中,我们可以通过编程方式向应用程序发送一个tab键。这样应用程序将把焦点放在选项卡顺序中的第一个控件上

在form load中,甚至写下这一行

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()上做了这个

因此,如果texbox聚焦-它会立即聚焦textbox父对象(窗体或面板…)
如果您想在自定义控件上执行此操作,这是一个很好的选择。

这篇文章引导我这样做:

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();
                });
            }
        }
    }
//使用System.Collections.Generic; //使用System.Linq; 私有void Form1\u加载(对象发送方、事件参数e) { 聚焦于其他控件(Controls.Cast(),button1); } private void FocusOnOtherControl(IEnumerable controls,Control focusOnMe),其中T:Control { foreach(控件中的var控件) { if(control.GetType().Equals(typeof(TextBox))) { control.TabStop=false; control.LostFocus+=新的EventHandler((对象发送方,EventArgs e)=> { focusOnMe.Focus(); }); } } }
我绕过它的方法是放置所有winform控件。我将所有标签和未选择的winform控件设置为tab order 0,然后将第一个控件设置为tab order 2,然后将每个可选择控件的顺序增加1,因此3、4、5等


这样,当我的Winforms启动时,第一个文本框没有焦点

您可以添加以下代码:

this.ActiveControl = null;  //this = form

你可以用两种方法来做这件事

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

  • 使一个不需要foucus的文本框1可见
  • 使第二个不可见,转到该文本字段的属性并选择
将textbox2的tabindex值设置为0

  • 然后选择文本框1至1的选项卡索引 现在它将不再关注textbox1

  • 如果您想要的只是文本框内容上没有蓝色选择的光学效果,只需选择“无文本”:

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

    在此之后,当使用
    .Text+=“…”
    添加内容时,将不会显示任何蓝色选择。

    请尝试将未聚焦的视图控件的
    选项卡设置为
    False

    例如:

    txtEmpID.TabStop = false;
    

    在窗体的构造函数中或在持有TextBox的UserControl中写入

    SetStyle(ControlStyles.Selectable, false);
    
    在初始化组件()之后; 资料来源:

    例如:

    public partial class Main : UserControl
    {
    
        public Main()
        {
            InitializeComponent();
            SetStyle(ControlStyles.Selectable, false);
        }
    
    您可以尝试:

    textBox1.Enable = false;
    

    使用System.Windows.Input

    Keyboard.ClearFocus();
    

    谢谢我只是试着把注意力集中在标签上,现在文本框变得不集中。由于某些原因,您似乎无法将焦点放在窗体上。容器控件(窗体、面板)将把焦点传递给它们的第一个子控件。这是一个很好的建议。这解决了我的问题。我对表单本身使用按键,并且有几个按钮等。问题是应用程序从读卡器获取输入,所以如果焦点离开表单本身,那么所有的麻烦都会消失。点击一个按钮后集中注意力在标签上解决了我的问题。非常感谢!这项工作非常顺利,因为它同时会自动选择选项卡列表中的下一个控件。我正在Silverlight中使用MVVM进行开发,并使用针对文本框的行为实现了这项功能。因为我手头没有另一个UIElement来设置禁用/启用解决方案的焦点,所以效果非常好。谢谢如何禁用它?@miguelmpn
    textBox1.Enabled=false将禁用您的文本框。将其设置为
    true
    将重新启用
    Keyboard.ClearFocus();