我正在编写一个视频字幕应用。它包含一个RichTextBox编辑器。从磁盘打开文本文件时,将使用一种方法处理该文件,该方法返回带有单个Paragraph和Run对象的FlowDocument,最后将该文档分配给RichTextBox.Document属性。 我遇到的问题是,如果我在将创建的FlowDocument分配给RichTextBox.Document属性之前使用内置的Undo函数(即当应用程序刚刚启动且RichTextBox为空白时),则一切正常,并且我可以撤消多个操作(内存允许,因为RichTextBox的UndoLimit设置为-1)。 但是,将方法返回的FlowDocument分配给RichTextBox.Document之后,我只能撤消上一个操作。
我尝试设置UndoLimit = 0,然后设置UndoLimit = -1,以在分配FlowDocument之后重置撤消堆栈。 我还尝试将IsUndoEnable属性设置为false,然后设置为true。 还尝试修改方法,以避免将FlowDocument直接分配给RichTextBox的Document属性。相反,我尝试将单独创建的块直接添加到包装在BeginChange()和EndChange()方法之间的RichTextBox.Document.Blocks属性中。 这些都不起作用。
这是分配代码:
// 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;
}
创建分配给RichTextBox.Document属性的FlowDocument的方法:
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一样工作,因为无论我进行什么其他更改,我都只能撤消最近的更改。