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>

它会找到内容并适当地放置它。似乎 ControlTemplate 一旦嵌套在我的 UserControl 中就无法找到内容。有什么我可能做错了吗?

请注意,这些 ControlTemplate 项出现在 ItemsPresenter 中。

4

1 回答 1

7

您将其UserControl视为基本的ContentControl(如 a Button),与实际情况略有不同。举个例子,当您将Button一个子项(即 a TextBlock)添加到一个实际上将其设置为属性的Button元素中时。它的渲染方式是通过's ,其中包括要注入的 a 。视觉树最终是这样的:TextBlockButton's ContentButtonControlTemplateContentPresenterContent

<Button>
  -start Template
  <Border>
    <ContentPresenter>
      -start Content
      <TextBlock>

到目前为止,这基本上是您的代码所遵循的模型。问题是您使用的是(仍然ContentControl派生的)UserControl,而不是使用 aControlTemplate是最常见的使用 XAML+代码隐藏模型定义的,其中 XAML 定义ContentUserControl. (可以切换这些模型和模板 aUserControlButton使用 XAML+code-behind 制作派生类,但不常见)

如果您既想将UserControlXAML 中的外观定义为正常的外观,又希望能够注入其他内容,则可以添加另一个DependencyProperty镜像 Content 属性设置的内容并将您的内容设置为该内容。这种方法与本质上具有 2 个内容属性的HeaderedContentControl衍生物(即ExpanderContentHeader. 使用新属性将如下所示:

<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您还需要为它们添加属性和绑定。

于 2013-06-20T20:19:56.563 回答