2013-04-02 2 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 уже null) Переопределение 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); 
    } 
Смежные вопросы