Почему свойство MaxLength в RichTextBox не работает в WPF? - PullRequest
2 голосов
/ 12 февраля 2009

Я пытаюсь установить свойство MaxLength для RichTextBox, но оно, похоже, не работает.

Есть идеи, что может произойти?

Ответы [ 2 ]

2 голосов
/ 16 августа 2018

Основная проблема заключается в том, что WPF RichTextBox не имеет свойства MaxLength - в отличие от Windows.Forms.

Вот улучшение @whony's anwser. Если вы перехватываете событие PreviewKeyDown и проверяете длину, вам также нужно разрешить пользователю нажимать Delete и BackSpace после превышения лимита.

    // In constructor
    this.RichTextBox.PreviewKeyDown += this.EditBox_KeyDown;

    private void EditBox_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key != Key.Delete && e.Key != Key.Back)
        {
            var range = new TextRange(this.RichTextBox.Document.ContentStart, this.RichTextBox.Document.ContentEnd);
            if (range.Text.Length > this.MaxLength)
            {
                e.Handled = true;
                return;
            }
        }
    }

Вам также следует разрешить клавиши со стрелками, потому что вы не ожидаете, что они будут отключены.

Чтобы отключить вставку, поместите это в конструктор DataObject.AddPastingHandler(this.RichTextBox, this.EditBox_Paste); и

    private void EditBox_Paste(object sender, DataObjectPastingEventArgs e)
    {
        e.CancelCommand();
    }

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

0 голосов
/ 25 мая 2009

Добавьте этот код в событие KeyDown.

private void rLetter_KeyDown(object sender, KeyEventArgs e)
{
       TextRange tr= new TextRange(rLetter.Document.ContentStart,                                                   rLetter.Document.ContentEnd);
       if (tr.Text.Length > 4000 || e.Key == Key.Space || e.Key == Key.Enter)
       {
           e.Handled = true;
           return;
       }
}

У меня есть проблема, ошибка:

Протестируйте этот код с помощью копирования и вставки текста максимум 4000.

Извините за мой английский ..

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