Partilhar via


Automação da interface do usuário de um controle personalizado do WPF

Automação da Interface do Usuário da Microsoft Fornece uma interface única e generalizada que os clientes podem usar para examinar ou operar as interfaces de usuário de uma variedade de plataformas e estruturas de automação. Automação da Interface do Usuário permite que o código de controle de qualidade (teste) e aplicativos de acessibilidade, sistema autônomo leitores de tela para examinar sistema autônomo elementos da interface do usuário e simular a interação do usuário com eles de Outros código. Para obter informações sobre o Automação da Interface do Usuário todas as plataformas, consulte Acessibilidade.

Este tópico descreve como implementar um servidor Provedor de automação da interface do usuário para um controle personalizado é executado em um aplicativo do WPF. WPF suporta Automação da Interface do Usuário por meio de uma árvore de objetos de automação de mesmo nível iguala a árvore de elementos da interface do usuário. Teste o código e aplicativos que fornecem recursos de acessibilidade podem usar objetos de mesmo nível de automação diretamente (para código em processo) ou pela interface generalizada fornecidos por Automação da Interface do Usuário.

Este tópico contém as seguintes seções.

  • Classes de de mesmo nível de automação
  • Classes de de mesmo nível automação interno
  • Considerações de segurança para peers derivadas
  • Navegação do Peer
  • Personalizações em um de mesmo nível derivada
  • Tópicos relacionados

Classes de de mesmo nível de automação

Controles do WPF dão suporte a Automação da Interface do Usuário por meio de uma árvore de correspondente de classes que derivam de AutomationPeer. Por convenção, nomes de classe de mesmo nível começam com o nome de classe de controle e terminam com "AutomationPeer". Por exemplo, ButtonAutomationPeer é a classe correspondente para o Button classe de controle. As classes de mesmo nível são basicamente equivalentes ao Automação da Interface do Usuário os tipos de controle, mas são específicos WPF elementos. Código de automação que acessa aplicativos WPF por meio de Automação da Interface do Usuário interface não usa automação peers diretamente, mas código de automação no mesmo espaço de processo pode usar automação peers diretamente.

Classes de de mesmo nível automação interno

Elementos implementam uma classe de mesmo nível automação se eles aceitam a atividade de interface do usuário, ou se eles contêm informações necessárias aos usuários de aplicativos do leitor de tela. Não todos os elementos de visuais WPF ter correspondentes de automação. Exemplos de classes que implementam automação correspondentes são Button, TextBox, e Label. Exemplos de classes que não implementam automação correspondentes são classes que derivam de Decorator, sistema autônomo Bordere classes com base em Panel, sistema autônomo Grid e Canvas.

A base Control classe não tem uma classe de mesmo nível correspondente. Se você precisar de uma classe de mesmo nível para corresponder a um controle personalizado que deriva de Control, você deve derivar a classe de mesmo nível personalizado de FrameworkElementAutomationPeer.

Considerações de segurança para peers derivadas

Peers de automação devem executar em um ambiente de confiança parcial. Código no conjunto UIAutomationClient não está configurado para ser executado em um ambiente parcialmente confiável e código de automação de mesmo nível não deve fazer referência a esse assembly. Em vez disso, você deve usar as classes no conjunto de módulos (assembly) UIAutomationTypes. Por exemplo, você deve usar o AutomationElementIdentifiers classe do assembly UIAutomationTypes, que corresponde da AutomationElement classe do assembly UIAutomationClient. É seguro fazer referência ao assembly de UIAutomationTypes no código de automação de mesmo nível.

Após localizar um correspondente de automação, código no processo pode navegar a árvore de mesmo nível chamando GetChildren e GetParent métodos. Navegação entre WPF elementos dentro de um controle é compatível com implementação do de mesmo nível das GetChildrenCore método. O sistema de automação da interface do usuário chama esse método para compilação até uma árvore de subelementos contido em um controle; por exemplo, listar itens em uma caixa de listagem. O padrão de UIElementAutomationPeer.GetChildrenCore método percorre a árvore visual de elementos para criar a árvore de peers de automação. Controles personalizados substituem esse método para expor os elementos filhos a automação de clientes, retornando os correspondentes de automação de elementos que transmitem informações ou permitem a interação do usuário.

Personalizações em um de mesmo nível derivada

