我有一个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>它将找到内容并适当地放置它。似乎一旦内容嵌套在我的UserControl中,ControlTemplate就找不到了。我有可能做错什么吗?
请注意,这些ControlTemplate项出现在ItemsPresenter中。
发布于 2013-06-21 04:19:57
您将UserControl看作是一个基本的ContentControl (类似于Button),这与它的实际情况略有不同。以Button为例,当您向Button元素添加子元素(即TextBlock)时,实际上是将该TextBlock设置为Button's Content属性。渲染它的方式是通过Button的ControlTemplate,它包含了一个ContentPresenter来注入Content。
<Button>
-start Template
<Border>
<ContentPresenter>
-start Content
<TextBlock>到目前为止,这基本上就是您的代码所遵循的模型。问题是您使用的是(仍然是ContentControl派生的) UserControl,而不是使用ControlTemplate,它通常是用XAML +代码隐藏模型定义的,其中XAML定义了Content的UserControl。(可以切换这些模型并将其作为UserControl模板,或者使用XAML+代码隐藏创建Button派生类,但这并不常见)
如果您想在XAML中定义UserControl的外观,同时仍然能够注入其他内容,那么可以添加另一个镜像content属性设置的DependencyProperty,并将您的内容设置为该设置。此方法用于HeaderedContentControl派生(即Expander),其本质上具有两个内容属性,即Content和Header。使用新属性将如下所示:
<Border>
<local:UserControl>
<local:UserControl.OtherContent>
<ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
</local:UserControl.OtherContent>
</local:UserControl>
</Border>然后在UserControl的XAML中,您需要显式地设置ContentPresenter绑定(您只能在ContentControls的模板中免费获得它们):
<DockPanel>
<!-- some content -->
<ContentPresenter Content="{Binding Path=OtherContent, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}"/>
</DockPanel>如果需要ContentTemplate、ContentTemplateSelector或ContentStringFormat,还需要为它们添加属性和绑定。
https://stackoverflow.com/questions/17221763
复制相似问题