Как убрать фокус с TextBox в WinForms?

110

Мне нужно убрать фокус с нескольких текстовых полей. Я пробовал использовать:

textBox1.Focused = false;

ReadOnlyСтоимость его собственности составляет true.

Затем я попытался установить фокус на форме, чтобы удалить ее из всех текстовых полей, но это также не сработало:

this.Focus();

и функция возвращается falseпри выборе текстового поля.

Итак, как мне удалить фокус с TextBox?

Каллум Роджерс
источник

Ответы:

113

Вам понадобится другой настраиваемый элемент управления, чтобы переместить фокус.

Обратите внимание, что вы можете установить фокус на метку. Возможно, вы захотите подумать, где вы хотите, чтобы клавиша [Tab] переместилась дальше.

Также обратите внимание, что вы не можете установить его для формы. Контейнерные элементы управления, такие как Form и Panel, передают Focus своему первому дочернему элементу управления. Это может быть текстовое поле, от которого вы хотели бы отказаться.

Хенк Холтерман
источник
Спасибо; Я только что попытался сфокусироваться на метке, и теперь текстовое поле становится несфокусированным. Кажется, по какой-то причине вы не можете сосредоточиться на форме.
Каллум Роджерс,
7
Контейнерные элементы управления (форма, панель) передают фокус своему первому дочернему элементу управления.
Хенк Холтерман,
Отличное предложение. Это решило мою проблему. Я использую KeyPress против самой формы, и у меня есть несколько кнопок и т. Д. Проблема в том, что приложение принимает данные от кардридера, поэтому, если фокус уходит от самой формы, все ад вырвется наружу. Сосредоточение внимания на ярлыке после нажатия кнопки решило мою проблему. Спасибо!
Joelc
62

У меня не получилось сосредоточиться на лейбле, делать что-то вроде того, label1.Focus()правильно? текстовое поле по-прежнему имеет фокус при загрузке формы, однако попытка ответа Velociraptors сработала для меня, установив для элемента управления Form Active метку следующим образом:

private void Form1_Load(object sender, EventArgs e)  
{ 
    this.ActiveControl = label1;       
}
Почему ты такой серьезный
источник
7
Хотел бы я дать вам миллион стрелок вверх. Я пробовал ВСЕ, что предлагали люди, это единственное, что сработало. по какой-то причине текстовое поле ВСЕГДА
отвлекало
3
Это также работает для элементов управления контейнера, таких как панели. Я просто хотел полностью убрать фокус, и это сработало:this.ActiveControl = panelOnMyForm;
Тим Шмелтер
52

Вы можете добавить следующий код:

this.ActiveControl = null;  //this = form
FTheGodfather
источник
7
Я считаю, что это лучший ответ. Многие другие методы, такие как «Focus», если вы читаете MSDN, перечислены как методы низкого уровня для разработчиков элементов управления. Если вы хотите, чтобы все остальное было «не выбрано», это кажется самым простым подходом, так как это всего лишь одна маленькая строчка.
Ростов
1
Это может быть половиной причины, по которой Microsoft вообще добавила это свойство.
Panzercrisis
Это кажется наиболее элегантным решением, в моем случае оно сработало идеально.
NetWave
Я действительно хочу, чтобы этот ответ работал, потому что кажется, что он должен, но в моем случае он не сработал, потому что, хотя он и вызвал событие Leave, он не вызвал события Validating / Validated.
Рис Джонс,
32

Попробуйте отключить и включить текстовое поле.

Спенсер Рупорт
источник
5
Это работает довольно гладко, поскольку автоматически выбирает следующий элемент управления в списке вкладок.
Ник
3
Я разрабатываю в Silverlight с использованием MVVM и реализовал это, используя поведение, ориентированное на TextBox. Поскольку у меня не было другого удобного UIElement, чтобы установить фокус, решение «Отключить / Включить» творит чудеса. Спасибо!
Альберт Олдфилд
Как я могу это отключить?
miguelmpn
1
@miguelmpn textBox1.Enabled = false;отключит ваше текстовое поле. и установка для него trueснова включит его.
Рактим Бисвас
24

Вы также можете установить activecontrolсвойство форм nullкак нравится

