【问题标题】:Parent changed in WPFWPF 中的父级更改
【发布时间】:2013-03-24 02:22:40
【问题描述】:

有没有一种方法可以在 FrameworkElement 的可视父级发生更改时得到通知,而无需重写 OnVisualParentChanged 方法,只需使用事件?

Here 是使用“Loaded”事件的想法,但这似乎并不安全。

当可视父级更改/更改时,是否有明确触发的事件?

【问题讨论】:

  • 我不确定你到底需要做什么,但如果我需要等待所有内容完成加载,我经常使用 IsVisibleChanged 事件。

标签: c# wpf parent-child frameworkelement


【解决方案1】:

这与OnVisualParentChanged 有点关系。在FrameworkElement.cs 实现中,它执行private void TryFireInitialized(),而后者又会调用protected virtual void OnInitialized(EventArgs e),因此您可以在其中挂接。

这取决于您需要了解哪些信息。据我所知,唯一能得到通知父母正在改变并且能够访问旧父母的地方是 OnVisualParentChanged (旧父母作为参数传入)。否则任何其他挂接你的地方都只能访问新的父级,因为它已经被改变了。

您可能还想调查一些继承 FrameworkElement 的类,看看它们是否公开了任何其他可以帮助您的属性或方法。

【讨论】:

  • TryFireInitialized() 只会触发一次OnInitialized。
  • @user1574054 你是绝对正确的,谢谢你抓住那个
【解决方案2】:

在我的测试中,当父母发生变化时,Loaded Unloaded 确实会被解雇,所以我会说回复它们是安全的。 但是,如前所述,您只能在挂钩 OnVisualParentChanged 时访问旧父级(到 _Unloaded 被称为时 VisualParent 已经为空) 如果您关心的话,覆盖 OnVisualParentChanged 非常简单。

    void _Loaded(object sender, RoutedEventArgs e)
    {
        DoSmthng();
    }

    void _Unloaded(object sender, RoutedEventArgs e)
    {
        DoSmthngElse();
    }

    protected override void OnVisualParentChanged(DependencyObject oldParent)
    {
        DoSmthngOther();

        // Call base class to perform standard event handling. 
        base.OnVisualParentChanged(oldParent);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多