Блокировка возможности выделения текста в текстовом поле в форме окна C # - PullRequest
1 голос
/ 07 декабря 2010

Я хочу создать форму Windows в C # с текстовым полем, текст которого не может быть изменен или выбран пользователем. Мне удалось сделать его неизменным (ReadOnly = true), но я все еще могу выделить и выделить текст.

Как я могу это изменить?

Спасибо!

-R

Ответы [ 3 ]

1 голос
/ 07 декабря 2010

Это ожидаемое поведение и является намеренным. Вы можете убедиться в этом сами, если щелкнуть правой кнопкой мыши элемент в проводнике 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);
    }
}
0 голосов
/ 07 декабря 2010

Используйте label вместо textbox.Я думаю, что вы только хотите показать информацию, но не выбирать, не копировать, использование label будет лучшим вариантом ...

0 голосов
/ 07 декабря 2010

Это отключение? (Включено = ложно)

...