Як видалити фокус з TextBox в WinForms?


110

Мені потрібно видалити фокус з декількох TextBoxes. Я спробував використовувати:

textBox1.Focused = false;

Його ReadOnlyвластивість становить true.

Потім я спробував встановити фокус на формі, щоб видалити її з усіх TextBoxes, але це також не працює:

this.Focus();

і функція повертається, falseколи вибрано текстове поле.

Отже, як я можу видалити фокус з TextBox?

Відповіді:


113

Щоб перемістити фокус, вам потрібен інший фокусируемый елемент управління.

Зауважте, що Ви можете встановити фокус на мітку. Ви можете розглянути, де ви хочете, щоб клавіша [Tab] взяла його далі.

Також зауважте, що ви не можете встановити його у формі. Елементи керування контейнерами, такі як Форма та Панель, передадуть Фокус на їх перше дочірнє управління. Який може бути TextBox, від якого ви хотіли, щоб він відійшов.


Дякую; Я просто спробував зосередитись на етикетці, і тепер текстове поле стає розмитим. Здається, ви не можете чомусь зосередитись на формі.
Callum Rogers

7
Елементи керування контейнерами (форма, панель) передадуть фокус на перший контроль дитини.
Хенк Холтерман

Чудова пропозиція. Це вирішило мою проблему. Я використовую KeyPress проти самої форми і маю кілька кнопок і т. Д. Проблема полягає в тому, що додаток приймає дані від читача карт, тож якщо фокус відходить від самої форми, то все пекло пропадає. Зосередження уваги на етикетці після натискання кнопки вирішило мою проблему. Дуже дякую!
joelc

62

Зосередження уваги на етикетці не працювало для мене, роблячи щось на кшталт label1.Focus()правильно? Текстове поле все ще має фокус під час завантаження форми, проте, намагаючись відповісти Velociraptors , працював на мене, встановивши активний елемент форми на такий ярлик:

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

7
Я б хотів, щоб я міг дати тобі мільйон стрілок. Я намагався ВСЕ, що запропонували люди, це єдине, що працювало. чомусь текстове поле ЗАВЖДИ
вкрало

3
Це також працює для управління контейнерами, як панелі. Я просто хотів повністю прибрати фокус, і це спрацювало:this.ActiveControl = panelOnMyForm;
Тім Шмелтер

52

Ви можете додати такий код:

this.ActiveControl = null;  //this = form

7
Я вважаю, що це найкраща відповідь. Дуже багато інших методів, таких як "Фокус", якщо ви читаєте MSDN, перераховані як методи низького рівня для дизайнерів управління. Якщо ви хочете, щоб все інше було "не вибрано", це здається найпростішим підходом, оскільки, ну, це лише одна невелика лінія.
Ростов

1
Це може бути половиною причини, чому Microsoft додала цю властивість в першу чергу.
Panzercrisis

Це здається найелегантнішим рішенням, воно спрацювало ідеально в моєму випадку.
NetWave

Я дуже хочу, щоб ця відповідь спрацювала, тому що вона просто здається, що має бути, але в моєму випадку вона не спрацювала, тому що вона викликала подію Leave, але це не викликало подій Validating / Valified.
Ріс Джонс

32

Спробуйте вимкнути та включити текстове поле.


5
Це працює досить гладко, оскільки тим часом автоматично вибирається наступний елемент керування у списку вкладок.
Нік

3
Я розвиваюся в Silverlight за допомогою MVVM і реалізую це, використовуючи поведінку, орієнтовану на TextBox. Оскільки у мене не було під рукою іншого UIElement, щоб орієнтуватися на рішення «Відключити / Включити» творили чудеса. Дякую!
Альберт Олдфілд

Як я можу його відключити?
miguelmpn

1
@miguelmpn textBox1.Enabled = false;відключить ваше текстове поле. і встановити його trueбуде повторно включено.
Рактім Бісвас

24

Ви також можете встановити activecontrolвластивість форм на nullвподобання

ActiveControl = null;

7
Я сподіваюся, що люди прокручуються донизу до цього, і не просто використовують вирішення, позначене як відповідь
makoshichi

І все-таки найкраща відповідь на цей день, ось приятелю, прийміть мою позицію.
xoxel

8

Focusвстановлює фокус введення, тому встановлення його на форму не працюватиме, оскільки форми не приймають введення. Спробуйте встановити ActiveControlвластивість форми на інший елемент керування. Ви також Selectможете вибрати певний елемент керування або SelectNextControlвибрати наступний елемент керування в порядку вкладки.


1
Випробував тут усе інше і Select()працював на мене.
Дерек Ш

8

Спробуйте це:

Спочатку налаштуйте порядок вкладок.

Тоді у випадку завантаження форми ми можемо відправити клавішу вкладки програмно натиснути на додаток. Таким чином, ця програма надасть фокус 1-му контуру в порядку вкладки.

у формі завантаження навіть записують цей рядок.

SendKeys.Send("{TAB}");

Це спрацювало для мене.


4

Ця публікація спонукала мене до цього:

ActiveControl = null;

Це дозволяє мені фіксувати весь вхід клавіатури на верхньому рівні без інших елементів управління.


3

Я знайшов хорошу альтернативу! Для мене це найкраще працює, не встановлюючи акценту на щось інше.

Спробуйте:

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

3

Я зробив це на своєму власному контролі, я зробив це onFocus ()

this.Parent.Focus();

Отже, якщо фокус на текстовому вікні - це миттєво фокусування батьківського текстового поля (форма або панель ...) Це хороший варіант, якщо ви хочете зробити це на власному контролі.


2

Здається, що мені не потрібно ставити акцент на будь-які інші елементи. У додатку Windows Phone 7 я використовував метод Focus, щоб зняти фокус Textbox.

Надавши наступну команду, фокус буде нічим:

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

Це працювало на мене, але я не знаю, чому це не працювало для вас: /


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

Саме таке рішення я шукав. Дякую!
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. Я роблю всі ярлики та невибір елементів управління формою як порядок вкладки 0, потім мій перший елемент управління як порядок вкладки 2, а потім збільшую порядок кожного вибору керування на 1, так 3, 4, 5 і т.д. ...

Таким чином, коли мої Winforms запускаються, перший TextBox не має уваги!


0

це можна зробити двома методами

  • просто перетворіть властивості "TabStop" потрібного текстового поля на помилкове, воно не фокусується, навіть якщо у вас є одне текстове поле
  • перетягніть два текстове поле

    1. зробіть видимим, на якому ви не хочете факуса, який є textbox1
    2. зробіть другий невидимим і перейдіть до властивостей цього текстового поля та виберіть

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

  1. і виберіть табіндекс свого текстового поля1 до 1, тепер він не зосередиться на textbox1

0

Якщо все, що вам потрібно, - це оптичний ефект, згідно з яким текстове поле не має синього виділення по всьому своєму вмісту, просто виберіть текст не:

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

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


0

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

Наприклад:

txtEmpID.TabStop = false;

-1

У конструкторі форми або 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);
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.