【问题标题】:UserControl within a ControlTemplateControlTemplate 中的 UserControl
【发布时间】:2013-06-17 18:56:39
【问题描述】:

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

【问题讨论】:

    标签: wpf telerik controltemplate


    【解决方案1】:

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

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

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

    如果您既想在 XAML 中正常定义 UserControl 的外观并且仍然能够注入其他内容,您可以添加另一个 DependencyProperty 来反映 Content 属性的设置并将您的内容设置为该属性。这种方法与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>
    

    如果您想要 ContentTemplateContentTemplateSelectorContentStringFormat,您还需要为它们添加属性和绑定。

    【讨论】:

      猜你喜欢
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多