子弹并粘贴到流文档中

时间:2018-01-09 20:54:54

标签: c# wpf richtextbox flowdocument

我需要将一些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

1 个答案:

答案 0 :(得分:0)

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

网格行的内容实际上是 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的一个领域,我还没有彻底探索过,所以我只能给你一个大致的想法。也许其他人可以提供更多细节。