Проблема здесь в том, что содержимое xaml DataTemplate
принадлежит другому NameScope, чем внешний Xaml. Вызов FindName
для элемента ищет только NameScope, в котором элемент был сгенерирован изначально. Следовательно, вызов FindName
для UserControl
не найдет элементы, сгенерированные DataTemplate
. Причина этого заключается в том, что DataTemplate
(и другие шаблоны) предназначены для многократного использования, использование NameScope устраняет неоднозначность имен.
Решение состоит в том, чтобы вызвать помощь VisualTreeHelper
, взгляните на код в этом блоге , чтобы узнать о VisualTreeHelper
С помощью класса VisualTreeEnumeration
из этого блога, добавленного в ваш проект, вы можете сделать это: -
var element = this.Descendents().OfType<FrameworkElement>().FirstOrDefault(fe => fe.Name == "stack");
Конечно, если вы знаете, что "стек" - это StackPanel
, то вы можете получить более конкретную информацию с помощью .OfType<T>
.