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

如何让屏幕阅读器读取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:37:34