Основная проблема заключается в том, что 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 в элементе управления, а обработать его с помощью остальной части проверки в форме.