2017-12-02 1 views
0

나는 Panel.OnVisualChildrenChanged가 호출 될 때 화재 연결 가능한 패널 이벤트 만들고 싶습니다 :연결된 이벤트 처리기를 발생시키는 방법은 무엇입니까?

public class PanelObserver { 
    public static readonly RoutedEvent VisualChildrenChangedEvent; 

    static PanelObserver() { 
     VisualChildrenChangedEvent = EventManager.RegisterRoutedEvent(
      "VisualChildrenChanged", 
      RoutingStrategy.Bubble, 
      typeof(RoutedEventHandler), 
      typeof(Panel)); 
    } 

    public static void AddVisualChildrenChangedHandler(
     DependencyObject d, RoutedEventHandler handler) { 
     //Something needs to be done to d so that when OnVisualChildrenChanged is called, 
     //it will fire handler. 
     (d as Panel)?.AddHandler(VisualChildrenChangedEvent, handler); 
    } 

    public static void RemoveVisualChildrenChangedHandler(
     DependencyObject d, RoutedEventHandler handler) { 
     //Something will likely need to be done to d here as well... 
     (d as Panel)?.RemoveHandler(VisualChildrenChangedEvent, handler); 
    } 
} 

유스 케이스가 될 것이다 꽤 똑바로 앞으로 이상적으로 이벤트가 Panel.OnVisualChildrenChanged가 될 때마다 제기 될

<Grid myns:PanelObserver.VisualChildrenChanged = "SomeEventHandler" /> 

라는. 가능한 경우이를 실현하기 위해 AddVisualChildrenChanged 메소드에 추가 할 필요가있는 것은 무엇입니까 (그리고 그것은 대장입니다)? 그것이 이것이 어떻게 성취하는 것이 아니라면, 이것을 성취 할 수있는 적절한 방법은 무엇입니까?

답변

0

부착 가능한 Panel 이벤트를 통해 Panel.OnVisualChildrenChanged을 시작하는 방법을 생각할 수 없습니다. 대신 Panel 클래스에서 파생되고 OnVisualChildrenChanged을 재정의 한 다음 다른 이벤트를 선언 할 수 있습니다. 예를 들어

:

public class ObservablePanel : Panel 
{ 
    protected override void OnVisualChildrenChanged(DependencyObject visualAdded, DependencyObject visualRemoved) 
    { 
     base.OnVisualChildrenChanged(visualAdded, visualRemoved); 
     VisualChildrenChanged?.Invoke(this, EventArgs.Empty); 
    } 
    public event EventHandler VisualChildrenChanged; 
} 

당신이 부착 패널 이벤트를 통해 그것을 할 수없는 이유 :
1. Panel.Children 속성은 이벤트를 노출하지 않습니다 이는 UIElementCollection이 경우 잡기하는 것입니다 " 변경됨 ".
2. Panel.Children 속성은 읽기 전용이므로 UIElementCollection의 사용자 지정 파생 구현으로 설정하면 "변경된"이벤트가 노출됩니다.
3. Panel.OnVisualChildrenChangedprotected이므로 Panel 파생 클래스에서만 액세스 할 수 있습니다.

+0

감사합니다. 이것은 매우 어리 석다. .Net 팀에 의해 패널 내용의 변경을 감지하는 방법을 사용하지 않는 것은 상당히 중요한 감독 인 것 같습니다. – Will

관련 문제