RichTextBox撤消仅适用于在代码中设置文档后的最后更改

时间:2019-04-25 16:11:09

标签: c# wpf

我正在编写一个视频字幕应用。它包含一个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一样工作,因为无论我进行什么其他更改,我都只能撤消最近的更改。

0 个答案:

没有答案