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
相关产品推荐
相关产品推荐

