2013-09-12 3 views
1

У меня есть окно WPF, где я помещаю ContentControl. Позже в моем коде я использую строку для чтения как Xaml с помощью функции XamlReader.Load и помещаю ее в ContentControl. Это делается для создания пользовательского интерфейса Dyanmic. Теперь все сделано, но я хочу захватить значения поля ввода из этого элемента управления. при нажатии кнопки.WPF ContentControl: Итерация над дочерним элементом управления

Итак, все, что я хочу сделать, это перевести на дочерние элементы управления ContentControl. Как я могу это сделать, не кажется, что есть способ перебрать его на ребенка? Есть идеи. Благодарю.

ответ

3

Здесь Вы можете использовать VisualTreeHelper:

 for (int i = 0; i < VisualTreeHelper.GetChildrenCount(contentControl); i++) 
     { 
      var child = VisualTreeHelper.GetChild(contentControl, i); 
      if(child is ContentPresenter) 
      { 
       var contentPresenter = child as ContentPresenter; 
       for (int j = 0; j < VisualTreeHelper.GetChildrenCount(contentPresenter); j++) 
       { 
        var innerChild = VisualTreeHelper.GetChild(contentPresenter, j); 
       } 

       break; 
      } 
     } 
+0

он возвращает мне объект ContentPresenter [и только один, где, поскольку я не объявлял или не использовал какой-либо ControlPresenter, у меня просто есть StackPanel с парой кнопок и поля ввода в моем «Контенте» –

+0

да .. вам нужно повторить над контентом, который вы получили в первый раз. все элементы управления находятся в contentpresenter. – Nitin

+0

, так что это добрый двойной цикл вправо ... Это прекрасно, но можете ли вы предложить, если я всегда получаю двойную петлю, как это? –

4

Разницу между логическим и визуальным деревом, что визуальными списки дерева всех элементы, которые используются для отображения элемента управления. Например. Визуальное дерево кнопки выглядит

Баттона -> Граница -> ContentPresenter -> TextBlock

Логическим список дерева только управляет itsself (как вы заявили в своем XAML). . Для получения дополнительной информации посетите этот сайт: http://wpftutorial.net/LogicalAndVisualTree.html

Чтобы получить детей, которых вы хотите, LogicalTreeHelper.GetChildren(contentControl); должен работать.

+0

Это возвращает DataContext ContentPresenter, а не фактический элемент управления, который полезен в большинстве случаев, если вы не пытаетесь получить содержимое PasswordBox, которое не привязывается по дизайну. –

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