4

我有一个这样的流文档:

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 的事件处理程序被调用并正常工作(在 flowdocument 中更改内联),但 TextBlock 的事件处理程序不是。

我究竟做错了什么?谢谢

4

1 回答 1

5

引用MSDN

重要的

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

所以你需要寻找替代品。我可以推荐几个。

PreviewMouseDown首先,您可以为 all设置一个事件处理程序RichTextBox

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

事件开始起作用,必须添加BlockUIContainerwithIsDocumentEnabled属性设置为true(in RichTextBox),否则,事件将完全不起作用。

一般来说,我不明白你为什么需要它TextBlock在里面RichTextBox。使用它作为标准功能,它们几乎涵盖了那些Run,Paragraph等。如果它们不匹配,那么就没有理由使用RichTextBox.

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

于 2013-07-28T14:00:05.917 回答