【问题标题】:RoutedEvent raised from Unloaded event handler not bubbling从 Unloaded 事件处理程序引发的 RoutedEvent 未冒泡
【发布时间】:2020-10-09 09:21:16
【问题描述】:

我有一个继承自 ItemsControl 的自定义用户控件。通过它的 ItemTemplate,它从 ObservableCollection 为每个附加的 ViewModel 创建一个 ChildControl。

public class ChildControl : FrameworkElement
{
    public static readonly RoutedEvent CreatedEvent = EventManager.RegisterRoutedEvent(
        nameof(Created),
        RoutingStrategy.Bubble,
        typeof(RoutedEventHandler),
        typeof(ChildControl));

    public static readonly RoutedEvent RemovedEvent = EventManager.RegisterRoutedEvent(
        nameof(Removed),
        RoutingStrategy.Bubble,
        typeof(RoutedEventHandler),
        typeof(ChildControl));

    public ChildControl
    {
        Loaded += OnLoaded;
        Unloaded += OnUnloaded;
    }

    public event RoutedEventHandler Created
    {
        add => AddHandler(CreatedEvent, value);
        remove => RemoveHandler(CreatedEvent, value);
    }

    public event RoutedEventHandler Removed
    {
        add => AddHandler(RemovedEvent, value);
        remove => RemoveHandler(RemovedEvent, value);
    }

    private void OnLoaded(object sender, RoutedEventArgs e)
    {
        RaiseEvent(new RoutedEventArgs(CreatedEvent));
    }

    private void OnUnloaded(object sender, RoutedEventArgs e)
    {
        RaiseEvent(new RoutedEventArgs(RemovedEvent));
    }
}

还有 CustomItemsControl

public class CustomItemsControl : ItemsControl
{
    public CustomItemsControl()
    {
        AddHandler(ChildControl.CreatedEvent, new RoutedEventHandler(OnCreatedEvent));
        AddHandler(ChildControl.RemovedEvent, new RoutedEventHandler(OnRemovedEvent));
    }
    
    private void OnCreatedEvent(object sender, RoutedEventArgs e)
    {
        // stuff
    }

    private void OnRemovedEvent(object sender, RoutedEventArgs e)
    {
        // stuff
    }
}

除了 RemovedEvent 处理程序之外,一切正常。当事件在 ChildControl 的 Unloaded 事件处理程序中引发时,CustomItemsControl 不会捕获该事件。但是,当在 Loaded 事件处理程序中调用 RemovedEvent 时,它会被 CustomItemsControl 捕获。所以它证明一切都很好。

我做错了什么还是意味着从 Unloaded 事件处理程序中调用的 RoutedEvents 没有被设计为冒泡?

【问题讨论】:

    标签: c# wpf itemscontrol routed-events


    【解决方案1】:

    东西没了。

    但你仍然希望听到它。

    重新考虑 Unloaded 事件。 想想发生了什么。

    “当元素从已加载元素的元素树中删除时发生。”

    https://docs.microsoft.com/en-us/dotnet/api/system.windows.frameworkelement.unloaded?view=netcore-3.1https://docs.microsoft.com/en-us/dotnet/api/system.windows.frameworkelement.unloaded?view=netcore-3.1

    没了。

    不存在。

    不在任何视觉树中,不在任何东西中。

    因为它是从 UI 中卸载的。

    来自它的路由事件不能冒泡或隧道或任何涉及视觉树的东西。因为 uielement 不再在那棵树中。

    您需要做的是首先引发自定义路由事件,然后卸载您的控件。也许完全使用不同的方法会是更好的方法。示例包括:prism eventtaggregator 或 mvvmlight messenger 或将引用从父级传递给子级,以便它可以直接调用方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多