我有一个用于Telerik Tile的ControlTemplate,我如下所示:
<ControlTemplate TargetType="{x:Type ctrl:Tile}">
<Border>
<local:UserControl>
<ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
</local:UserControl>
</Border>
</ControlTemplate>
我的用户控件如下:
<DockPanel>
<!-- some content -->
<ContentPresenter/>
</DockPanel>
ControlTemplate不显示UserControl的内容。
如果我将控制模板更改为:
<ControlTemplate TargetType="{x:Type ctrl:Tile}">
<Border>
<StackPanel>
<local:UserControl/>
<ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
</StackPanel>
</Border>
</ControlTemplate>
它会找到内容并妥善放置。看起来ControlTemplate一旦嵌入我的UserControl中就找不到内容。有什么我可能做错了吗?
请注意,这些ControlTemplate项目出现在ItemsPresenter中。
答案 0 :(得分:5)
您将UserControl
视为基本ContentControl
(如Button
),与实际情况略有不同。以Button
为例,当您将子项(即TextBlock
)添加到Button
元素中时,该元素实际上将TextBlock
设置为Button's Content
属性。它呈现的方式是Button
的{{1}},其中包含ControlTemplate
注入ContentPresenter
。 Visual Tree的结尾如下:
Content
到目前为止,这基本上是您的代码遵循的模型。问题是您使用的是(仍为<Button>
-start Template
<Border>
<ContentPresenter>
-start Content
<TextBlock>
派生的)ContentControl
,而不是使用UserControl
通常使用XAML +代码隐藏模型定义,其中XAML定义ControlTemplate
的{{1}}。 (可以将这些模型和模板切换为Content
或使用XAML +代码隐藏创建UserControl
派生类但不常见)
如果您想要正常定义XAML中UserControl
的外观并且仍然可以注入其他内容,则可以添加另一个Button
镜像内容属性的设置并设置内容。此方法与UserControl
衍生物(即DependencyProperty
)一起使用,该衍生物基本上具有2个内容属性HeaderedContentControl
和Expander
。使用新属性如下所示:
Content
然后在Header
的XAML中你需要明确设置<Border>
<local:UserControl>
<local:UserControl.OtherContent>
<ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
</local:UserControl.OtherContent>
</local:UserControl>
</Border>
绑定(你只能在UserControl
的模板中免费获取它们):
ContentPresenter
如果您想要ContentControls
,<DockPanel>
<!-- some content -->
<ContentPresenter Content="{Binding Path=OtherContent, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}"/>
</DockPanel>
或ContentTemplate
,您还需要为这些添加属性和绑定。