单击WPF richtextbox中的TextBlock
本文关键字:TextBlock 中的 richtextbox WPF 单击 | 更新日期: 2023-09-27 18:25:18
我有一个这样的流程文档:
var mcFlowDoc = new FlowDocument();
var para = new Paragraph();
para.Inlines.Add(textBlock1);
para.Inlines.Add(textBlock2);
para.Inlines.Add(textBlock3);
mcFlowDoc.Blocks.Add(para);
richTextBox1.Document = mcFlowDoc;
我需要一个事件来触发鼠标点击文本块:
<RichTextBox Margin="10,10,230,12" Name="richTextBox1" FontFamily="Simplified Arabic" FontSize="16" IsReadOnly="True" IsReadOnlyCaretVisible="False" ForceCursor="False" FlowDirection="RightToLeft" VerticalScrollBarVisibility="Auto">
<RichTextBox.Resources>
<Style TargetType="Run">
<EventSetter Event="MouseLeftButtonDown" Handler="Run_Click" />
</Style>
<Style TargetType="TextBlock">
<EventSetter Event="MouseLeftButtonDown" Handler="TextBlock_Click" />
</Style>
</RichTextBox.Resources>
</RichTextBox>
void TextBlock_Click(object sender, MouseButtonEventArgs e)
{
TextBlock tb = sender as TextBlock;
}
Run的事件处理程序被调用并正常工作(在流程文档中以内联方式更改),但TextBlock的处理程序则不然。
我做错了什么?感谢
MSDN报价:
重要
RichTextBox内置了对冒泡的MouseUp和MouseDown事件的处理。因此,永远不会调用从RichTextBox中侦听MouseUp或MouseDown事件的自定义事件处理程序。如果需要响应这些事件,请侦听隧道PreviewMouseUp和PreviewMouse Down事件,或者使用HandledEventsToo参数注册处理程序(后一个选项仅通过代码可用)。不要将事件标记为已处理,除非您有意禁用RichTextBox对这些事件的本机处理,并注意这会对控件的UI产生显著影响。
所以你需要寻找替代方案。我可以建议几个。
首先,您可以为所有RichTextBox
:设置一个事件处理程序PreviewMouseDown
<RichTextBox PreviewMouseDown="TextBlock_Click" ... />
其次,使用BlockUIContainer
并将文本放入内容按钮中。例如:
<Paragraph FontSize="18">Flow Example</Paragraph>
<BlockUIContainer>
<Button x:Name="MyButton" ClickMode="Release" Click="Button_Click">
<TextBlock Margin="4" TextWrapping="Wrap">
Some text
</TextBlock>
</Button>
</BlockUIContainer>
第三,您可以设置Paragraph
的事件处理程序,如下所示:
var para = new Paragraph();
para.Inlines.Add(textBlock1);
para.MouseLeftButtonDown += new MouseButtonEventHandler(TextBlock_Click);
Edit
引用Adam Nathan的书《WPF 4 Unleashed
:》
TextBox公开简单的整数属性,如CaretIndex、SelectionStart和SelectionEnd,而RichTextBox公开类型为TextPointer的CaretPosition属性和类型为TextSelection的Selection属性。此外,RichTextBox的内容存储在FlowDocument类型的Document属性中,而不是简单的字符串Text属性。内容甚至可以包含嵌入的UIElement,并且如果RichTextBox的IsDocumentEnabled属性设置为true,它们可以是交互式的并引发事件。
事件开始工作,需要添加BlockUIContainer
,IsDocumentEnabled
属性设置为true
(在RichTextBox
中),否则,事件将无法完全工作。
总的来说,我不明白你为什么需要RichTextBox
里面的TextBlock
。使用它的标准功能,它们几乎涵盖了Run
、Paragraph
等。如果它们不匹配,那么就没有理由使用RichTextBox
。
请参阅此处有关RichTextBox
的精彩教程。