You need to enable JavaScript to run this app. 如何在ContentControl显示默认模板时将其折叠?
优惠活动
大模型
产品
解决方案
定价
更多

如何在ContentControl显示默认模板时将其折叠?

ContentControl无匹配模板时自动折叠的实现方案

这一需求完全可以实现,以下是3种常用的可行方案:

方案1:修改ContentTemplateSelector兜底逻辑(最推荐)

在自定义的DataTemplateSelector子类的SelectTemplate方法中,匹配不到预设模板时直接返回null,再配合样式触发器实现折叠:

  1. 自定义TemplateSelector代码示例
public class CustomTemplateSelector : DataTemplateSelector
{
    // 预设模板依赖属性
    public DataTemplate TypeATemplate { get; set; }
    public DataTemplate TypeBTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        // 原有匹配逻辑
        if (item is TypeA) return TypeATemplate;
        if (item is TypeB) return TypeBTemplate;
        
        // 匹配不到时返回null
        return null;
    }
}
  1. XAML中增加样式触发器
<ContentControl 
    Content="{Binding TargetContent}"
    ContentTemplateSelector="{StaticResource CustomTemplateSelector}">
    <ContentControl.Style>
        <Style TargetType="ContentControl">
            <Style.Triggers>
                <!-- ContentTemplate为null时自动折叠 -->
                <Trigger Property="ContentTemplate" Value="{x:Null}">
                    <Setter Property="Visibility" Value="Collapsed"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Style>
</ContentControl>

方案2:设置兜底空模板

如果不想修改原有TemplateSelector的逻辑,可以直接给ContentControl指定一个空的兜底ContentTemplate,匹配失败时不会渲染任何内容:

<ContentControl 
    Content="{Binding TargetContent}"
    ContentTemplateSelector="{StaticResource CustomTemplateSelector}">
    <!-- 兜底空模板 -->
    <ContentControl.ContentTemplate>
        <DataTemplate/>
    </ContentControl.ContentTemplate>
</ContentControl>

方案3:针对默认渲染逻辑触发折叠

如果你完全不想修改原有模板逻辑和控件基础配置,可以新增转换器判断控件是否触发了默认兜底渲染:当ContentControl的子元素为默认生成的TextBlock、且文本为Content的类型名称时,返回Collapsed作为Visibility值即可,不需要修改原有业务逻辑。

内容的提问来源于stack exchange,提问作者Craig

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 01:36:06