如何为事件处理程序创建事件处理程序?

时间:2013-12-07 12:41:42

标签: c# wpf events controls

我正在创建Custom Control继承TextBox,但是,PreviewTextInput中未处理 TextInput TextBox默认情况下,我希望为我的控件实现 PreviewTextInputLinked TextInputLinked,只是为了开发人员可以使用+=和{{1}添加或删除这两个事件}

我创建了一个名为 -= TextCompositionEventHandler的{​​{1}}

PreviewTextInputLinked

在XAML程序中

TextInputLinked

背后的代码

public event TextCompositionEventHandler /*PreviewTextInputLinked*/ TextInputLinked = delegate { };
public MyTextBox()
{
   this.AddHandler(TextBox.PreviewTextInputEvent, /*PreviewTextInputLinked */TextInputLinked, true);
}

但它没有做任何事情,也许我做错了,但我不知道我还能做什么

问题出在哪里?

1 个答案:

答案 0 :(得分:1)

PreviewTextInput将有效,因为这是tunnelling eventTextInputbubble event。如果在路由时处理它,它将不会冒泡到可视树,这就是为什么挂钩到PreviewTextInput工作而TextInput不起作用,因为它可能在冒泡的某个地方被处理。 / p>

AddHandler是实现您正在使用的方法。注意它的第三个bool参数对应于handledEventsToo,即你仍然希望调用处理程序,即使它被一些元素在Visual Tree下面处理。

现在代码中的问题是you pass an empty delegate,它会像你想要的那样得到执行,但你手动需要调用其他代理(通过XAML挂钩到那个事件),这可以像这样实现 -

public event TextCompositionEventHandler TextInputLinked = (sender, args) =>
{
   MyTextBox textBox = (MyTextBox)sender;
   if (textBox.TextInputLinked != null)
   {
       foreach (var handler in textBox.TextInputLinked.GetInvocationList())
       {
          if (handler.Target != null) <-- Check to avoid Stack overflow exception
          {
             handler.DynamicInvoke(sender, args);
          }
       }
   }
};

public MyTextBox()
{
    this.AddHandler(TextBox.TextInputEvent, TextInputLinked, true);
}

现在可以根据需要调用其他处理程序。