ControlTemplate中的UserControl

Bri*_*ett 4 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>
Run Code Online (Sandbox Code Playgroud)

我的用户控件如下:

    <DockPanel>
        <!-- some content -->

        <ContentPresenter/>

    </DockPanel>
Run Code Online (Sandbox Code Playgroud)

ControlTemplate不显示UserControl的内容.

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

<ControlTemplate TargetType="{x:Type ctrl:Tile}">
    <Border>  
        <StackPanel>
            <local:UserControl/>

            <ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
       </StackPanel>
    </Border>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)

它会找到内容并妥善放置.看起来ControlTemplate一旦嵌入我的UserControl中就找不到内容.有什么我可能做错了吗?

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

Joh*_*wen 5

你把它UserControl看作是一个基本的ContentControl(比如a Button),它与它实际上有点不同.使用Button作为一个例子,当你添加子(即TextBlock)成Button这实际上是设置元素TextBlockButton's Content属性.它呈现的方式是通过Button's ControlTemplate,包括ContentPresenter注入的Content.Visual Tree的结尾如下:

<Button>
  -start Template
  <Border>
    <ContentPresenter>
      -start Content
      <TextBlock>
Run Code Online (Sandbox Code Playgroud)

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

如果您想要正常定义UserControlXAML 的外观并且仍然能够注入其他内容,则可以添加另一个内容DependencyProperty,以反映Content属性的设置并将内容设置为该内容.该方法与HeaderedContentControl衍生物(即Expander)一起使用,其基本上具有2个内容属性,ContentHeader.使用新属性将如下所示:

<Border>  
    <local:UserControl>
      <local:UserControl.OtherContent>
          <ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
      </local:UserControl.OtherContent>
    </local:UserControl>
</Border>
Run Code Online (Sandbox Code Playgroud)

然后在UserControlXAML中你需要显式设置ContentPresenterBindings(你只能在模板中免费获取它们ContentControls):

<DockPanel>
    <!-- some content -->

    <ContentPresenter Content="{Binding Path=OtherContent, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}"/>
</DockPanel>
Run Code Online (Sandbox Code Playgroud)

如果你想要a ContentTemplate,ContentTemplateSelector或者ContentStringFormat你还需要为那些添加属性和绑定.