RichTextBox Undo просто работает для последнего изменения после установки документа в коде - PullRequest
0 голосов
/ 25 апреля 2019

Я пишу приложение с субтитрами для видео.Он содержит редактор 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, поскольку независимо от того, какие другие изменения я делаю, я могу отменить только самое последнее.

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