附加路由事件时未调用添加处理程序方法
Add Handler method not being called when Routed Event is attached
我正在尝试创建附加行为以将自动完成列表添加到标准 TextBox
控件。我的目标是每次引发 TextChanged
事件时,我的 AutoCompleteBehavior
class 都会创建一个弹出窗口并用潜在的自动完成结果填充它。
为了获得这些结果,我的 AutoCompleteBehavior
声明了以下事件:
Public Shared ReadOnly AutoCompleteListRequestedEvent As RoutedEvent =
EventManager.RegisterRoutedEvent("AutoCompleteListRequested",
RoutingStrategy.Bubble,
GetType(AutoCompleteListRequestedEventHandler), GetType(AutoCompleteBehavior))
以上为附加事件,用法如下:
<TextBox lib:AutoCompleteBehavior.AutoCompleteListRequested="EventHandlerHere"/>
想法是当TextChanged
被引发时,AutoCompleteBehavior.AutoCompleteListRequested
也会被引发,它要求执行程序为当前输入提供一个建议列表。
为此,我必须在我的附加事件附加到所述 TextBox
后立即连接到 TextBox.TextChanged
事件。根据 Microsoft 我应该能够声明一个子 Add*Handler
和 Remove*Handler
其中“*”是附加事件的名称,并且只要附加事件被添加或从一个元素中移除。
所以在事件声明的正下方我有:
Public Shared Sub AddAutoCompleteListRequestedHandler(TB As TextBox, handler As AutoCompleteListRequestedEventHandler)
'Code to hook into TextBox.TextChanged
End Sub
Public Shared Sub RemoveAutoCompleteListRequestedHandler(TB As TextBox, handler As AutoCompleteListRequestedEventHandler)
'Code to unhook fromTextBox.TextChanged
End Sub
我的问题是 AddAutoCompleteListRequestedHandler
从未被调用过。如果我调用 TextBox.RaiseEvent
引发 AutoCompleteListRequested
,XAML 中定义的事件处理程序确实会被调用(因此事件被附加),但似乎我的 AddAutoCompleteListRequestedHandler
被完全跳过。
作为最后的说明,我发现这个问题 here 似乎在描述同样的问题(我的代码也像他一样在 dll 中),但它已经两年了,而且从未得到回答。
XAML 处理器在连接事件处理程序时不会调用您的静态方法。
如果您想在 TextBox
引发 TextChanged
事件时执行某些操作,您最好实现附加行为并连接到 TextChanged
事件PropertyChangedCallback
或 OnAttached()
方法,具体取决于您创建的行为类型。
有关附加行为的更多信息,请参阅我的回答。
我正在尝试创建附加行为以将自动完成列表添加到标准 TextBox
控件。我的目标是每次引发 TextChanged
事件时,我的 AutoCompleteBehavior
class 都会创建一个弹出窗口并用潜在的自动完成结果填充它。
为了获得这些结果,我的 AutoCompleteBehavior
声明了以下事件:
Public Shared ReadOnly AutoCompleteListRequestedEvent As RoutedEvent =
EventManager.RegisterRoutedEvent("AutoCompleteListRequested",
RoutingStrategy.Bubble,
GetType(AutoCompleteListRequestedEventHandler), GetType(AutoCompleteBehavior))
以上为附加事件,用法如下:
<TextBox lib:AutoCompleteBehavior.AutoCompleteListRequested="EventHandlerHere"/>
想法是当TextChanged
被引发时,AutoCompleteBehavior.AutoCompleteListRequested
也会被引发,它要求执行程序为当前输入提供一个建议列表。
为此,我必须在我的附加事件附加到所述 TextBox
后立即连接到 TextBox.TextChanged
事件。根据 Microsoft 我应该能够声明一个子 Add*Handler
和 Remove*Handler
其中“*”是附加事件的名称,并且只要附加事件被添加或从一个元素中移除。
所以在事件声明的正下方我有:
Public Shared Sub AddAutoCompleteListRequestedHandler(TB As TextBox, handler As AutoCompleteListRequestedEventHandler)
'Code to hook into TextBox.TextChanged
End Sub
Public Shared Sub RemoveAutoCompleteListRequestedHandler(TB As TextBox, handler As AutoCompleteListRequestedEventHandler)
'Code to unhook fromTextBox.TextChanged
End Sub
我的问题是 AddAutoCompleteListRequestedHandler
从未被调用过。如果我调用 TextBox.RaiseEvent
引发 AutoCompleteListRequested
,XAML 中定义的事件处理程序确实会被调用(因此事件被附加),但似乎我的 AddAutoCompleteListRequestedHandler
被完全跳过。
作为最后的说明,我发现这个问题 here 似乎在描述同样的问题(我的代码也像他一样在 dll 中),但它已经两年了,而且从未得到回答。
XAML 处理器在连接事件处理程序时不会调用您的静态方法。
如果您想在 TextBox
引发 TextChanged
事件时执行某些操作,您最好实现附加行为并连接到 TextChanged
事件PropertyChangedCallback
或 OnAttached()
方法,具体取决于您创建的行为类型。
有关附加行为的更多信息,请参阅我的回答