Я пишу приложение с субтитрами для видео.Он содержит редактор RichTextBox.Когда я открываю текстовый файл с диска, я обрабатываю его методом, который возвращает FlowDocument с отдельными объектами Paragraph и Run, и, наконец, назначает этот документ свойству RichTextBox.Document.Проблема, с которой я столкнулся, заключается в том, что если я использую встроенную функцию отмены перед назначением созданного FlowDocument свойству RichTextBox.Document (то есть, когда приложение только что запущено, а RichTextBox пусто), все работает нормально, и я могу отменитьмножественные действия (если позволяет память, поскольку UndoLimit RichTextBox установлен в -1).Однако после назначения FlowDocument, возвращенного из моего метода, RichTextBox.Document, я могу отменить только последнее действие.
Я попытался установить UndoLimit = 0 и затем UndoLimit = -1, чтобы сбросить стек отменыпосле назначения FlowDocument.Я также попытался установить для свойства IsUndoEnable значение false и затем значение true.Также попытался изменить метод, чтобы избежать назначения FlowDocument непосредственно свойству Document RichTextBox.Вместо этого я попытался добавить индивидуально созданные блоки непосредственно в свойство RichTextBox.Document.Blocks, заключенное в методы BeginChange () и EndChange ().Ничего из этого не сработало.
Это код назначения:
// If the method returned a valid document...
if (flowDocument != null)
{
// Clear rich text box.
Editor.Document.Blocks.Clear();
// Set document.
Editor.Document = flowDocument;
// Set flag.
DOCUMENT_LOADED = true;
}
Метод создания FlowDocument, который назначен свойству RichTextBox.Document:
public static FlowDocument CreateFlowDocumentFromText(string text)
{
// Create return document.
FlowDocument document = null;
// Check for valid string.
if (!String.IsNullOrEmpty(text))
{
// Create document.
document = new FlowDocument();
// Split it in new lines and remove empty lines.
string[] paragraphs = text.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None);
// For each paragraph.
foreach (string paragraph in paragraphs)
{
// Create paragraph object.
Paragraph paragraphContent = new Paragraph(new Run(paragraph));
// Check maximum length.
paragraphContent.Background = Utilities.CheckParagraphLength(paragraphContent);
// Add paragraph to editor.
document.Blocks.Add(paragraphContent);
}
}
return document;
}
И альтернативный метод, который я пытался избежать присвоения документа:
public static void LoadTextEditor(RichTextBox editor, string text)
{
// Check for valid string.
if (!String.IsNullOrEmpty(text))
{
// Split it in new lines and remove empty lines.
string[] paragraphs = text.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None);
// For each paragraph.
foreach (string paragraph in paragraphs)
{
// Create paragraph object.
Paragraph paragraphContent = new Paragraph(new Run(paragraph));
// Check maximum length.
paragraphContent.Background = Utilities.CheckParagraphLength(paragraphContent);
// Add paragraph to editor.
editor.BeginChange();
editor.Document.Blocks.Add(paragraphContent);
editor.EndChange();
}
}
}
Во всех случаях ожидаемый результат должен был быть в состоянии отменить кратные изменения, но в результате было отменено только последнее изменение.Кроме того, после назначения документа RichTextBox работает так, как будто UndoLimit = 1, поскольку независимо от того, какие другие изменения я делаю, я могу отменить только самое последнее.