WPF中如何让屏幕阅读器播报新开的未获得焦点窗口
适配未聚焦窗口自动播报的WPF原生实现方案
以下实现完全基于微软官方原生API,无需引入任何第三方类库,可适配你的业务限制要求:
- 首先确认你的项目最低目标框架为.NET Framework 4.7.1及以上版本,这是微软官方原生支持
AutomationProperties实时区域特性的最低版本要求 - 在你要弹出的未聚焦窗口的XAML根节点上,配置两个自动化属性:
其中Assertive级别会让屏幕阅读器优先处理这条通知,不需要等待用户当前交互停止,刚好适配未聚焦窗口的主动播报场景;<Window x:Class="YourNamespace.DataProtectTipWindow" ...... AutomationProperties.LiveSetting="Assertive" AutomationProperties.Name="你需要播报的完整数据保护提示内容">AutomationProperties.Name的内容就是你要让阅读器播报的文本,也可以在后台代码中动态赋值修改 - 窗口弹出逻辑处添加主动触发UIA属性变更的代码,无需强制窗口获取焦点:
var protectTipWindow = new DataProtectTipWindow(); protectTipWindow.Show(); // 无需调用Focus(),不会抢占原有窗口焦点 // 主动触发自动化属性变更通知,让系统捕获到实时区域更新 var automationPeer = UIElementAutomationPeer.FromElement(protectTipWindow); automationPeer?.RaisePropertyChangedEvent(AutomationElementIdentifiers.LiveRegionProperty, null, protectTipWindow.GetValue(AutomationProperties.LiveSettingProperty)); - 如果需要播报的是窗口内的动态内容而非整段提示,可将
AutomationProperties.LiveSetting属性配置到窗口内部对应的TextBlock等显示元素上,触发对应元素的属性变更通知即可
该实现完全遵循微软UIA自动化标准,所有支持UIA协议的Windows 10屏幕阅读器都可兼容,无需修改阅读器端的任何配置。
内容的提问来源于stack exchange,提问作者Chrᴉz remembers Monica
相关产品推荐
相关产品推荐