Todas as classes que derivam de UIElement e ContentElement contém o método virtual protegido OnCreateAutomationPeer. WPF chama OnCreateAutomationPeer Para obter o objeto de mesmo nível de automação para cada controle. Código de automação pode usar o de mesmo nível para obter informações sobre recursos e características de um controle e para simular o uso interativo. Um controle personalizado que suporta a automação deve substituir OnCreateAutomationPeer e retornar uma instância de uma classe que deriva de AutomationPeer. Por exemplo, se um controle personalizado derivado do ButtonBase classe e, em seguida, o objeto retornado por OnCreateAutomationPeer deve derivar da ButtonBaseAutomationPeer.

Ao implementar um controle personalizado, você deve substituir os métodos da classe base automação de mesmo nível a de mesmo nível "Core" que descrevem o comportamento exclusivo e específico para seu controle personalizado.

Substituir OnCreateAutomationPeer

Substituir o OnCreateAutomationPeer método para seu controle personalizado, de modo que ele retorna objeto do provedor, que deve derivar direta ou indiretamente de AutomationPeer.

Substituir GetPattern

Automação peers simplificam alguns aspectos da implementação do lado do servidor Automação da Interface do Usuário provedores, mas os peers de automação do controle personalizado ainda devem lidar com interfaces padrão. sistema autônomo provedores de WPF não, pontos oferecem suporte a padrões de controle fornecendo implementações das interfaces no System.Windows.Automation.Provider espaço para nome, sistema autônomo IInvokeProvider. As interfaces padrão de controle podem ser implementadas pela de mesmo nível propriamente dito ou por outro objeto. A implementação do peer de GetPattern retorna o objeto que suporta o padrão específico. Automação da Interface do Usuário chamadas de código a GetPattern método e especifica um PatternInterface valor de enumeração. A substituir de GetPattern deve retornar o objeto que implementa o padrão especificado. Se o controle não tiver uma implementação personalizada de um padrão, você pode chamar a implementação do tipo de base de GetPattern para recuperar sua implementação ou nulo se não houver suporte para o padrão para esse tipo de controle. Por exemplo, um controle de NumericUpDown personalizado pode ser definido como um valor em um intervalo, para que sua Automação da Interface do Usuário de mesmo nível implementaria a IRangeValueProvider interface. O exemplo a seguir mostra como GetPattern método é substituído para responder a uma PatternInterface.RangeValue valor.

public override object GetPattern(PatternInterface patternInterface)
{
    if (patternInterface == PatternInterface.RangeValue)
    {
        return this;
    }
    return base.GetPattern(patternInterface);
}

A GetPattern método também pode especificar um sub-elemento sistema autônomo um provedor padrão. O seguinte código mostra como ItemsControl transferências rolar padrão de manipulação para o de mesmo nível de seu internos ScrollViewer controle.

public override object GetPattern(PatternInterface patternInterface)
{
    if (patternInterface == PatternInterface.Scroll)
    {
        ItemsControl owner = (ItemsControl) base.Owner;

        // ScrollHost is internal to the ItemsControl class
        if (owner.ScrollHost != null)
        {
            AutomationPeer peer = UIElementAutomationPeer.CreatePeerForElement(owner.ScrollHost);
            if ((peer != null) && (peer is IScrollProvider))
            {
                peer.EventsSource = this;
                return (IScrollProvider) peer;
            }
        }
    }
    return base.GetPattern(patternInterface);
}

Para especificar um sub-elemento para tratamento de padrão, esse código obtém o objeto subelemento, cria um item de mesmo nível, utilizando o CreatePeerForElement método, define o EventsSource propriedade do novo ponto para o ponto corrente e retorna o novo ponto. Definir EventsSource em um subelemento impede que o subelemento sejam exibidos na árvore de de mesmo nível de automação e designa todos sistema autônomo eventos gerados pelo subelemento sistema autônomo originado do controle especificado no EventsSource. The ScrollViewer controle não aparecerá na árvore de automação e eventos de rolagem que ele gera pareçam ser provenientes da ItemsControl objeto.

Substituir métodos "Core"

Código de automação obtém informações sobre seu controle chamando métodos públicos do de mesmo nível classe. Para fornecer informações sobre o controle, substitua cada método cujo nome termina com "Core" quando a implementação do controle é diferente daquele que fornecida pela classe base automação de mesmo nível a de mesmo nível. No mínimo, seu controle deve implementar o GetClassNameCore e GetAutomationControlTypeCore métodos, conforme mostrado no exemplo a seguir.

