Reson 它不起作用:
PointerRoutedEventArgs 有一个 Handled bool 属性。如果任何PointerEventHandler 将此Handled 标记为true,则事件处理程序链将不再继续。
现在,RichEditBox 控件的设计者出于某种明显的原因不得不挂钩PointerReleased 事件,并且在处理程序中,他必须将Handled 标记为true。因此,您添加到事件的处理程序将不会被调用。
这也发生在其他控件中。一个例子是:你不能通过简单地添加一个EventHandler 来钩住ScrollViewer 的PointerWheelChanged 事件,例如:
myScrollViewer.PointerWheelChanged += Some_Handler;
将添加处理程序,但出于相同原因不会调用它。
解决方案:
所有UIElements 都有一个AddHandler 方法。这个方法也将EventHandlers 添加到事件中,就像+= 操作符一样,但是好处是,你可以:
即使处理了事件,也调用提供的处理程序
其他地方
所以,你应该做的是,像:
RebText.AddHandler(RichEditBox.PointerReleasedEvent, new PointerEventHandler(RebText_PointerReleased), true);
然后定义RebText_PointerReleased:
private void RebText_PointerReleased(object sender, PointerRoutedEventArgs e)
{
// your event handling code here
}
第三个参数是您指定要调用此处理程序的位置,即使事件被标记为已处理。
注意:,处理已处理的事件不是一个好习惯,因为正如文档所说:
不要经常要求重新处理路由事件,因为它会干扰
与 Windows 运行时事件系统的预期设计
控制合成。