单击WPF richtextbox中的TextBlock

Jer*_*rry 4 c# wpf textblock richtextbox

我有一个像这样的flowdocument:

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;
Run Code Online (Sandbox Code Playgroud)

我需要一个事件来触发鼠标点击文本块:

    <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 Code Online (Sandbox Code Playgroud)

Run的事件处理程序被调用并且正常工作(在flowdocument中更改内联),但TextBlock 的事件处理程序不是.

我究竟做错了什么?谢谢

Ana*_*aev 5

MSDN引用:

重要

RichTextBox具有对冒泡的MouseUp和MouseDown事件的内置处理.因此,永远不会调用从RichTextBox侦听MouseUp或MouseDown事件的自定义事件处理程序.如果您需要响应这些事件,请改为侦听隧道PreviewMouseUp和PreviewMouseDown事件,或者使用HandledEventsToo参数注册处理程序(后一个选项仅通过代码可用).除非您故意要禁用RichTextBox本机处理这些事件,否则不要标记处理的事件,并注意这会对控件的UI产生显着影响.

所以你需要寻找替代品.我可以建议一些.

首先,您可以PreviewMouseDown为所有人设置事件处理程序RichTextBox:

<RichTextBox PreviewMouseDown="TextBlock_Click" ... />
Run Code Online (Sandbox Code Playgroud)

其次,使用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>
Run Code Online (Sandbox Code Playgroud)

第三,您可以设置Paragraph类似的事件处理程序:

var para = new Paragraph();
para.Inlines.Add(textBlock1);

para.MouseLeftButtonDown += new MouseButtonEventHandler(TextBlock_Click);
Run Code Online (Sandbox Code Playgroud)

Edit

引自Adam Nathan的书WPF 4 Unleashed:

TextBox公开了简单的整数属性,如CaretIndex,SelectionStart和SelectionEnd,而RichTextBox公开了TextPointer类型的CaretPosition属性和TextSelection类型的Selection属性.此外,RichTextBox的内容存储在FlowDocument类型的Document属性中,而不是简单的字符串Text属性.内容甚至可以包含嵌入的UIElements,如果RichTextBox的IsDocumentEnabled属性设置为true,它们可以是交互式的并引发事件.

活动开始工作,就必须添加BlockUIContainerIsDocumentEnabled属性设置为true(中RichTextBox),否则,该事件将不会完全工作.

在一般情况下,我不明白为什么你需要它TextBlock里面RichTextBox.使用它的标准功能,他们几乎盖,那些Run,Paragraph等等.如果它们不匹配,那么就没有必要使用RichTextBox.

请参阅RichTextBox 这里的精彩教程.