项目符号并粘贴到流程文档中

Bullets and pasting into flow document

我需要将一些 rtf 文本从数据网格粘贴到流文档中。我想将它粘贴到 richtextbox 中的插入符位置。这有效,除非我有项目符号或编号列表。它会将其粘贴到项目符号或编号之前。

我到处找这个都没有找到。

private void dgStandardText_MouseDoubleClick(object sender, MouseButtonEventArgs e) {
 if (dgStandardText.SelectedItems.Count > 0) {
  foreach(DataRowView row in dgStandardText.SelectedItems) {
   byte[] byteArray = Encoding.ASCII.GetBytes(row[3].ToString());
   using(MemoryStream ms = new MemoryStream(byteArray)) {
    TextRange tr = new TextRange(txtAreaText.CaretPosition, txtAreaText.CaretPosition);
    tr.Load(ms, DataFormats.Rtf);
   }
  }
 }
 NeedSave = true;
 dgStandardText.SelectedItems.Clear();
}

Before Paste

After Paste

当您粘贴的内容包含块元素而不是内联元素时,这似乎会发生。对于纯文本,WPF 似乎将换行符(例如 \r\n)视为分段符,因此多行内容将被翻译成多个块。您要做的是仅插入来自每个源块的内联内容,以便它进入目标文档(在本例中为列表项)的 current 块。对第一个源块执行此操作,然后插入一个段落分隔符,更新插入符号位置,然后移至下一个块。

网格行的内容实际上是RTF内容,还是纯文本?如果它是纯文本,那么这应该非常简单。尝试将 foreach 循环体更改为如下内容:

var text = row[3].ToString();

var lines = text.Split(
    new[] { '\r', '\n' },
    StringSplitOptions.RemoveEmptyEntries);

foreach (var line in lines)
{
    var p = txtAreaText.CaretPosition;

    txtAreaText.BeginChange();

    p.InsertTextInRun(line);
    p = p.InsertParagraphBreak();

    txtAreaText.EndChange();
    txtAreaText.CaretPosition = p;
}

现在,如果源内容真的是 RTF,那么事情会变得更复杂。我怀疑您需要将它加载到内存中的流程文档中,并遍历元素以找出段落中断的位置。对于每个段落,找到与选择范围相交的行内内容,并将它们插入到目标文档中。到达源区域中每个段落的末尾时插入一个段落分隔符,就像上面的示例一样。

恐怕 Documents API 是 WPF 的一个领域,我还没有很彻底地探索过,所以我只能给你一个大概的想法。也许其他人可以提供更多详细信息。