我应该在哪里注销 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方法中自己看