C# WPF遍历Menu控件筛选MenuItem设置Visibility报错如何解决?
问题原因
你遍历拿到的item是object类型,即使你通过类型判断确认它是MenuItem实例,编译器依然将其识别为object类,而object本身没有定义Visibility属性,因此赋值时报错。
修复方案
你需要在类型判断通过后,将item显式转换为MenuItem类型,同时建议你直接读取MenuItem.Header属性获取显示文本,比调用ToString()更稳定可靠,避免控件默认ToString()逻辑变化导致分割出错。
修正后的代码如下:
private void ItemsSearchBox_TextChanged(object sender, TextChangedEventArgs e) { foreach (object item in ItemsMenu.Items) { // 用as做类型转换,转换失败会返回null,直接跳过非MenuItem元素 MenuItem menuItem = item as MenuItem; if (menuItem == null) continue; // 从Header属性取显示文本,比ToString更可靠 string headerText = menuItem.Header?.ToString() ?? string.Empty; var menuItemText_split = headerText.Split(' ', 1); // 校验分割结果,避免索引越界 if (menuItemText_split.Length < 2) continue; string targetText = menuItemText_split[1]; // 注意原逻辑写反了:需求是不匹配则隐藏,所以判断是否以输入内容开头,不匹配则折叠,匹配则恢复显示 if (!targetText.StartsWith(ItemsSearchBox.Text, StringComparison.OrdinalIgnoreCase)) { menuItem.Visibility = Visibility.Collapsed; } else { menuItem.Visibility = Visibility.Visible; } } }
额外说明
- 新增的空值、分割结果长度判断可以避免空引用、索引越界异常
StringComparison.OrdinalIgnoreCase是可选参数,可根据需求选择是否开启大小写不敏感匹配- 补充了匹配成功恢复显示的逻辑,避免用户删除输入内容后菜单无法恢复正常显示
内容的提问来源于stack exchange,提问作者Pawel
相关产品推荐
相关产品推荐

