控件模板中的用户控件

4

我有一个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中。

1个回答

7
您把UserControl当作基本的ContentControl(如Button)来处理,这与它实际的不同。以Button为例,当您将一个子元素(如TextBlock)添加到Button元素中时,实际上是将该TextBlock设置为Button的Content属性。它的呈现方式是通过ButtonControlTemplate进行的,其中包括一个ContentPresenter来注入Content。可视树最终会像这样:
<Button>
  -start Template
  <Border>
    <ContentPresenter>
      -start Content
      <TextBlock>

到目前为止,你的代码基本上遵循了这个模型。问题在于你正在使用一个(仍然是派生自ContentControl的)UserControl,而不是使用ControlTemplate定义一个模板,而是更常见的采用XAML+代码后端模型,在其中XAML定义了UserControlContent。 (虽然可以切换这些模型并且对UserControl进行模板化或者使用XAML+代码后端定义Button派生类,但这不常见)
如果你想同时在XAML中定义你的UserControl外观并且仍然能够注入其他内容,你可以添加另一个反映Content设置的DependencyProperty,并将你的内容设置为它。这个方法是与HeaderedContentControl派生类(例如Expander)一起使用的,它实际上有两个内容属性:ContentHeader。使用新属性看起来像这样:
<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>

如果您想要一个ContentTemplateContentTemplateSelector或者ContentStringFormat,您还需要为这些内容添加属性和绑定。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接