Допустим, я создал UserControl со следующим ContentTemplate, определенным в XAML:Как я могу программно обращаться к элементам, определенным в ContentTemplate?
<UserControl.ContentTemplate>
<DataTemplate>
<Ellipse Name="myEllipse" Stroke="White"/>
<ContentPresenter Content="{TemplateBinding Content}"/>
</DataTemplate>
</UserControl.ContentTemplate>
Как бы я получить доступ к элементу «myEllipse» в моем коде, так что, к примеру, я мог бы найти его высоту с " myEllipse.Height "? Я не могу получить доступ к нему по имени напрямую. Я попытался создать ссылку на него с:
Ellipse ellipse = ContentTemplate.FindName("myEllipse",this) as Ellipse;
Это происходит сбой при запуске программы, заявив, что не может создать экземпляр моего класса. Возможно, я неправильно использую FindName. Если кто-нибудь сможет мне помочь, это будет очень признательно.
Спасибо,
Dalal
Спасибо за очень информативный ответ. Я попытался использовать ControlTemplate вместо моего DataTemplate, но мой UserControl не выглядел одинаково, и некоторые функции были затронуты, поэтому я бы скорее попытался заставить его работать с DataTemplate, теперь, когда я получил это далеко в мой контроль развития. После прочтения статьи Джоша Смита я попытался поместить следующую строку в конструктор для моего управления: ContentPresenter contentPresenter = VisualTreeHelper.GetChild (this, 0) as ContentPresenter; К сожалению, он не работает на этой линии. Я получаю исключение синтаксиса XAML. Есть идеи? – Dalal
@Dalal: визуальное дерево еще не заполнено в конструкторе, поэтому вы получаете исключение вне диапазона в вызове GetChild.Это заверяется в исключение синтаксиса XAML, поскольку он не смог создать экземпляр вашего объекта. Вам нужно будет переместить код в обработчик события загрузки или переопределить OnApplyTemplate. Кроме того, шаблон управления по умолчанию для UserControl имеет ContentPresenter в Border, поэтому 'VisualTreeHelper.GetChild (this, 0)' вернет границу. Вам нужно будет сделать что-то вроде «VisualTreeHelper.GetChild (VisualTreeHelper.GetChild (this, 0), 0)». – Quartermeister
В моем переопределении OnApplyTemplate я смог успешно получить ContentPresenter, используя строку 'VisualTreeHelper.GetChild (VisualTreeHelper.GetChild (this, 0), 0) как ContentPresenter;' Теперь мне нужно было получить ссылку на один из моих объектов с именем ' headerLabel ', поэтому я помещаю 'headerLabel = ContentTemplate.FindName (" headerLabel ", contentPresenter) в качестве метки:' Я получаю InvalidOperationException: эта операция действительна только для элементов, которые применяют этот шаблон. Ну, учебник сказал, чтобы пройти в ContentPresenter. Я сделал. Я также попытался помещать этот код в событие MouseDown безрезультатно. – Dalal