maui-accessibility について
アプリのインターフェースを監査・改善する開発者向けの.NET MAUIアクセシビリティスキルです。Android、iOS、Windowsのスクリーンリーダーの違いやセマンティックプロパティの注意点を、実用的な確認項目とともに説明します。
主な機能
- 01プラットフォーム別スクリーンリーダーの挙動
- 02セマンティックプロパティの注意点
- 03画像とコントロールのラベル指針
- 04見出しとグループ化の指針
- 05動的な読み上げとフォーカスの指針
- 06アクセシビリティ監査チェックリスト
活用シーン
- 01MAUIページのスクリーンリーダー対応を監査
- 02アイコンのみのコントロールや画像に説明を付与
- 03Android 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 を設定しない
SemanticProperties.Description を Label に設定すると、スクリーンリーダーでは 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 を設定すると、
コンテナー全体が 1 つのアクセシブル要素になります。子要素にはアクセスできなくなります。
<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が設定されていることを確認します。 テキスト付きのボタンには通常、設定する必要はありません。 - Entry/Editor: コンテキストを示すには
Placeholderを使います。追加の説明が必要な場合のみHintを追加します。Descriptionは避けてください(Android で問題が発生します)。 - Label:
Descriptionは追加しないでください。Textをそのまま読み上げさせます。 セクション見出しにはHeadingLevelを追加します。 - 見出し: ページタイトルには
Level1、セクションタイトルにはLevel2などを設定します。 - グループ化: レイアウトコンテナーへの
Descriptionの設定は避けてください(iOS で問題が発生します)。 装飾用のグループを非表示にするにはExcludedWithChildrenを使います。 - 動的コンテンツ: ステータスの変化を通知するには
SemanticScreenReader.Announceを呼び出します。 ナビゲーション後またはエラー表示後にはSetSemanticFocusを使います。 - タブ順序: 論理的な順序になるよう、操作可能なコントロールに
TabIndexを設定します。 - テスト: TalkBack(Android)、VoiceOver(iOS/Mac)、Narrator (Windows)を実行し、読み上げ順序と操作を確認します。