如何读取带有加粗、下划线、斜体等信息的RichTextBox内容

4
我一直在尝试找出如何从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
            }               
        }
    }
}

我怎样可以获取加粗的文本?


有趣。我自己不知道答案,但如果到目前为止你还没有找过,请看一下http://msdn.microsoft.com/en-us/library/ee681613(v=vs.95).aspx。 - A.K.
1个回答

2
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语句成立。 - Jon Koivula
你能告诉我如何从内部if语句中获取与行内匹配的P文本吗? - Jon Koivula
@JonKoivula:填充RTB.Document的方式并不重要,这仍然是FlowDocument。如果你丢掉range = new TextRange(...并直接解析文档,你将能够找到所需的内联元素。请注意,我的代码只是一个示例,并且硬编码为示例内容树。一般来说,您需要更灵活的解析方法。 - Dennis
你能举个例子吗,让我知道我仍然可以从中获取文本吗? - Jon Koivula
你的 TextRange 匹配整个文档。你根本不需要 TextRange。直接使用 richTextBox.Document 即可。 - Dennis
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接