Что такое TemplatedParent в WPF?
Я пытаюсь понять привязку RelativeSource, но не могу найти определение для TemplatedParent. MSDN говорит:
"Получает статическое значение, которое используется для возврата RelativeSource, созданного для режима TemplatedParent."
Он не отображается в индексе "Windows Presentation Foundation Unleashed".
Просто, что такое TemplatedParent, пожалуйста?
3 ответа
TemplatedParent
относится к Control
экземпляр, к которому применяется шаблон. Ты можешь использовать TemplatedParent
привязать к свойствам, объявленным для этого объекта (и его базовых классов).
TemplatedParent
Этот режим позволяет связать данное свойство ControlTemplate со свойством элемента управления, к которому применяется ControlTemplate. Чтобы хорошо понять проблему, вот пример ниже
<Window.Resources>
<ControlTemplate x:Key="template">
<Canvas>
<Canvas.RenderTransform>
<RotateTransform Angle="20"/>
</Canvas.RenderTransform>
<Ellipse Height="100" Width="150"
Fill="{Binding
RelativeSource={RelativeSource TemplatedParent},
Path=Background}">
</Ellipse>
<ContentPresenter Margin="35"
Content="{Binding RelativeSource={RelativeSource
TemplatedParent},Path=Content}"/>
</Canvas>
</ControlTemplate>
</Window.Resources>
<Canvas Name="Parent0">
<Button Margin="50"
Template="{StaticResource template}" Height="0"
Canvas.Left="0" Canvas.Top="0" Width="0">
<TextBlock FontSize="22">Click me</TextBlock>
</Button>
</Canvas>
Если я хочу применить свойства данного элемента управления к его шаблону элемента управления, тогда я могу использовать режим TemplatedParent. Существует также аналогичный этому расширению разметки, который является TemplateBinding, который является своего рода сокращением первого, но TemplateBinding оценивается во время компиляции в отличие от TemplatedParent, который оценивается сразу после первого времени выполнения. Как вы можете заметить на рисунке ниже, фон и содержимое применяются из кнопки к шаблону элемента управления.
В WPF шаблон - это то, что он использует для построения дерева типа. WPF по сути делает копию шаблона, когда создается новый объект этого типа.
В результате, внутри шаблона, если вы хотите сослаться на новый объект, вы используете TemplatedParent
для быстрого доступа. В противном случае вам придется использовать RelativeSource
пройтись вверх по дереву, чтобы найти родительский объект.
Обратите внимание:
TemplatedParent означает, что Parent является Templated. Templated - это пассивный голос на английском. Другими словами, родительский элемент применяется с шаблоном. Таким образом, в шаблоне вы можете легко связать свойство родителя.