我正在创建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);
}
但它没有做任何事情,也许我做错了,但我不知道我还能做什么
问题出在哪里?
答案 0 :(得分:1)
PreviewTextInput
将有效,因为这是tunnelling event
而TextInput
是bubble 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);
}
现在可以根据需要调用其他处理程序。