WPF中Narrator读取隐藏ToggleButton求助:设置Collapsed等仍无效
我之前也碰到过类似的头疼问题——明明把ToggleButton设成Collapsed还关了Focusable,Windows讲述人在扫描模式下还是固执地播报它的内容。下面几个方案亲测有效,你可以挨个试试:
设置
AutomationProperties.AccessibilityView为Raw
这是最直接的解决方案,它直接告诉辅助技术(比如讲述人):这个控件以及它的子元素不需要被处理。只要在ToggleButton上加上这个属性,讲述人就会彻底忽略它:<ToggleButton Visibility="Collapsed" Focusable="False" AutomationProperties.AccessibilityView="Raw" />添加
AutomationProperties.IsOffscreen="True"
如果上面的方法没起作用,可以试试这个属性。它会明确告诉辅助技术“这个控件不在当前屏幕可视区域内”,讲述人自然就不会播报了:<ToggleButton Visibility="Collapsed" Focusable="False" AutomationProperties.IsOffscreen="True" />检查父控件的自动化配置
有时候问题出在父控件身上——如果父控件的自动化属性设置不当,可能会“暴露”子控件给讲述人。你可以检查父容器是否有AutomationProperties相关的设置,或者尝试把这个ToggleButton放到一个单独的容器(比如Grid)里,然后给容器设置AutomationProperties.AccessibilityView="Raw",把整个容器从辅助技术的扫描列表中排除。自定义自动化对等类(进阶方案)
如果前面的方法都不管用,那就需要动手写点C#代码了。创建一个自定义的ToggleButton,重写它的自动化对等类,强制告诉辅助技术这个控件是“离线”的:public class HiddenToggleButton : ToggleButton { protected override AutomationPeer OnCreateAutomationPeer() { return new HiddenToggleButtonAutomationPeer(this); } } public class HiddenToggleButtonAutomationPeer : ToggleButtonAutomationPeer { public HiddenToggleButtonAutomationPeer(ToggleButton owner) : base(owner) { } public override bool IsOffscreen() { // 始终返回true,让辅助技术认为控件不在屏幕上 return true; } }之后在XAML里用你自定义的
HiddenToggleButton替换原来的控件就行。
建议先从第一个方法开始试,它在绝大多数场景下都能解决问题。如果还是不行,再依次尝试后面的方案。
内容的提问来源于stack exchange,提问作者shreya shetty

