ControlTemplate中的UserControl

时间:2013-06-20 19:06:10

标签: wpf telerik controltemplate

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

1 个答案:

答案 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个内容属性HeaderedContentControlExpander。使用新属性如下所示:

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

相关问题