Как я могу программно получить доступ к элементам, определенным в ContentTemplate? - PullRequest
4 голосов
/ 30 июля 2010

Допустим, я создал UserControl со следующим ContentTemplate, определенным в XAML:

<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

Ответы [ 2 ]

5 голосов
/ 30 июля 2010

Чтобы использовать FindName в шаблоне данных, вам потребуется ссылка на ContentPresenter.См. Статью Джоша Смита Как использовать FindName с ContentControl .

На самом деле вы можете захотеть использовать ControlTemplate, а не DataTemplate.Это должно быть проще в использовании и позволит пользователям вашего элемента управления применять свои собственные шаблоны содержимого или использовать неявные шаблоны.Если вы сделаете что-то вроде этого:

<UserControl.Template>
    <ControlTemplate TargetType="UserControl">
        <Grid>
            <ContentPresenter/>
            <Ellipse Name="myEllipse" Stroke="White"/>
        </Grid>
    </ControlTemplate>
</UserControl.Template>

Тогда в коде (возможно, в переопределении OnApplyTemplate) вы сможете сделать это:

var ellipse = Template.FindName("myEllipse", this) as Ellipse;

Вы также должны украсить свой класс с помощьюАтрибут TemplatePartAttribute выглядит следующим образом:

[TemplatePart(Name="myEllipse", Type = typeof(Ellipse))]

Так что, если кто-то повторно шаблонирует ваш элемент управления, он знает, что должен предоставить элемент Ellipse с этим именем.(Это менее важно, если класс используется только для внутреннего использования.)

Наконец, если все, что вы хотите сделать, это изменить цвет эллипса, то вы можете просто использовать привязку данных.Вы можете создать свойство зависимости EllipseColor для вашего элемента управления и просто установить Stroke="{TemplateBinding EllipseColor}".

0 голосов
/ 30 июля 2010

Попробуйте

<Ellipse Name="myEllipse" Stroke="{TemplateBinding Background}"/>

вместо программного изменения.

Здесь есть аналогичный пример с эллипсом, заполненным синим.http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...