2013-04-02 34 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); 
    }