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 的事件处理程序不是.
我究竟做错了什么?谢谢
从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,它们可以是交互式的并引发事件.
活动开始工作,就必须添加BlockUIContainer与IsDocumentEnabled属性设置为true(中RichTextBox),否则,该事件将不会完全工作.
在一般情况下,我不明白为什么你需要它TextBlock里面RichTextBox.使用它的标准功能,他们几乎盖,那些Run,Paragraph等等.如果它们不匹配,那么就没有必要使用RichTextBox.
请参阅RichTextBox 这里的精彩教程.
| 归档时间: |
|
| 查看次数: |
3318 次 |
| 最近记录: |