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中.
你把它UserControl看作是一个基本的ContentControl(比如a Button),它与它实际上有点不同.使用Button作为一个例子,当你添加子(即TextBlock)成Button这实际上是设置元素TextBlock的Button'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定义Content了UserControl.(可以切换这些模型和模板a UserControl或Button使用XAML +代码隐藏但不常见的派生类)
如果您想要正常定义UserControlXAML 的外观并且仍然能够注入其他内容,则可以添加另一个内容DependencyProperty,以反映Content属性的设置并将内容设置为该内容.该方法与HeaderedContentControl衍生物(即Expander)一起使用,其基本上具有2个内容属性,Content和Header.使用新属性将如下所示:
<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你还需要为那些添加属性和绑定.
| 归档时间: |
|
| 查看次数: |
3212 次 |
| 最近记录: |