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

UWP:禁用特定ListViewItem的键盘箭头选中功能

实现AutoSuggestBox建议列表部分项禁用的完整方案

看起来你已经找对了方向——通过自定义ListViewItem的样式来控制项的可用性,我来把这个方案补全,让禁用的项既不能被用户选择,视觉上也能明确区分出来:

1. 完善ItemContainerStyle的定义

把你的MyPopUpListViewItemStyle补充完整,核心是绑定IsEnabled属性,同时调整禁用状态下的视觉表现:

<Style x:Key="MyPopUpListViewItemStyle" TargetType="ListViewItem">
    <!-- 基础布局样式 -->
    <Setter Property="Padding" Value="12,8"/>
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
    <!-- 绑定IsEnabled到数据模型的禁用标记(这里用了反转转换器,因为通常我们用true表示禁用) -->
    <Setter Property="IsEnabled" Value="{Binding IsDisabled, Converter={StaticResource InverseBooleanConverter}}"/>
    <!-- 禁用状态的视觉样式 -->
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Foreground" Value="{ThemeResource SystemGrayTextColor}"/>
            <Setter Property="Opacity" Value="0.6"/>
        </Trigger>
    </Style.Triggers>
</Style>

这里用到的InverseBooleanConverter是为了把数据模型里的IsDisabled=true转换成ListViewItem的IsEnabled=false,转换器代码可以这么写:

public class InverseBooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        return !(value is bool boolValue && boolValue);
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        return !(value is bool boolValue && boolValue);
    }
}

记得在资源字典里声明这个转换器:

<converters:InverseBooleanConverter x:Key="InverseBooleanConverter"/>

2. 给数据模型添加禁用标记

假设你的建议项数据模型是这样的,新增一个IsDisabled属性来标记该项是否需要禁用:

public class SuggestionItem
{
    public string DisplayText { get; set; }
    public bool IsDisabled { get; set; } // true代表该项不可选
}

3. 拦截选择事件做双重保险

即使UI上禁用了ListViewItem,保险起见可以在AutoSuggestBox的SuggestionChosen事件里再加一层判断,彻底避免禁用项被选中:

private void AutoSuggest_SuggestionChosen(AutoSuggestBox sender, AutoSuggestBoxSuggestionChosenEventArgs args)
{
    if (args.SelectedItem is SuggestionItem item && item.IsDisabled)
    {
        // 取消选择,可根据需求清空输入框或保持原有内容
        sender.Text = sender.Text;
        args.Handled = true;
    }
}

这样处理后,禁用的项会呈现灰化的视觉效果,无法被点击选中,同时代码层面也做了拦截,确保用户完全无法选择这些项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:56:37