【问题标题】:WPF FlowDocument to InlineCollectionWPF FlowDocument 到 InlineCollection
【发布时间】:2014-10-24 15:18:39
【问题描述】:

我想在 WPF 应用程序中为 TextBox 文本创建一个小的就地编辑器。为此,我想使用 RichTextBox。由于 RichTextBox 与 FlowDocument 一起使用,而 TextBlock 与 InlineCollection 一起使用,因此这不起作用。有没有一种简单的方法可以将 RichtextBox 文档转换为 InlineCollection? (如果我只允许内联支持的 RTB 内容?)

【问题讨论】:

  • 你想使用 RichTextBox,所以你只需要一个FlowDocument。为什么要将其转换为一些 InlineCollection?
  • 我想使用 RichTextBox 进行编辑!稍后我想在 TextBlock 中显示文本
  • FlowDocument 相当复杂,它包含 BlockCollection 和 InlineCollection 以及其他东西(不常见但可能有)。所以我认为这不是正确的方法。转换可能需要一些额外的代码,运行它可能需要很多时间,具体取决于您的文档。我的建议是使用以下控件之一而不是 TextBlock:RichTextBoxFlowDocumentReaderDocumentViewerFlowDocumentPageViewerFlowDocumentScrollViewer。对于RichTextBox,您可以将其IsReadOnly 设置为true 以将其用作演示者/查看者。

标签: wpf richtextbox textblock flowdocument


【解决方案1】:

可以使用类似以下扩展方法的方法从 FlowDocument 中提取所有内联。您可能需要添加一些额外的空格内联来分隔段落和部分。

public static class FlowDocumentEx
{
    public static ICollection<Inline> GetInlines(this FlowDocument doc)
    {
        return GetInlines(doc.Blocks);
    }

    public static ICollection<Inline> GetInlines(TextElementCollection<Block> blocks)
    {
        var inlines = new List<Inline>();

        foreach (var block in blocks)
        {
            if (block is Paragraph)
            {
                inlines.AddRange(((Paragraph)block).Inlines);
            }
            else if (block is Section)
            {
                inlines.AddRange(GetInlines(((Section)block).Blocks));
            }
        }

        return inlines;
    }
}

你会这样使用它:

textBlock.Inlines.Clear();
textBlock.Inlines.AddRange(richTextBox.Document.GetInlines());

【讨论】:

  • 完美运行。我用它来实现 Sharp Develop 中 TextBlock 内容的格式化文本编辑器!
猜你喜欢
  • 1970-01-01
  • 2010-09-25
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多