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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:45:03