Получить и перебрать элементы управления из TabItem?

Как получить все элементы управления/UIElements, вложенные в Tabitem (из TabControl)?

Я пробовал все, но не смог их получить.

(Установите SelectedTab):

    private TabItem SelectedTab = null;
    private void tabControl1_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        SelectedTab = (TabItem)tabControl1.SelectedItem;
    }

Теперь мне нужно что-то вроде этого:

  private StackPanel theStackPanelInWhichLabelsShouldBeLoaded = null;
  foreach (Control control in tabControl.Children /*doesnt exist*/, or tabControl.Items /*only TabItems*/, or /*SelectedTab.Items ??*/ ) //I Have no plan
  {
        if(control is StackPanel)
        {
            theStackPanelInWhichLabelsShouldBeLoaded = control;
            //Load Labels in the Stackpanel, thats works without problems
        }
  }

После Silvermind: при этом счет всегда равен 1:

        UpdateLayout();
        int nChildCount = VisualTreeHelper.GetChildrenCount(SelectedTab);

person eMi    schedule 20.03.2012    source источник
comment
Tabitem, вероятно, должен сначала вызвать UpdateLayout, прежде чем он отобразит его дочерние элементы. Например, это произойдет, когда он будет выбран/открыт. Вам понадобится SelectedTab и его дочерние элементы после отображения макета.   -  person Silvermind    schedule 20.03.2012
comment
отредактированный ответ.. он по-прежнему всегда 1 (сетка)   -  person eMi    schedule 20.03.2012


Ответы (3)


TabControl имеет свойство Items (производное от ItemsControl), которое возвращает все TabItems — http://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.items.aspx. Или вы можете пройти визуальное дерево:

var firstStackPanelInTabControl = FindVisualChildren<StackPanel>(tabControl).First();

С использованием:

public static IEnumerable<T> FindVisualChildren<T>(DependencyObject rootObject) where T : DependencyObject
{
  if (rootObject != null)
  {
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(rootObject); i++)
    {
      DependencyObject child = VisualTreeHelper.GetChild(rootObject, i);

      if (child != null && child is T)
        yield return (T)child;

      foreach (T childOfChild in FindVisualChildren<T>(child))
        yield return childOfChild;
    }
  }
}
person Nikolay    schedule 20.03.2012
comment
Мне не нужны TabItems, мне нужны элементы управления/UIElements из самого TabItem, который вложен в TabItem или TabControl, я знаю - person eMi; 20.03.2012
comment
Тогда вы всегда можете просто пройти визуальное дерево. Я добавил пример кода в ответ - person Nikolay; 20.03.2012
comment
Отличный ответ. Не могли бы вы уточнить, что делает where T : DependencyObject? Или, может быть, ссылку, где я мог бы найти больше информации? - person estebro; 05.11.2014
comment
Где T: DependencyObject — ограничение универсального типа (msdn.microsoft.com/en- нас/библиотека/bb384067.aspx). В основном это просто ограничивает, что тип T должен быть производным от DependencyObject, поэтому в теле метода я могу использовать VisualTreeHelper.GetChild, который требует DependenceObject в качестве параметра. - person Nikolay; 07.11.2014

Возможно, вам поможет такой метод:

public static IEnumerable<T> FindChildren<T>(this DependencyObject source)
                                             where T : DependencyObject
{
  if (source != null)
  {
    var childs = GetChildObjects(source);
    foreach (DependencyObject child in childs)
    {
      //analyze if children match the requested type
      if (child != null && child is T)
      {
        yield return (T) child;
      }

      //recurse tree
      foreach (T descendant in FindChildren<T>(child))
      {
        yield return descendant;
      }
    }
  }
}

См. полную статью (Поиск элементов в дереве WPF) здесь.

person 0x49D1    schedule 20.03.2012

для меня VisualTreeHelper.GetChildrenCount всегда возвращает 0 для управления вкладками, вместо этого мне пришлось использовать этот метод

 public static List<T> ObtenerControles<T>(DependencyObject parent)
    where T : DependencyObject
    {
        List<T> result = new List<T>();           
        if (parent != null)
        {
            foreach (var child in LogicalTreeHelper.GetChildren(parent))
            {                   
                var childType = child as T;
                if (childType != null)
                {
                    result.Add((T)child);
                }

                foreach (var other in ObtenerControles<T>(child as DependencyObject))
                {
                    result.Add(other);
                }
            }
        }

        return result;
    }
person i31nGo    schedule 25.02.2017