【问题标题】:Bullets and pasting into flow document项目符号并粘贴到流文档中
【发布时间】:2023-03-17 00:23:02
【问题描述】:

我需要将一些 rtf 文本从数据网格粘贴到流文档中。我想将它粘贴到富文本框中的插入符号位置。除非我有项目符号或编号列表,否则此方法有效。它将粘贴在项目符号或数字之前。

我到处寻找这个没有运气。

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

【问题讨论】:

    标签: c# wpf richtextbox flowdocument


    【解决方案1】:

    当您粘贴的内容包含块元素而不是内联元素时,这似乎会发生。对于纯文本,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 的一个领域,我还没有深入探索,所以我只能给你一个大致的想法。也许其他人可以提供更多细节。

    【讨论】:

    • 内容为 RTF 格式。明天我将不得不玩这个。感谢您的快速回复。
    • 我将此标记为答案。我确实必须添加 txtAreaText.CaretPosition.GetNextContextPosition(LogicalDirection.Forward);在 inserttextinrun 和 insertparagraphbreak 之间。但我现在都在工作。感谢您的帮助!
    • @AnthonyEckstorm 太棒了!我很高兴能够为您指明正确的方向。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 2012-01-19
    相关资源
    最近更新 更多