单击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的处理程序则不然。

我做错了什么?感谢

单击WPF richtextbox中的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,它们可以是交互式的并引发事件。

事件开始工作,需要添加BlockUIContainerIsDocumentEnabled属性设置为true(在RichTextBox中),否则,事件将无法完全工作。

总的来说,我不明白你为什么需要RichTextBox里面的TextBlock。使用它的标准功能,它们几乎涵盖了RunParagraph等。如果它们不匹配,那么就没有理由使用RichTextBox

请参阅此处有关RichTextBox的精彩教程。