Это ожидаемое поведение и является намеренным. Вы можете убедиться в этом сами, если щелкнуть правой кнопкой мыши элемент в проводнике Windows и открыть его окно «Свойства». Все динамические текстовые поля на вкладке «Общие» можно выбрать, но нельзя изменить. Если это не то поведение, которое вам нужно, вам настоятельно рекомендуется использовать вместо него Label
элемент управления . Это именно та ситуация, для которой он предназначен - статический текст, который нельзя выбрать пользователем.
В случае, если по какой-либо причине вам не предложат использовать вместо этого элемент управления Label
, я продолжу отвечать на вопрос, который вы задали. Основная проблема с попыткой переопределить это поведение (например, переопределение поведения по умолчанию any control) заключается в том, что существует lot способов для пользователь может выполнить это: нажатие и перетаскивание мышью, двойное нажатие кнопки мыши, использование клавиш со стрелками на клавиатуре в сочетании с клавишей Shift , вкладка в текстовое поле,
щелкните правой кнопкой мыши и выберите «Выбрать все» в контекстном меню и т. д.
Ваш первый инстинкт может состоять в том, чтобы переопределить потенциально релевантные события, предоставляемые .NET Framework (например, OnMouseDown
, OnKeyDown
и т. Д.) И сбросить выбранную длину в 0, чтобы текст сразу был не выбран после его автоматического выбора. Однако это вызывает небольшой эффект мерцания в процессе, который может быть или не быть приемлемым для вас.
В качестве альтернативы, вы можете сделать то же самое, переопределив метод WndProc
элемента управления, отслеживая соответствующие сообщения окна и предотвращая передачу сообщений в базовый класс элемента управления в целом. Это предотвратит эффект мерцания, потому что базовый элемент управления TextBox
фактически никогда не получает сообщение, заставляющее его автоматически выбирать текст, но у него есть очевидный побочный эффект, заключающийся в том, что элемент управления не предпринимает никаких действий в результате этих распространенных событий. Похоже, в этом случае это, вероятно, не имеет значения для вас, но вы должны понимать, что это все еще довольно радикальный взлом. Я определенно не могу рекомендовать это как хорошую практику.
При этом, если вам все еще интересно, вы можете использовать следующий пользовательский класс UnselectableTextBox
. Это предотвращает обработку каждого сообщения окна, о котором я мог подумать, что, возможно, позволило бы пользователю выбирать текст. Это действительно работает, но справедливое предупреждение: могут быть и другие, о которых я не задумывался.
public class UnselectableTextBox : TextBox
{
public UnselectableTextBox() : base()
{
//Set it to read only by default
this.ReadOnly = true;
}
protected override void OnGotFocus(System.EventArgs e)
{
base.OnGotFocus(e);
//Prevent contents from being selected initally on focus
this.DeselectAll();
}
protected override void WndProc(ref System.Windows.Forms.Message m)
{
const int WM_KEYDOWN = 0x100;
const int WM_LBUTTONDOWN = 0x201;
const int WM_LBUTTONDBLCLK = 0x203;
const int WM_RBUTTONDOWN = 0x204;
if ((m.Msg == WM_KEYDOWN) || (m.Msg == WM_LBUTTONDOWN) ||
(m.Msg == WM_LBUTTONDBLCLK) || (m.Msg == WM_RBUTTONDOWN))
{
this.DeselectAll();
return;
}
base.WndProc(ref m);
}
}