Wpf 如何使用控件(按钮)检索RichTextBox内容?

Wpf 如何使用控件(按钮)检索RichTextBox内容?,wpf,richtextbox,Wpf,Richtextbox,我正面临使用RichTextBox控件的挑战: 我成功地在设计时添加了段落和按钮,效果很好,请参见下面的xaml: <RichTextBox x:Name="rtxtStep" HorizontalAlignment="Left" Height="207" Margin="10,32,0,0" VerticalAlignment="Top" Width="427" IsDocumentEnabled="True" KeyUp="richTextBox_KeyUp">

我正面临使用RichTextBox控件的挑战:

我成功地在设计时添加了段落和按钮,效果很好,请参见下面的xaml:

<RichTextBox x:Name="rtxtStep" HorizontalAlignment="Left" Height="207" Margin="10,32,0,0" VerticalAlignment="Top" Width="427" IsDocumentEnabled="True" KeyUp="richTextBox_KeyUp">
            <FlowDocument>
                <Section FontSize="15">
                    <Paragraph>
                        Click on this:

                            <Hyperlin k  NavigateUri="http://stackoverflow.com">stackoverflow</Hyperlin k>


                    </Paragraph>

                    <Paragraph>
                        <Button Click="Button_Click" Width="143" >Also Click On This</Button>
                        <Button Click="Button_Click" Width="143" >button 2</Button>
                    </Paragraph>
                </Section>
            </FlowDocument>
        </RichTextBox>
返回:

"Click on this: stackoverflow\r\n   \r\n\r\n"

问题是,如何检索按钮和文本?

我认为您的期望值太高了。RichTextBox中的FlowDocument是元素的层次结构。您所能做的最好的事情就是沿着元素树向下搜索按钮。像这样的

    private void richTextBox_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {
            TextRange txtrContent = new TextRange(rtxtStep.Document.ContentStart, rtxtStep.Document.ContentEnd);
            string allContent = txtrContent.Text;
            PrintBlocks(rtxtStep.Document.Blocks);
        }
    }

    private void PrintBlocks(IEnumerable<Block> blocks)
    {
        foreach(Block b in blocks)
        {
            Trace.WriteLine("Found " + b.GetType().Name);
            if(b is Section)
            {
                PrintBlocks((b as Section).Blocks);
            }
            else if(b is Paragraph)
            {
                PrintInlines((b as Paragraph).Inlines);
            }
        }

    }

    private void PrintInlines(IEnumerable<Inline> inlines)
    {
        foreach(Inline i in inlines)
        {
            if(i is InlineUIContainer)
            {
                PrintInlineUIContainer(i as InlineUIContainer);
            }

        }
    }
    private void PrintInlineUIContainer(InlineUIContainer i)
    {
        Trace.WriteLine("Found " + i.Child.GetType().Name + " " + i.Child.ToString());
    }
但你已经知道了。您似乎希望文本和按钮采用某种集成格式(可能是HTML?)。我认为您需要编写自己的代码来实现这一点

    private void richTextBox_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {
            TextRange txtrContent = new TextRange(rtxtStep.Document.ContentStart, rtxtStep.Document.ContentEnd);
            string allContent = txtrContent.Text;
            PrintBlocks(rtxtStep.Document.Blocks);
        }
    }

    private void PrintBlocks(IEnumerable<Block> blocks)
    {
        foreach(Block b in blocks)
        {
            Trace.WriteLine("Found " + b.GetType().Name);
            if(b is Section)
            {
                PrintBlocks((b as Section).Blocks);
            }
            else if(b is Paragraph)
            {
                PrintInlines((b as Paragraph).Inlines);
            }
        }

    }

    private void PrintInlines(IEnumerable<Inline> inlines)
    {
        foreach(Inline i in inlines)
        {
            if(i is InlineUIContainer)
            {
                PrintInlineUIContainer(i as InlineUIContainer);
            }

        }
    }
    private void PrintInlineUIContainer(InlineUIContainer i)
    {
        Trace.WriteLine("Found " + i.Child.GetType().Name + " " + i.Child.ToString());
    }
Found Section
Found Paragraph 
Found Paragraph
Found Button System.Windows.Controls.Button: Also Click On This
Found Button System.Windows.Controls.Button: button 2