Wpf 如何使用控件(按钮)检索RichTextBox内容?
我正面临使用RichTextBox控件的挑战: 我成功地在设计时添加了段落和按钮,效果很好,请参见下面的xaml: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 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