You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinUI3 TreeView配置:仅第二级及以下节点启用多选功能

WinUI3 TreeView 多级节点复选配置方案

要实现根节点不可选、无复选框,二级及以下节点允许多选的效果,需要通过自定义TreeViewItem样式+节点层级判断来实现,具体步骤如下:

1. 提取并修改TreeViewItem默认样式

先从WinUI默认样式中提取TreeViewItem的模板(可通过Blend工具或WinUI源码获取),找到模板中的复选框控件(默认名为SelectionBox),针对不同层级节点修改控件状态:

  • 根节点(层级为0):隐藏复选框,禁用点击选中
  • 二级及以下节点:显示复选框,允许选中

2. 给TreeViewItem标记层级

需要为每个TreeViewItem标注当前节点的层级,有两种实现方式:

  • 数据源绑定:在你的节点模型类中新增Level属性,绑定数据源时直接赋值层级
  • 代码动态设置:通过TreeView的ContainerContentChanging事件计算层级,并存入TreeViewItem的Tag属性,示例代码:
    private void TreeView_ContainerContentChanging(TreeView sender, TreeViewContainerContentChangingEventArgs args)
    {
        if (!args.InRecycleQueue && args.Item is YourNodeModel node)
        {
            // 自定义方法:递归计算节点层级,根节点返回0
            int level = CalculateNodeLevel(node);
            args.ItemContainer.Tag = level;
        }
    }
    

3. 实现值转换器

创建两个值转换器,将层级值转为对应的UI状态:

  • LevelToVisibilityConverter:控制复选框的可见性
  • LevelToHitTestConverter:控制节点是否可点击选中

转换器代码示例:

using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Data;
using System;

public class LevelToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        return int.TryParse(value?.ToString(), out int level) && level == 0 
            ? Visibility.Collapsed 
            : Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

public class LevelToHitTestConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        return int.TryParse(value?.ToString(), out int level) && level != 0;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

4. 绑定样式中的控件属性

在自定义TreeViewItem样式中,将复选框和内容展示控件的属性绑定到层级值:

<Style TargetType="TreeViewItem" BasedOn="{StaticResource DefaultTreeViewItemStyle}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="TreeViewItem">
                <!-- 保留默认模板其他结构,修改以下部分 -->
                <CheckBox x:Name="SelectionBox"
                          Visibility="{Binding RelativeSource={RelativeSource TemplatedParent}, 
                                               Path=Tag, 
                                               Converter={StaticResource LevelToVisibilityConverter}}"
                          IsChecked="{Binding IsSelected, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" />
                
                <ContentPresenter x:Name="ContentPresenter"
                                  IsHitTestVisible="{Binding RelativeSource={RelativeSource TemplatedParent}, 
                                                             Path=Tag, 
                                                             Converter={StaticResource LevelToHitTestConverter}}" />
                <!-- 其他模板内容省略 -->
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

5. 应用样式到TreeView

在TreeView的资源中注册转换器和自定义样式,保持SelectionMode="Multiple":

<TreeView SelectionMode="Multiple"
          ContainerContentChanging="TreeView_ContainerContentChanging">
    <TreeView.Resources>
        <local:LevelToVisibilityConverter x:Key="LevelToVisibilityConverter" />
        <local:LevelToHitTestConverter x:Key="LevelToHitTestConverter" />
        <!-- 上述自定义TreeViewItem样式 -->
    </TreeView.Resources>
</TreeView>

完成配置后,根节点会隐藏复选框且无法被选中,二级及以下节点正常显示复选框并支持多选。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 20:17:52