Как предотвратить фокусировку на текстовом поле, если на него не нажали? - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть приложение WinForms, в верхней части которого находится элемент управления TextBox (окно поиска). Этот TextBox постоянно получает фокус при обычном использовании приложения, и это очень отвлекает.

Я бы хотел, чтобы TextBox получал фокус только в том случае, если пользователь явно щелкнул по нему.

Я могу придумать пару довольно сложных способов сделать это:

  • Изменение изображения текстового поля в текстовое поле при нажатии
  • Отслеживание щелчков мыши и смещение фокуса в зависимости от состояния мыши

Есть ли что-то более простое, что я могу сделать, чтобы достичь этого?


Изменить, чтобы добавить лучшее описание проблемы на основе нового понимания

Основываясь на полученных мной ответах, я теперь немного лучше понимаю, что стало причиной этой проблемы. Когда пользователь взаимодействовал с моим приложением, различные действия приводили к тому, что элементы управления либо отключались, либо полностью исчезали. Если один из этих элементов управления оказался в то время в фокусе, то следующий элемент управления в порядке вкладок получит фокус.

Я не знаю, что было «следующим элементом управления», прежде чем я добавил текстовое поле в вопросе. Приложение имеет сотни элементов управления на экране в любой момент времени, и я уверен, что порядок вкладок никогда не определялся намеренно. Что бы это ни было раньше, это было безобидно. После добавления текстового поля поиска казалось, что элемент управления всегда будет с фокусом.

Вот очень простой пример, демонстрирующий происходящее:

public class Form1 : Form
{
    public Form1()
    {
        var button = new Button
        {
            Location = new System.Drawing.Point(159, 67),
            Size = new System.Drawing.Size(75, 23),
            TabIndex = 0,
            Text = @"Click me"
        };
        button.Click += (sender, args) => button.Enabled = false;

        var textBox = new TextBox
        {
            Location = new System.Drawing.Point(159, 142),
            Name = "textBox1",
            Size = new System.Drawing.Size(174, 20),
            TabIndex = 1
        };

        SuspendLayout();
        ClientSize = new System.Drawing.Size(486, 392);
        Controls.Add(textBox);
        Controls.Add(_button);
        ResumeLayout(false);
        PerformLayout();
    }
}

После запуска приложения нажатие на кнопку заставит текстовое поле получить фокус, поскольку оно является следующим в порядке вкладок. Как упомянул Handbag Crab в принятом ответе, такого поведения можно избежать, установив TabStop = false в текстовом поле.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Подкласс функции TextBox и WndProc для захвата сообщения фокуса и его обработки. Может быть, что-то вроде этого:

if (m.Msg == WM_MOUSEACTIVATE) {
    m.Result = (IntPtr)MA_NOACTIVATEANDEAT;
    return;
  }
  base.WndProc(ref m);
0 голосов
/ 06 сентября 2018
textBox1.TabStop = false;

Вышеприведенное должно остановить его получение фокуса от табуляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...