WPF 및 Silverlight에서 특정 형식의 부모 컨트롤 찾기
나는 이것이 획기적인 비밀스런 속임수가 아니라는 것을 알고 있지만, 컨트롤에 대한 특정 유형의 부모를 찾는 방법에 관한 놀라운 수의 질문을 받고있다.
형식을 기반으로 부모 컨트롤을 찾는 기능은 Prism 응용 프로그램에서와 같이 뷰를 동적으로 구성할 때 매우 유용합니다. 이것이 유용한 다른 시나리오가 많이 있지만 이에 대한 가장 최근의 요청은 XamDockManager Prism Region Adapter 게시물을 기반으로 했습니다. 누군가는 ContentPane을 닫을 수 있는지 여부를 제어하기 위해 ContentPane에 삽입되는 뷰에 연결되는 동작을 만들고 싶었습니다. 취소 가능한 Closing 이벤트는 주입되는 View가 아니라 ContentPane 컨트롤 자체에 존재하기 때문에 동작 내에서 ContentPane 유형의 부모에 액세스해야 했습니다. 글쎄요, 운이 좋게도 이것은 정말 쉽습니다.
public static T FindParent<T>(DependencyObject child) where T : DependencyObject { //get parent item DependencyObject parentObject = VisualTreeHelper.GetParent(child); //we've reached the end of the tree if (parentObject == null) return null; //check if the parent matches the type we're looking for T parent = parentObject as T; if (parent != null) return parent; else return FindParent<T>(parentObject); }
이 간단한 코드 조각은 컨트롤의 시각적 트리를 트래버스하여 제공된 특정 형식과 일치하는 부모 컨트롤을 찾습니다. 이 함수를 사용하려면 FindParent<T> 메서드를 호출한 다음, 여기서 T는 찾고 있는 형식인 다음 부모에게 원하는 컨트롤을 전달하기만 하면 됩니다.
ContentPane _parentContentPane = FindParent<ContentPane>(this); if (_parentContentPane != null) _parentContentPane.Closing += _parentContentPane_Closing;
이 특정 예제에서는 사용자 정의 컨트롤의 시각적 트리를 검색하여 사용자 정의 컨트롤 인스턴스가 포함된 xamDockManager ContentPane을 찾습니다. 아, 그리고 이 정확한 코드 조각이 WPF와 Silverlight 모두에서 동일하게 작동한다고 언급했습니까? 정말 쉬웠어요!
내 블로그에서 저에게 연락하거나, Twitter(@brianlagunas)에서 저에게 연결하거나, 질문이나 의견이 있는 경우 아래에 의견을 남겨주세요.