2013-04-02 32 views
1

是否有方法在FrameworkElement的可视父项发生更改时通知,而不必重写OnVisualParentChanged方法,只需使用事件?在WPF中更改父项

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

当视觉父母改变/改变时,是否有确切触发的事件?

+0

我不确定你需要做什么,但我经常使用IsVisibleChanged事件,如果我需要一些等待,直到一切都完成加载。 – jugg1es

回答

0

这与OnVisualParentChanged有些关系。在FrameworkElement.cs的实现中,它的确会有private void TryFireInitialized(),而这又会调用protected virtual void OnInitialized(EventArgs e),所以你可以在那里挂钩。

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

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

+0

'TryFireInitialized()'只会触发'OnInitialized'一次。 – HerpDerpington

+0

@ user1574054你是绝对正确的,谢谢你抓住那个 –

1

在我的测试中,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); 
    }