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

86

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

textBox1.Focused = false;

Свойство свойства ReadOnly true.

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

this.Focus();

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

Итак, как удалить фокус из TextBox?

Теги:
winforms
textbox
focus

17 ответов

91
Лучший ответ

Для перемещения фокуса вам понадобится другой настраиваемый элемент управления.

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

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

  • 0
    Спасибо; Я просто попытался сфокусироваться на метке, и теперь текстовое поле становится не сфокусированным. Кажется, вы не можете сосредоточиться на форме по какой-то причине.
  • 7
    Контейнерные элементы управления (форма, панель) передают фокус своему первому дочернему элементу управления.
Показать ещё 1 комментарий
45

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

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

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

  • 5
    Это работает довольно гладко, поскольку автоматически выбирает следующий элемент управления в списке вкладок.
  • 3
    Я разрабатываю в Silverlight с использованием MVVM и реализовал это с помощью поведения, ориентированного на TextBox. Так как у меня не было другого удобного UIElement, чтобы сконцентрировать внимание на решении Disable / Enable, это творит чудеса. Спасибо!
Показать ещё 3 комментария
28

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

this.ActiveControl = null;  //this = form
  • 6
    Я считаю, что это лучший ответ. Многие другие методы, такие как «Фокус», если вы читаете MSDN, перечислены как методы низкого уровня для разработчиков элементов управления. Если вы хотите, чтобы все остальное было «не выбрано», это кажется самым простым подходом, поскольку, ну, это всего лишь одна маленькая строка.
  • 0
    Это может быть половина причины, по которой Microsoft добавила это свойство в первую очередь.
10

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

ActiveControl = null;
  • 6
    Я надеюсь, что люди прокручивают весь путь до этого, а не просто используют обходной путь, помеченный как ответ
  • 0
    Тем не менее, лучший ответ на этот день, приятель, возьми мой голос.
8

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

  • 1
    Перепробовал все остальное здесь и Select() работал на меня.
  • 0
    @Derek Дерек W ты мужчина
6

попробуйте этот.

сначала настройте порядок вкладок.

то в событии загрузки формы мы можем отправить ключ табуляции программно в приложение. так что приложение будет сосредоточено на 1-м контуле в порядке вкладок.

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

SendKeys.Send("{TAB}");

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

  • 0
    Отличное решение!
4

Этот пост заставил меня сделать это:

ActiveControl = null;

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

3

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

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);
    }
}
  • 0
    Именно то решение, которое я искал. Спасибо!
3

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

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

3

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

Попробуйте следующее:

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

Я сделал это на своем пользовательском контроле, я сделал это onFocus()

this.Parent.Focus();

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

  • 0
    Этот работал для меня.
  • 0
    nvm: / я использую ActiveControl = null;
1

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

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

    • сделать видимым, на котором вы не хотите foucus, который является textbox1
    • сделать второй невидимым и перейти к свойствам этого текстового поля и выбрать

Значение tabindex до 0 текстового поля2

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

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

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

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

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

Например,

txtEmpID.TabStop = false;
0

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню