关于 maui-accessibility
面向审查或改进应用界面的 .NET MAUI 无障碍技能,说明 Android、iOS 和 Windows 的屏幕阅读器差异及语义属性陷阱,并提供实用检查清单。
主要功能
- 01平台特定的屏幕阅读器行为
- 02语义属性注意事项
- 03图像与控件标签指导
- 04标题与分组指导
- 05动态播报与焦点指导
- 06无障碍审查清单
适用场景
- 01审查 MAUI 页面是否适合屏幕阅读器
- 02为仅含图标的控件和重要图像添加说明
- 03保留 Android Entry 字段的编辑操作
- 04跨平台核验导航和朗读顺序
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ davidortinau/ maui-skills --skill maui-accessibility安装后在 Claude Code 中输入/maui-accessibility确认已加载。
附带文件references/accessibility-api.md
详细介绍
.NET MAUI 无障碍功能
关键平台注意事项
1. 不要在 Label 上设置 Description
在 Label 上设置 SemanticProperties.Description 会对屏幕阅读器覆盖 Text
属性。标签可能会被朗读两次,或出现意外行为。
<Label Text="Welcome"
SemanticProperties.Description="Welcome" />
<Label Text="Welcome" />
2. Android Entry/Editor:Description 会导致 TalkBack 操作失效
在 Android 上,在 Entry 或 Editor 上设置 SemanticProperties.Description
会导致 TalkBack 不再提示“点按两次即可编辑”。
<Entry SemanticProperties.Description="Email address" />
<Entry Placeholder="Email address" />
3. iOS:父元素上的 Description 会隐藏子元素
在 iOS/VoiceOver 上,在布局上设置 SemanticProperties.Description 会将
整个容器设为单个可访问元素,导致子元素无法访问。
<HorizontalStackLayout SemanticProperties.Description="User info">
<Label Text="Name:" />
<Label Text="Alice" />
</HorizontalStackLayout>
<HorizontalStackLayout>
<Label Text="Name:" />
<Label Text="Alice" />
</HorizontalStackLayout>
4. Android 上 Hint 与 Entry.Placeholder 冲突
在 Android 上,SemanticProperties.Hint 和 Entry.Placeholder 会映射到同一个
Android 属性(contentDescription / hint)。同时设置两者会导致其中一个覆盖另一个。请选择其一。
5. HeadingLevel 的平台差异
- Windows(Narrator): 支持全部 9 个标题级别(
Level1–Level9)。 - Android(TalkBack)/iOS(VoiceOver): 仅区分“标题”和“非标题”。所有级别的处理方式都相同。
请使用标题级别确保语义正确,但要注意,只有在 Windows 上才会呈现层级结构。
无障碍检查清单
审查或改造页面时:
- 图像:为有意义的图像添加
SemanticProperties.Description。 对装饰性图像设置AutomationProperties.IsInAccessibleTree="false"。 - 按钮/控件:确保仅含图标的按钮设有
Description。 文本按钮通常不需要。 - 输入框/编辑器:使用
Placeholder提供上下文。仅在需要额外说明时添加Hint。避免使用Description(会导致 Android 上的问题)。 - 标签:不要添加
Description,让Text自行朗读。 为分区标题添加HeadingLevel。 - 标题:将页面标题标记为
Level1,分区标题标记为Level2,依此类推。 - 分组:避免在布局容器上使用
Description(会导致 iOS 上的问题)。 使用ExcludedWithChildren隐藏装饰性分组。 - 动态内容:状态变化时调用
SemanticScreenReader.Announce。导航或显示错误后使用SetSemanticFocus。 - Tab 顺序:为交互控件设置
TabIndex,确保顺序符合逻辑。 - 测试:运行 TalkBack(Android)、VoiceOver(iOS/Mac)和 Narrator (Windows),验证朗读顺序和操作。
评论
支持 Markdown