首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从未冒泡的卸载事件处理程序引发的RoutedEvent

从未冒泡的卸载事件处理程序引发的RoutedEvent
EN

Stack Overflow用户
提问于 2020-10-09 09:21:16
回答 1查看 284关注 0票数 0

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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的卸载事件处理程序中引发时,它不会被CustomItemsControl捕获。但是,当调用RemovedEvent (比如在加载的事件处理程序中)时,它将被CustomItemsControl捕获。所以它证明了一切都很好。

我是否做错了什么,或者这是否意味着从卸载事件处理程序中调用的RoutedEvents没有被设计冒泡?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-09 09:41:41

那东西不见了。

但你还是希望能听到。

重新考虑卸载的事件。想想发生了什么。

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

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

它不见了。

就像不在那里一样。

不是在任何视觉树里,也不是在任何东西上。

因为它是从UI卸载的。

来自它的路由事件不能气泡或隧道或任何涉及视觉树的内容。因为uielement已经不在那棵树上了。

您需要做的是首先引发一个自定义路由事件,然后卸载您的控件。也许使用完全不同的方法是更好的方法。示例包括: prism、事件聚合器或mvvmlight信使,或者将引用从父传递到子引用,这样它就可以直接调用方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64277211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档