Windows讲述人读取窗口中所有控件的名称(即使是隐藏的控件)

时间:2013-08-07 10:26:01

标签: wpf xaml wpf-controls hidden-field narrator

我需要使我的应用程序在视觉上受损友好...我遇到了这个问题:Windows讲述者会读取窗口中的所有控件名称,尽管其中一些是隐藏的。

我有另一个应用程序,我使用WinForms编写它,并且它工作正常。

在查看UI间谍后,我发现WinForms应用程序没有公开隐藏的控件,而WPF正在公开窗口中的所有控件。

这可能是WPF中的一个错误吗?

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。 根据Alexis的回答,我写了下面的代码。它对我有用。

public class MyAutoComplete : RadAutoCompleteBox
{
    public MyAutoComplete ()
    {
     //init stuff here   
    }


    protected override AutomationPeer OnCreateAutomationPeer()
    {
        return new MyAutomationPeer(this);
    }
}

internal class MyAutomationPeer : RadAutoCompleteBoxAutomationPeer
{
    public MyAutomationPeer(FrameworkElement owner)
        : base(owner)
    {

    }
    protected override List<AutomationPeer> GetChildrenCore()
    {
        return new List<AutomationPeer>();
    }
}

答案 1 :(得分:1)

如果您的控件已经在可视树中,则此行为是正常的,因为UI Automation树基于Visual树。因此,如果您想要阻止使用屏幕阅读器阅读不必要的元素,您必须按需加载它们。

您还可以在包含可见元素和隐藏元素的控件中覆盖 OnCreateAutomationPeer 方法,以返回自己的AutomationPeer。然后,您可以覆盖 GetChildrenCore 方法并返回已修改的子集合。要更新自动化子树,您需要调用 AutomationPeer.ResetChildrenCache()方法和 AutomationPeer.RaiseAutomationEvent(AutomationEvents.StructureChanged)