【问题标题】:How I can read contents from RichTextBox with information is it bolded, underlined, italic etc我如何从 RichTextBox 中读取包含信息的内容是粗体、下划线、斜体等
【发布时间】:2014-01-23 11:09:17
【问题描述】:

我一直试图弄清楚如果文本是粗体、下划线或斜体,如何从richtextbox 获取信息。因此,如果我从richtextbox 中读取一行,我需要知道某些单词是否加粗等?我不想将内容保存到 .rtf 而是另一个,所以这就是为什么我需要知道哪些单词被格式化,这样我就可以在单词之前添加标签以将内容保存到 .txt 文件。

是的,如果你这样做,它就可以工作

private void Button_Click(object sender, RoutedEventArgs e)
{
    foreach (Paragraph p in myRichTextBox.Document.Blocks)
    {
        foreach (var inline in p.Inlines)
        {
            if (inline.FontWeight == FontWeights.Bold)
            {
                // obtain text from p
            }               
        }
    }
}

如何获取加粗的文本?

【问题讨论】:

标签: c# wpf richtextbox


【解决方案1】:

WPF 中的 RTB 包含 FlowDocument。因此,您可以解析文档的树并检测 inline 包含特定文本。基本概念:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>

    <RichTextBox x:Name="myRichTextBox">
        <RichTextBox.Document>
            <FlowDocument>
                <Paragraph>
                    <Bold>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</Bold>
                </Paragraph>
                <Paragraph>
                    <Italic>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</Italic>
                </Paragraph>
                <Paragraph>
                    <Underline>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</Underline>
                </Paragraph>
            </FlowDocument>
        </RichTextBox.Document>
    </RichTextBox>

    <Button Grid.Row="1" Content="Parse" Click="Button_Click"/>
</Grid>

代码隐藏:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        foreach (Paragraph p in myRichTextBox.Document.Blocks)
        {
            foreach (var inline in p.Inlines)
            {
                if (inline is Bold)
                {
                    // ...
                }

                if (inline is Italic)
                {
                    // ...
                }

                if (inline is Underline)
                {
                    // ...
                }
            }
        }
    }

注意,内联可以嵌套:

                    <Underline>
                        Lorem ipsum dolor sit amet, consectetur adipiscing elit.
                        <Bold>
                            Lorem ipsum dolor sit amet, consectetur adipiscing elit.
                            <Italic>
                                Lorem ipsum dolor sit amet, consectetur adipiscing elit.
                            </Italic>
                        </Bold>
                    </Underline>

在解析内容时应考虑到这一点。

【讨论】:

  • 问题是我这样读取richtextbox内容: range = new TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd);我的内容不在 XAML 代码中。尽管我仍然尝试了您的解决方案,但没有一个 if 语句为真。
  • 您能告诉我如何从 P 中获取内联匹配的文本吗?从内部 if 语句?
  • @JonKoivula:填写 RTB.Document 的方式并不重要。这仍然是 FlowDocument。如果您丢弃range = new TextRange(... 并直接解析文档,您将能够找到所需的内联。请注意,我的代码只是一个示例,并且硬编码到示例内容树中。一般来说,您需要更灵活的解析方法。
  • 你能给我举个例子,我是如何从中获取文本的吗?
  • @JonKoivula:从FlowDocumentTextRange 获取文本?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-18
  • 2013-11-06
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 2019-04-24
相关资源
最近更新 更多