ActiveControl = null;
Marcigo36
источник
7
Я надеюсь, что люди прокрутят вниз до этого места, а не просто воспользуются обходным
путем,
По-прежнему лучший ответ на сегодняшний день, приятель, прими мой голос.
xoxel
8

Focusустанавливает фокус ввода, поэтому установка его на форму не будет работать, потому что формы не принимают ввод. Попробуйте установить ActiveControlсвойство формы для другого элемента управления. Вы также можете использовать Selectдля выбора определенного элемента управления или SelectNextControlдля выбора следующего элемента управления в порядке табуляции.

Велоцирапторы
источник
1
Пробовал все остальное здесь и Select()работал у меня.
Derek W
8

Попробуй это:

Сначала настройте порядок табуляции.

Затем в событии загрузки формы мы можем программно отправить нажатие клавиши табуляции в приложение. Таким образом, это приложение будет уделять внимание первому элементу управления в порядке табуляции.

в загрузке формы даже напишите эту строку.

SendKeys.Send("{TAB}");

Это сработало для меня.

чариф расанга
источник
4

Этот пост привел меня к следующему:

ActiveControl = null;

Это позволяет мне захватывать весь ввод с клавиатуры на верхнем уровне без того, чтобы другие элементы управления сходили с ума.

Кристофер Айвз
источник
3

Я нашел хорошую альтернативу! Для меня это работает лучше всего, не зацикливаясь на чем-то другом.

Попробуй это:

private void richTextBox_KeyDown(object sender, KeyEventArgs e)
{    
    e.SuppressKeyPress = true;
}
Kaspi
источник
3

Я сделал это в своем настраиваемом элементе управления, я сделал это onFocus ()

this.Parent.Focus();

Итак, если в фокусе находится текстовое поле - он мгновенно фокусирует родительское текстовое поле (форма или панель ...). Это хороший вариант, если вы хотите сделать это в настраиваемом элементе управления.

Tommix
источник
2

Похоже, мне не нужно ставить фокус на какие-то другие элементы. В приложении Windows Phone 7 я использовал метод 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

У меня это сработало, но я не знаю, почему не сработало у вас: /

Bhawk1990
источник
2

Простым решением было бы убить фокус, просто создайте свой собственный класс:

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);
    }
}
VladL
источник
Именно такое решение я искал. Спасибо!
LeftyCoder
1
    //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();
                });
            }
        }
    }
торус
источник
0

Я обхожу это тем, что размещаю все элементы управления winform. Я делаю все ярлыки и не выбирающие элементы управления winform как порядок табуляции 0, затем мой первый элемент управления как порядок табуляции 2, а затем увеличиваю порядок каждого выбираемого элемента управления на 1, поэтому 3, 4, 5 и т. Д.

Таким образом, когда мои Winforms запускаются, первый TextBox не имеет фокуса!

CosineCuber
источник
0

вы можете сделать это двумя способами

  • просто установите для свойства "TabStop" желаемого текстового поля значение false, теперь оно не будет фокусироваться, даже если у вас есть одно текстовое поле
  • перетащите два текстовых поля

    1. сделайте видимым тот, на котором вы не хотите, чтобы foucus был текстовым полем1
    2. сделайте второй невидимым, перейдите в свойства этого текстового поля и выберите

значение tabindex равным 0 для textbox2

  1. и выберите tabindex вашего текстового поля от 1 до 1, теперь он не будет фокусироваться на текстовом поле 1
Adiii
источник
0

Если все, что вам нужно, это оптический эффект, что текстовое поле не имеет синего выделения по всему содержимому, просто не выделяйте текст:

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

После этого при добавлении содержимого с помощью .Text += "..."синего выделения отображаться не будет.

Роланд
источник
0

Пожалуйста, попробуйте установить TabStopнаFalse вашего контроля зрения , которая не является быть сосредоточенным.

Например:

txtEmpID.TabStop = false;
Шахиир
источник
-1

В конструкторе Form или UserControl, содержащем TextBox, напишите

SetStyle(ControlStyles.Selectable, false);

После InitializeComponent (); Источник: https://stackoverflow.com/a/4811938/5750078

Пример:

public partial class Main : UserControl
{

    public Main()
    {
        InitializeComponent();
        SetStyle(ControlStyles.Selectable, false);
    }
Loaderon
источник