如何让屏幕阅读器读取WinUI3 XAML中非制表位的静态标签控件?
WinUI3 C++ 实现屏幕阅读器朗读特定标签文本的技巧
方案一:设置顶级窗口的AutomationProperties.Name
这是你提到的思路,可直接在XAML或代码后台配置,让屏幕阅读器在窗口激活时朗读上下文文本,且不影响非屏幕阅读器用户的操作体验:
- XAML静态设置:
在窗口根元素中直接指定自动化名称:<Window x:Class="YourAppNamespace.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" AutomationProperties.Name="当前窗口上下文:用户设置页面 - 账号管理"> <!-- 窗口内容 --> </Window> - C++/WinRT动态更新:
在代码中根据业务逻辑实时修改窗口的自动化名称,比如页面加载或操作完成时:
若需要触发屏幕阅读器主动朗读更新后的文本,可通过自动化对等体发送属性变化事件:#include <winrt/Windows.UI.Xaml.Automation.h> void MainWindow::OnLoaded(IInspectable const& sender, RoutedEventArgs const& e) { // 动态设置窗口自动化名称 AutomationProperties::SetName(*this, L"当前上下文:已进入文件预览模式"); }#include <winrt/Windows.UI.Xaml.Automation.Peers.h> void UpdateAndAnnounceContext(hstring const& newContext) { AutomationProperties::SetName(*this, newContext); auto windowPeer = FrameworkElementAutomationPeer::CreatePeerForElement(*this); if (windowPeer) { windowPeer->RaisePropertyChangedEvent( AutomationProperties::NameProperty(), box_value(AutomationProperties::Name(*this)), // 旧值 box_value(newContext) // 新值 ); } }
方案二:使用不可见的辅助文本控件
如果需要朗读的文本属于局部上下文而非整个窗口,可创建视觉上不可见但屏幕阅读器可识别的控件,同时禁用制表位:
<TextBlock x:Name="LocalContextAnnouncer" Visibility="Collapsed" IsTabStop="False" AutomationProperties.Name="当前操作:正在保存设置,请勿关闭窗口"/>
在代码中动态更新该控件的自动化名称即可触发朗读:
void AnnounceLocalOperation(hstring const& operationText) { AutomationProperties::SetName(LocalContextAnnouncer(), operationText); auto peer = FrameworkElementAutomationPeer::CreatePeerForElement(LocalContextAnnouncer()); if (peer) { peer->RaisePropertyChangedEvent( AutomationProperties::NameProperty(), box_value(L""), box_value(operationText) ); } }
关键注意事项
- 确保所有辅助控件设置
IsTabStop="False",避免干扰非屏幕阅读器用户的Tab导航。 - 测试不同屏幕阅读器(Narrator、JAWS、NVDA)的行为,部分阅读器对自动化事件的响应逻辑略有差异。
- 避免过度朗读,仅提供必要的上下文信息,防止干扰视障用户的操作流程。
内容的提问来源于stack exchange,提问作者aremmell
相关产品推荐
相关产品推荐

