#silverlight #silverlight-4.0
#silverlight #silverlight-4.0
Вопрос:
Если у меня есть следующий XAML:
<инструментарий: высота формы данных="100" x:Name="форма"> <инструментарий:DataForm.EditTemplate> <DataTemplate> <Имя стековой панели="stack"></StackPanel> </DataTemplate> </toolkit:DataForm.EditTemplate> </toolkit:DataForm>
Я могу получить ссылку на «форму» с помощью этого.Найдите имя («форма») из представления.
Как я могу получить ссылку на «стек»? FindName возвращает значение null.
Ответ №1:
Проблема здесь в том, что содержимое xaml DataTemplate
принадлежит к области имен, отличной от внешнего Xaml. При вызове FindName
элемента выполняется поиск только в области имен, в которой элемент был изначально сгенерирован. Следовательно, вызов FindName
на UserControl
не найдет элементы, сгенерированные DataTemplate
. Причина этого в том, что DataTemplate
(и другие шаблоны) предназначены для многократного повторного использования, использование NameScope устраняет неоднозначность имен.
Решение состоит в том, чтобы вызвать справку VisualTreeHelper
, взгляните на код в этом блоге, чтобы узнать мое мнение о VisualTreeHelper
. С VisualTreeEnumeration
классом из этого блога, добавленным в ваш проект, вы можете сделать это:-
var element = this.Descendents().OfType<FrameworkElement>().FirstOrDefault(fe => fe.Name == "stack");
Конечно, если вы знаете, что «стек» — это StackPanel
тогда вы можете уточнить с .OfType<T>
.