protected override string GetClassNameCore()
{
    return "NumericUpDown";
}

protected override AutomationControlType GetAutomationControlTypeCore()
{
    return AutomationControlType.Spinner;
}

A implementação de GetAutomationControlTypeCore Descreve o controle, retornando um ControlType valor. Embora você possa retornar ControlType.Custom, você deve retornar um dos tipos de controle mais específicos se ele descreve precisamente seu controle. Um valor retornado de ControlType.Custom requer trabalho extra para o provedor de implementar Automação da Interface do Usuário, e Automação da Interface do Usuário produtos de cliente não consegue prever a estrutura de controle, interação do teclado e padrões de controle possíveis.

Implementar o IsContentElementCore e IsControlElementCore métodos para indicar se o seu controle contém dados de conteúdo ou preenche uma função interativa na interface do usuário (ou ambos). Por padrão, ambos os métodos retornam true. Essas configurações melhoram a usabilidade das ferramentas de automação, sistema autônomo leitores de tela, podem usar esses métodos para filtrar a árvore de automação. Se seu GetPattern método padrão de manipular a um de mesmo nível de subelemento, o de mesmo nível subelemento transfere IsControlElementCore método pode retornar false para ocultar o subelemento correspondente na árvore de automação. Por exemplo, rolagem em um ListBox é tratado por um ScrollViewere a automação de mesmo nível para PatternInterface.Scroll retornado pela GetPattern método para o ScrollViewerAutomationPeer que está associado a ListBoxAutomationPeer.Therefore, o IsControlElementCore método para o ScrollViewerAutomationPeer Retorna false, para que o ScrollViewerAutomationPeer não é exibido na árvore de automação.

Correspondente de automação forneça valores padrão apropriado para seu controle. Observe que o XAML que faz referência a seu controle pode substituir suas implementações de mesmo nível dos principais métodos, incluindo AutomationProperties atributos. Por exemplo, o seguinte XAML cria um botão que possui dois personalizado Automação da Interface do Usuário Propriedades.

<Button AutomationProperties.Name="Special" 
    AutomationProperties.HelpText="This is a special button."/>

Implementar provedores padrão

As interfaces implementadas por um provedor personalizado são explicitamente declaradas se o elemento dono deriva diretamente de Control. Por exemplo, o seguinte código declara um peer para um Control que implementa um valor de faixa.

public class RangePeer1 : FrameworkElementAutomationPeer, IRangeValueProvider { }

Se o controle dono deriva de um tipo específico de controle como um RangeBase, o peer pode ser derivado de uma classe peer derivada equivalente. Nesse caso, o peer derivaria de RangeBaseAutomationPeer, que oferece uma implementação base de IRangeValueProvider. O código a seguir mostra a declaração de um peer assim.

public class RangePeer2 : RangeBaseAutomationPeer { }

Para uma implementação de exemplo, consulte Controlarar de NumericUpDown Personalizar com tema e exemplo de suporte de automação da interface do usuário.

Elevar eventos

Clientes de automação podem inscrever-se para eventos de automação. Controles personalizados devem relatar as alterações feitas no estado do controle chamando o RaiseAutomationEvent método. Da mesma forma, quando um valor da propriedade é alterado, telefonar o RaisePropertyChangedEvent método. O código a seguir mostra como obter o objeto de mesmo nível de dentro do código de controle e chamar um método para acionar um evento. sistema autônomo uma otimização, o código determina se há qualquer ouvintes para esse tipo de evento. Disparar o evento somente quando houver ouvintes evita sobrecarga desnecessária e ajuda o controle permaneça responsivo.

if (AutomationPeer.ListenerExists(AutomationEvents.PropertyChanged))
{
    NumericUpDownAutomationPeer peer = 
        UIElementAutomationPeer.FromElement(nudCtrl) as NumericUpDownAutomationPeer;

    if (peer != null)
    {
        peer.RaisePropertyChangedEvent(
            RangeValuePatternIdentifiers.ValueProperty,
            (double)oldValue,
            (double)newValue);
    }
}

Consulte também

Tarefas

Controlarar de NumericUpDown Personalizar com tema e exemplo de suporte de automação da interface do usuário

Exemplo de gerador de script de teste

Conceitos

UI Automation Overview

Implementação de Provedor de Automação de IU no Servidor

Date

History

Motivo

Julho de 2008

Tópico adicional.

Aprimoramento de informações.