뭔가 안에있는 요소를 찾으려면 다음과 같은 코드가 있습니다. 문제는 DataGrid의 첫 번째 열에 머리글에 CheckBox가있는 DataGrid가 있다는 것입니다. 확인란 자체는 부모 자식 창의 <controls:ChildWindow.Resources>
사전에있는 스타일에 정의되어 있습니다.Silverlight 4 - 시각적 트리 도우미가 자식 요소 0 개를 반환합니까?
런타임시 그리드 바인딩 제본의 모든 요소가 "선택됨"인 경우 지긋 지긋한 확인란을 선택해야합니다. 그러나 체크 박스가 스타일에 존재하기 때문에 쉽게 접근 할 수 없으므로 특정 체크 박스를 찾기 위해 전체 DOM을 따라 가야합니다.
이것은 DOM 탐색을 만드는 코드입니다. 그것은 내가 FrameworkElement
에서 상속 모든 컨트롤에서 FindElement 또는 GetChildren 메서드를 호출 할 수 있도록를 FrameworkElement의 확장 방법으로 구현됩니다
public static class FrameworkElementExtensions
{
public static FrameworkElement FindElement(this FrameworkElement parentFrameworkElement, string childFrameworkElementNameToSearch)
{
FrameworkElement childFrameworkElementFound = null;
parentFrameworkElement.SearchElements(ref childFrameworkElementFound, childFrameworkElementNameToSearch);
return childFrameworkElementFound;
}
public static List<FrameworkElement> GetChildren(this FrameworkElement parentElement)
{
List<FrameworkElement> childFrameworkElementsFound = new List<FrameworkElement>();
parentElement.GetChildren(childFrameworkElementsFound);
return childFrameworkElementsFound;
}
public static void SearchElements(this FrameworkElement parentFrameworkElement, ref FrameworkElement childFrameworkElementToFind, string childFrameworkElementName)
{
int childrenCount = VisualTreeHelper.GetChildrenCount(parentFrameworkElement);
if (childrenCount > 0)
{
FrameworkElement childFrameworkElement = null;
for (int i = 0; i < childrenCount; i++)
{
childFrameworkElement = (FrameworkElement)VisualTreeHelper.GetChild(parentFrameworkElement, i);
if (childFrameworkElement != null && childFrameworkElement.Name.Equals(childFrameworkElementName))
{
childFrameworkElementToFind = childFrameworkElement;
return;
}
childFrameworkElement.SearchElements(ref childFrameworkElementToFind, childFrameworkElementName);
}
}
}
public static void GetChildren(this FrameworkElement parentFrameworkElement, List<FrameworkElement> allChildFrameworkElement)
{
int childrenCount = VisualTreeHelper.GetChildrenCount(parentFrameworkElement);
if (childrenCount > 0)
{
for (int i = 0; i < childrenCount; i++)
{
FrameworkElement childFrameworkElement = (FrameworkElement)VisualTreeHelper.GetChild(parentFrameworkElement, i);
allChildFrameworkElement.Add(childFrameworkElement);
childFrameworkElement.GetChildren(allChildFrameworkElement);
}
}
}
}
그래서 손의 문제는 그 난 SomeDataGrid.FindElement("HeaderCheckBox");
의 라인을 따라 뭔가를 호출 할 때 항상 null을 반환합니다. 여기에서는 HeaderCheckBox라는 스타일 내에서 정의 된 SomeDataGrid 및 CheckBox라는 DataGrid가 있다고 가정합니다.
디버깅을 할 때 어떤 컨트롤을 호출했는지에 관계없이 코드에서 마지막 두 메서드에 사용 된 VisualTreeHelper.GetChildrenCount
메서드 호출이 항상 0을 반환한다는 것을 알았습니까? WTF?
누구든지이 문제를 해결하는 방법에 대해 알고 계십니까? 감사합니다. 마틴
안녕하세요 ... 새로운 프로젝트에서 코드를 테스트하고 요청한 모든 것을 찾았습니다. 작풍에있는 CheckBox조차, 나는 그것이 의지 할 수있을 약간 의심이 있었다. 그건 그렇고, 내 GetChildrenCount (너 ... 너의 것)는 항상 아이들의 진짜 카운트를 반환했습니다. – NestorArturo
참조 : http://geekswithblogs.net/codingbloke/archive/2010/12/19/visual-tree-enumeration.aspx – AnthonyWJones
@NestorArturo 코드를 추가 하시겠습니까? 나는 다른 사람의 구현을 테스트하여 미쳐서는 안된다는 것을 증명하기를 원합니다 ... 플러스로 답을 쓰면 답을 줄 수도 있습니다. – bleepzter