2013-04-02 1 views
1

이벤트를 사용하여 OnVisualParentChanged 메서드를 재정의하지 않고 FrameworkElement의 시각적 부모가 변경 될 때 알림을받을 수있는 방법이 있습니까?부모가 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

내 테스트에서로드 됨 언로드는 부모 변경시 해고 될 수 있으므로 회신해도 안전하다고 말합니다. 그러나 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); 
    }