2011-08-03 4 views
0

У меня есть следующий код, который должен найти элемент внутри чего-то. Проблема в том, что у меня есть DataGrid, чей первый столбец имеет CheckBox в его заголовке. Сам флажок определен в стиле, который существует в словаре <controls:ChildWindow.Resources> родительского дочернего окна.Silverlight 4 - Помощник визуального дерева возвращает 0 дочерних элементов?

Во время выполнения, если все элементы коллекции привязки сетки «выбраны», я должен выбрать флажок damn. Однако, поскольку флажок существует в стиле, он не легко доступен, и поэтому мне нужно пройти через всю DOM, чтобы найти конкретный флажок.

Это код, который делает DOM Traversal. Он реализован как метод расширения для 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"); это всегда возвращает нуль. Предполагается, что у меня есть DataGrid, называемый SomeDataGrid, и CheckBox, определенный в стиле HeaderCheckBox.

При дальнейшей отладке я также узнал, что независимо от того, какой контроль я называю этими методами расширения, метод вызова VisualTreeHelper.GetChildrenCount, используемый в последних двух методах в моем коде, всегда возвращает 0 ??? WTF?

У любого есть идея, как это исправить? Thanks, Martin

+0

Привет ... проверил ваш код в совершенно новом проекте и нашел все, что я просил. Даже CheckBox в стиле, в котором у меня были некоторые сомнения, он мог бы это сделать. Кстати, мой GetChildrenCount (wel ... yours) всегда возвращал реальное количество детей. – NestorArturo

+0

Смотрите: http://geekswithblogs.net/codingbloke/archive/2010/12/19/visual-tree-enumeration.aspx – AnthonyWJones

+0

@NestorArturo не могли бы вы добавить код? Мне бы хотелось протестировать чужую реализацию, чтобы убедиться, что я не схожу с ума ... Плюс я также дам вам ответы, если вы напишете это в ответ. – bleepzter

ответ

0

Несомненно, проблем нет. Here it is.

Это было сделано с VS2010 и Silverlight 4 ... на всякий случай.

+0

¿Это сработало для вас? – NestorArturo

 Смежные вопросы

  • Нет связанных вопросов^_^