我应该在哪里注销 XAML 行为中的事件?
Where should I unregister events in XAML Behavior?
在 XAML 行为中 class,注销事件的最佳位置应该在哪里?我应该在 Unloaded 事件中取消注册还是应该在 Deteching?
中取消注册
public class ShowKeyboardOnFocusBehavior : Behavior<TextBox>
{
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.Loaded += AssociatedObject_Loaded;
AssociatedObject.GotFocus += AssociatedObject_GotFocus;
AssociatedObject.Unloaded += AssociatedObject_Unloaded;
}
private void AssociatedObject_Unloaded(object sender, RoutedEventArgs e)
{
AssociatedObject.Loaded -= AssociatedObject_Loaded;
AssociatedObject.GotFocus -= AssociatedObject_GotFocus;
AssociatedObject.Unloaded -= AssociatedObject_Unloaded;
}
protected override void OnDetaching()
{
AssociatedObject.Loaded += AssociatedObject_Loaded;
AssociatedObject.GotFocus += AssociatedObject_GotFocus;
}
...
您应该使用 OnDetaching
取消注册您的活动。此方法将始终被调用,它是 Microsoft 官方 UWP 行为库中使用的方法(参见 for example EventTriggerBehavior)。
它曾经是一个问题(关联的对象被卸载但行为保留在内存中)但现在它在库中得到解决,所以你肯定知道 Detach
会被调用(你可以在Microsoft.Xaml.Interactivity.Interaction
source code)
中的FrameworkElement_Unloaded
方法中自己看
在 XAML 行为中 class,注销事件的最佳位置应该在哪里?我应该在 Unloaded 事件中取消注册还是应该在 Deteching?
中取消注册 public class ShowKeyboardOnFocusBehavior : Behavior<TextBox>
{
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.Loaded += AssociatedObject_Loaded;
AssociatedObject.GotFocus += AssociatedObject_GotFocus;
AssociatedObject.Unloaded += AssociatedObject_Unloaded;
}
private void AssociatedObject_Unloaded(object sender, RoutedEventArgs e)
{
AssociatedObject.Loaded -= AssociatedObject_Loaded;
AssociatedObject.GotFocus -= AssociatedObject_GotFocus;
AssociatedObject.Unloaded -= AssociatedObject_Unloaded;
}
protected override void OnDetaching()
{
AssociatedObject.Loaded += AssociatedObject_Loaded;
AssociatedObject.GotFocus += AssociatedObject_GotFocus;
}
...
您应该使用 OnDetaching
取消注册您的活动。此方法将始终被调用,它是 Microsoft 官方 UWP 行为库中使用的方法(参见 for example EventTriggerBehavior)。
它曾经是一个问题(关联的对象被卸载但行为保留在内存中)但现在它在库中得到解决,所以你肯定知道 Detach
会被调用(你可以在Microsoft.Xaml.Interactivity.Interaction
source code)
FrameworkElement_Unloaded
方法中自己看