在XAML样式中删除事件处理程序?

3

有没有一种方法可以在另一个样式中定义的方式中删除事件处理程序?

这是一个人为制造的例子:

<Style TargetType="{x:Type TextBox}" x:Key="DefaultTextBoxStyle">
    <EventSetter Event="GotFocus" Handler="TextBox_GotFocus"/>
    <EventSetter Event="LostFocus" Handler="TextBox_LostFocus"/>
    <EventSetter Event="PreviewKeyUp" Handler="TextBox_PreviewKeyUp"/>
</Style>

<Style TargetType="{x:Type TextBox}" x:Key="InlineTextBox" BasedOn="{DynamicResource DefaultTextBoxStyle}">
    <EventSetter Event="GotFocus" Handler="????"/> // set to nothing
    <EventSetter Event="LostFocus" Handler="????"/> // set to nothing
    <EventSetter Event="PreviewKeyUp" Handler="????"/> // set to nothing
</Style>

谢谢!

1个回答

2
根据阅读有关 EventSetter 的内容,您需要设置一个虚拟事件来设置 e.Handled。EventSetter 表示,“基于的样式中指定的事件设置处理程序将在直接样式上的处理程序之后被调用。” 因此,除非它标记为 HandledEventsToo,否则这将阻止任何 BasedOn 中的 EventSetter 运行。
<Style TargetType="{x:Type TextBox}" 
       x:Key="EatEvents"
       BasedOn="{StaticResource OtherStyle}">
  <EventSetter Event="Click" Handler="EatEventsHandler"/>
</Style>

public void EatEventsHandler(object sender, RoutedEventArgs e)
{
   e.Handled = true;
}

无法工作...这就像执行this.GotFocus = null一样,这是不合法的。你只能通过+=和-=访问事件。 - Thomas Levesque
阅读...原来是基础的 :D - user7116
谢谢!看起来现在是最好的解决方案。 - djcouchycouch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接