首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ControlTemplate中的UserControl

ControlTemplate中的UserControl
EN

Stack Overflow用户
提问于 2013-06-21 03:06:10
回答 1查看 3.4K关注 0票数 4

我有一个Telerik Tile的ControlTemplate,我重写如下:

代码语言:javascript
复制
<ControlTemplate TargetType="{x:Type ctrl:Tile}">
    <Border>  

        <local:UserControl>
            <ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
        </local:UserControl>
    </Border>
</ControlTemplate>

我的用户控件如下所示:

代码语言:javascript
复制
    <DockPanel>
        <!-- some content -->

        <ContentPresenter/>

    </DockPanel>

ControlTemplate不显示UserControl的内容。

如果我将控件模板更改为:

代码语言:javascript
复制
<ControlTemplate TargetType="{x:Type ctrl:Tile}">
    <Border>  
        <StackPanel>
            <local:UserControl/>

            <ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
       </StackPanel>
    </Border>
</ControlTemplate>

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-21 04:19:57

您将UserControl看作是一个基本的ContentControl (类似于Button),这与它的实际情况略有不同。以Button为例,当您向Button元素添加子元素(即TextBlock)时,实际上是将该TextBlock设置为Button's Content属性。渲染它的方式是通过ButtonControlTemplate,它包含了一个ContentPresenter来注入Content

代码语言:javascript
复制
<Button>
  -start Template
  <Border>
    <ContentPresenter>
      -start Content
      <TextBlock>

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

如果您想在XAML中定义UserControl的外观,同时仍然能够注入其他内容,那么可以添加另一个镜像content属性设置的DependencyProperty,并将您的内容设置为该设置。此方法用于HeaderedContentControl派生(即Expander),其本质上具有两个内容属性,即ContentHeader。使用新属性将如下所示:

代码语言:javascript
复制
<Border>  
    <local:UserControl>
      <local:UserControl.OtherContent>
          <ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
      </local:UserControl.OtherContent>
    </local:UserControl>
</Border>

然后在UserControl的XAML中,您需要显式地设置ContentPresenter绑定(您只能在ContentControls的模板中免费获得它们):

代码语言:javascript
复制
<DockPanel>
    <!-- some content -->

    <ContentPresenter Content="{Binding Path=OtherContent, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}"/>
</DockPanel>

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17221763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档