gpt4 book ai didi

wpf - ControlTemplate 中的 UserControl

转载 作者:行者123 更新时间:2023-12-04 20:18:33 24 4
gpt4 key购买 nike

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

最佳答案

您正在治疗 UserControl好像是基本的ContentControl (如 Button )与实际情况略有不同。使用 Button例如,当您将 child (即 TextBlock )添加到 Button 中时实际设置 TextBlock 的元素作为 Button's Content属性(property)。它的渲染方式是通过 ButtonControlTemplate ,其中包括 ContentPresenter注入(inject)Content进入。视觉树最终是这样的:

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

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

如果您想同时定义 UserControl 的外观像往常一样在 XAML 中注入(inject)其他内容,您可以添加另一个 DependencyProperty这反射(reflect)了 Content 属性的设置并将您的内容设置为该属性。此方法与 HeaderedContentControl 一起使用衍生品(即 Expander ),它本质上具有 2 个内容属性, ContentHeader .使用新属性将如下所示:
<Border>  
<local:UserControl>
<local:UserControl.OtherContent>
<ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
</local:UserControl.OtherContent>
</local:UserControl>
</Border>

然后在 UserControl里面的 XAML 您需要显式设置 ContentPresenter绑定(bind)(您只能在 ContentControls 的模板中免费获得它们):
<DockPanel>
<!-- some content -->

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

如果您想要 ContentTemplate , ContentTemplateSelector , 或 ContentStringFormat您还需要为它们添加属性和绑定(bind)。

关于wpf - ControlTemplate 中的 UserControl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17221763/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com