사용자 지정 자동화 피어Custom automation peers

Microsoft UI 자동화의 자동화 피어 개념과 고유한 사용자 지정 UI 클래스에 대해 자동화 지원을 제공하는 방법을 설명합니다.Describes the concept of automation peers for Microsoft UI Automation, and how you can provide automation support for your own custom UI class.

UI 자동화는 자동화 클라이언트에서 다양 한 UI 플랫폼과 프레임 워크의 사용자 인터페이스를 검사 하거나 운영 하는 데 사용할 수 있는 프레임 워크를 제공 합니다.UI Automation provides a framework that automation clients can use to examine or operate the user interfaces of a variety of UI platforms and frameworks. Windows 앱을 작성 하는 경우 UI에 사용 하는 클래스는 이미 UI 자동화를 지원 합니다.If you are writing a Windows app, the classes that you use for your UI already provide UI Automation support. 봉인 되지 않은 기존 클래스에서 파생 하 여 새로운 종류의 UI 컨트롤이 나 지원 클래스를 정의할 수 있습니다.You can derive from existing, non-sealed classes to define a new kind of UI control or support class. 이 작업을 수행 하는 동안 클래스는 접근성을 지원 해야 하지만 기본 UI 자동화 지원에서 다루지 않는 동작을 추가할 수 있습니다.In the process of doing so, your class might add behavior that should have accessibility support but that the default UI Automation support does not cover. 이 경우 기본 구현에서 사용 하는 automationpeer 클래스에서 파생 하 여 기존 UI 자동화 지원을 확장 하 고, 필요한 지원을 피어 구현에 추가 하 고, 새 피어를 만들어야 하는 Windows 앱 컨트롤 인프라에 알립니다.In this case, you should extend the existing UI Automation support by deriving from the AutomationPeer class that the base implementation used, adding any necessary support to your peer implementation, and informing the Windows app control infrastructure that it should create your new peer.

UI 자동화를 사용 하면 화면 판독기와 같은 내게 필요한 옵션 응용 프로그램 및 보조 기술 뿐만 아니라 품질 보증 (테스트) 코드도 사용할 수 있습니다.UI Automation enables not only accessibility applications and assistive technologies, such as screen readers, but also quality-assurance (test) code. 두 시나리오에서 UI 자동화 클라이언트는 사용자 인터페이스 요소를 검사 하 고 앱 외부의 다른 코드에서 앱과의 사용자 상호 작용을 시뮬레이션할 수 있습니다.In either scenario, UI Automation clients can examine user-interface elements and simulate user interaction with your app from other code outside your app. 모든 플랫폼에서 UI 자동화에 대 한 정보 및 더 광범위 한 의미에서 Ui 자동화 개요를 참조 하세요.For info about UI Automation across all platforms and in its wider meaning, see UI Automation Overview.

UI 자동화 프레임 워크를 사용 하는 두 가지 고유한 대상 그룹이 있습니다.There are two distinct audiences who use the UI Automation framework.

  • Ui 자동화 클라이언트 는 ui 자동화 api를 호출 하 여 현재 사용자에 게 표시 되는 모든 ui에 대해 알아봅니다.UI Automation clients call UI Automation APIs to learn about all of the UI that is currently displayed to the user. 예를 들어 화면 판독기와 같은 보조 기술은 UI 자동화 클라이언트 역할을 합니다.For example, an assistive technology such as a screen reader acts as a UI Automation client. UI는 관련 된 자동화 요소 트리로 표시 됩니다.The UI is presented as a tree of automation elements that are related. UI 자동화 클라이언트는 한 번에 하나의 앱에만 관심이 나 전체 트리에서 관심이 있을 수 있습니다.The UI Automation client might be interested in just one app at a time, or in the entire tree. UI 자동화 클라이언트는 UI 자동화 Api를 사용 하 여 트리를 탐색 하 고 자동화 요소의 정보를 읽거나 변경할 수 있습니다.The UI Automation client can use UI Automation APIs to navigate the tree and to read or change information in the automation elements.
  • Ui 자동화 공급자 는 ui에서 해당 앱의 일부로 도입 된 요소를 노출 하는 api를 구현 하 여 ui 자동화 트리에 정보를 제공 합니다.UI Automation providers contribute information to the UI Automation tree, by implementing APIs that expose the elements in the UI that they introduced as part of their app. 새 컨트롤을 만들 때 이제 UI 자동화 공급자 시나리오에서 참가자 역할을 수행 해야 합니다.When you create a new control, you should now act as a participant in the UI Automation provider scenario. 공급자는 모든 UI 자동화 클라이언트에서 UI 자동화 프레임 워크를 사용 하 여 내게 필요한 옵션 및 테스트 목적으로 컨트롤과 상호 작용할 수 있는지 확인 해야 합니다.As a provider, you should ensure that all UI Automation clients can use the UI Automation framework to interact with your control for both accessibility and testing purposes.

일반적으로 UI 자동화 프레임워크에는 각각 UI 자동화 클라이언트용 API와 유사한 이름의 UI 자동화용 API 등 병렬 API가 있습니다.Typically there are parallel APIs in the UI Automation framework: one API for UI Automation clients and another, similarly named API for UI Automation providers. 대부분의 경우이 항목에서는 UI 자동화 공급자의 Api와 특히 해당 UI 프레임 워크에서 공급자 확장성을 사용할 수 있도록 하는 클래스 및 인터페이스에 대해 설명 합니다.For the most part, this topic covers the APIs for the UI Automation provider, and specifically the classes and interfaces that enable provider extensibility in that UI framework. UI 자동화 클라이언트에서 사용 하는 UI 자동화 Api를 언급 하거나, 일부 큐브 뷰를 제공 하거나, 클라이언트 및 공급자 Api와 상관 관계를 지정 하는 조회 테이블을 제공 하는 경우가 있습니다.Occasionally we mention UI Automation APIs that the UI Automation clients use, to provide some perspective, or provide a lookup table that correlates the client and provider APIs. 클라이언트 관점에 대 한 자세한 내용은 UI Automation 클라이언트 프로그래머 가이드를 참조 하세요.For more info about the client perspective, see UI Automation Client Programmer's Guide.

참고

UI 자동화 클라이언트는 일반적으로 관리 코드를 사용 하지 않고 UWP 앱으로 구현 되지 않습니다 (일반적으로 데스크톱 앱).UI Automation clients don't typically use managed code and aren't typically implemented as a UWP app (they are usually desktop apps). UI 자동화는 특정 구현이 나 프레임 워크가 아니라 표준을 기반으로 합니다.UI Automation is based on a standard and not a specific implementation or framework. 화면 판독기와 같은 보조 기술 제품을 비롯 한 많은 기존 UI 자동화 클라이언트는 COM (구성 요소 개체 모델) 인터페이스를 사용 하 여 UI 자동화, 시스템 및 자식 창에서 실행 되는 응용 프로그램과 상호 작용 합니다.Many existing UI Automation clients, including assistive technology products such as screen readers, use Component Object Model (COM) interfaces to interact with UI Automation, the system, and the apps that run in child windows. Com 인터페이스에 대 한 자세한 내용 및 COM을 사용 하 여 UI 자동화 클라이언트를 작성 하는 방법에 대 한 자세한 내용은 Ui 자동화 기본 사항을 참조 하세요.For more info on the COM interfaces and how to write a UI Automation client using COM, see UI Automation Fundamentals.

사용자 지정 UI 클래스에 대 한 UI 자동화 지원의 기존 상태 결정Determining the existing state of UI Automation support for your custom UI class

사용자 지정 컨트롤에 대 한 자동화 피어를 구현 하려면 먼저 기본 클래스와 해당 자동화 피어가 필요한 내게 필요한 옵션 또는 자동화 지원 기능을 제공 하는지 테스트 해야 합니다.Before you attempt to implement an automation peer for a custom control, you should test whether the base class and its automation peer already provides the accessibility or automation support that you need. 대부분의 경우 FrameworkElementAutomationPeer 구현, 특정 피어 및이를 구현 하는 패턴의 조합은 기본 이지만 만족 스러운 내게 필요한 옵션 환경을 제공할 수 있습니다.In many cases, the combination of the FrameworkElementAutomationPeer implementations, specific peers, and the patterns they implement can provide a basic but satisfactory accessibility experience. 이가 true 인지 여부는 컨트롤에 대 한 개체 모델의 변경 내용 수와 해당 기본 클래스에 대 한 변경 내용 수에 따라 달라 집니다.Whether this is true depends on how many changes you made to the object model exposure to your control versus its base class. 또한 기본 클래스 기능에 대 한 추가 사항이 템플릿 계약의 새 UI 요소 또는 컨트롤의 시각적 모양에 상관 관계가 있는지 여부에 따라 달라 집니다.Also, this depends on whether your additions to base class functionality correlate to new UI elements in the template contract or to the visual appearance of the control. 일부 경우에는 추가 접근성 지원이 필요한 사용자 환경의 새로운 측면이 변경 될 수 있습니다.In some cases your changes might introduce new aspects of user experience that require additional accessibility support.

기존 기본 피어 클래스를 사용 하는 경우에도 기본적인 접근성 지원 기능을 제공 하는 것이 좋지만, 자동화 된 테스트 시나리오에 대 한 UI 자동화에 정확한 ClassName 정보를 보고할 수 있도록 피어를 정의 하는 것이 좋습니다.Even if using the existing base peer class provides the basic accessibility support, it is still a best practice to define a peer so that you can report precise ClassName information to UI Automation for automated testing scenarios. 이러한 고려 사항은 타사 사용을 위한 컨트롤을 작성 하는 경우에 특히 중요 합니다.This consideration is especially important if you are writing a control that is intended for third-party consumption.

자동화 피어 클래스Automation peer classes

UWP는 WPF (Windows Forms, Windows Presentation Foundation) 및 Microsoft Silverlight와 같은 이전 관리 코드 UI 프레임 워크에서 사용 하는 기존 UI 자동화 기술 및 규칙을 기반으로 합니다.The UWP builds on existing UI Automation techniques and conventions used by previous managed-code UI frameworks such as Windows Forms, Windows Presentation Foundation (WPF) and Microsoft Silverlight. 대부분의 컨트롤 클래스와 해당 함수 및 용도는 이전 UI 프레임 워크에도 해당 원본을 포함 합니다.Many of the control classes and their function and purpose also have their origin in a previous UI framework.

규칙에 따라 피어 클래스 이름은 컨트롤 클래스 이름으로 시작하고 "AutomationPeer"로 끝납니다.By convention, peer class names begin with the control class name and end with "AutomationPeer". 예를 들어 ButtonautomationpeerButton 컨트롤 클래스의 피어 클래스입니다.For example, ButtonAutomationPeer is the peer class for the Button control class.

참고

이 항목에서는 컨트롤 피어를 구현할 때 접근성과 관련 된 속성을 더 중요 하 게 처리 합니다.For purposes of this topic, we treat the properties that are related to accessibility as being more important when you implement a control peer. 그러나 UI 자동화 지원의 보다 일반적인 개념은 Ui 자동화 공급자 프로그래머 가이드Ui 자동화 기본 사항에 설명 된 권장 사항에 따라 피어를 구현 해야 합니다.But for a more general concept of UI Automation support, you should implement a peer in accordance with recommendations as documented by the UI Automation Provider Programmer's Guide and UI Automation Fundamentals. 이러한 항목에서는 UI 자동화를 위해 UWP 프레임 워크에서 정보를 제공 하는 데 사용 하는 특정 Automationpeer api에 대해 다루지 않지만 클래스를 식별 하거나 다른 정보나 상호 작용을 제공 하는 속성을 설명 합니다.Those topics don't cover the specific AutomationPeer APIs that you would use to provide the information in the UWP framework for UI Automation, but they do describe the properties that identify your class or provide other information or interaction.

피어, 패턴 및 컨트롤 형식Peers, patterns and control types

컨트롤 패턴 은 UI 자동화 클라이언트에 컨트롤 기능의 특정 측면을 노출 하는 인터페이스 구현입니다.A control pattern is an interface implementation that exposes a particular aspect of a control's functionality to a UI Automation client. UI 자동화 클라이언트는 컨트롤 패턴을 통해 노출 되는 속성 및 메서드를 사용 하 여 컨트롤의 기능에 대 한 정보를 검색 하거나 런타임에 컨트롤의 동작을 조작 합니다.UI Automation clients use the properties and methods exposed through a control pattern to retrieve information about capabilities of the control, or to manipulate the control's behavior at run time.

컨트롤 패턴은 컨트롤 형식 및 컨트롤의 모양에 관계없이 컨트롤의 기능을 분류하고 노출하는 방법을 제공합니다.Control patterns provide a way to categorize and expose a control's functionality independent of the control type or the appearance of the control. 예를 들어 테이블 형식 인터페이스를 표시 하는 컨트롤은 Grid 컨트롤 패턴을 사용 하 여 테이블의 행 및 열 수를 표시 하 고 UI 자동화 클라이언트가 테이블에서 항목을 검색할 수 있도록 합니다.For example, a control that presents a tabular interface uses the Grid control pattern to expose the number of rows and columns in the table, and to enable a UI Automation client to retrieve items from the table. 다른 예로, UI 자동화 클라이언트는 호출할 수 있는 컨트롤 (예: 단추)에 대해 Invoke 컨트롤 패턴을 사용 하 고, 목록 상자, 목록 뷰 또는 콤보 상자와 같이 스크롤 막대가 있는 컨트롤에 대해 scroll 컨트롤 패턴을 사용할 수 있습니다.As other examples, the UI Automation client can use the Invoke control pattern for controls that can be invoked, such as buttons, and the Scroll control pattern for controls that have scroll bars, such as list boxes, list views, or combo boxes. 각 컨트롤 패턴은 별도의 기능 형식을 나타내며 컨트롤 패턴을 조합 하 여 특정 컨트롤에서 지 원하는 전체 기능 집합을 설명할 수 있습니다.Each control pattern represents a separate type of functionality, and control patterns can be combined to describe the full set of functionality supported by a particular control.

인터페이스는 COM 개체와 관련이 있으므로 컨트롤 패턴은 UI와 관련이 있습니다.Control patterns relate to UI as interfaces relate to COM objects. COM에서 개체를 쿼리하여 개체에서 지 원하는 인터페이스를 확인 한 다음 이러한 인터페이스를 사용 하 여 기능에 액세스할 수 있습니다.In COM, you can query an object to ask what interfaces it supports and then use those interfaces to access functionality. Ui 자동화에서 ui 자동화 클라이언트는 UI 자동화 요소를 쿼리하여 지원 되는 컨트롤 패턴을 확인 한 다음, 지원 되는 컨트롤 패턴에 의해 노출 되는 속성, 메서드, 이벤트 및 구조를 통해 요소와 해당 피어 링 컨트롤을 조작할 수 있습니다.In UI Automation, UI Automation clients can query a UI Automation element to find out which control patterns it supports, and then interact with the element and its peered control through the properties, methods, events, and structures exposed by the supported control patterns.

자동화 피어의 주요 목적 중 하나는 ui 요소가 피어를 통해 지원할 수 있는 패턴을 제어 하는 UI 자동화 클라이언트에 보고 하는 것입니다.One of the main purposes of an automation peer is to report to a UI Automation client which control patterns the UI element can support through its peer. 이렇게 하기 위해 UI 자동화 공급자는 GetPatternCore 메서드를 재정의 하 여 getpattern 메서드 동작을 변경 하는 새 피어를 구현 합니다.To do this, UI Automation providers implement new peers that change the GetPattern method behavior by overriding the GetPatternCore method. UI 자동화 클라이언트는 UI 자동화 공급자가 호출 하는 Getpattern 에 매핑되는 호출을 수행 합니다.UI Automation clients make calls that the UI Automation provider maps to calling GetPattern . UI 자동화 클라이언트는 상호 작용 하려는 각 특정 패턴에 대해 쿼리 합니다.UI Automation clients query for each specific pattern that they want to interact with. 피어가 패턴을 지 원하는 경우 자체에 대 한 개체 참조를 반환 합니다. 그렇지 않으면 null 을 반환 합니다.If the peer supports the pattern, it returns an object reference to itself; otherwise it returns null . 반환이 null 이 아닌 경우 UI 자동화 클라이언트는 해당 컨트롤 패턴과 상호 작용 하기 위해 패턴 인터페이스의 api를 클라이언트로 호출할 수 있다고 예상 합니다.If the return is not null , the UI Automation client expects that it can call APIs of the pattern interface as a client, in order to interact with that control pattern.

컨트롤 형식은 피어에서 나타내는 컨트롤의 기능을 광범위 하 게 정의 하는 방법입니다.A control type is a way to broadly define the functionality of a control that the peer represents. 패턴은 UI 자동화에서 가져올 수 있는 정보 또는 특정 인터페이스를 통해 수행할 수 있는 작업을 알려 주는 반면, 컨트롤 형식은 한 수준 위에 있습니다.This is a different concept than a control pattern because while a pattern informs UI Automation what info it can get or what actions it can perform through a particular interface, the control type exists one level above that. 각 컨트롤 형식에는 UI 자동화의 이러한 측면에 대 한 지침이 있습니다.Each control type has guidance about these aspects of UI Automation:

  • UI 자동화 컨트롤 패턴: 컨트롤 형식에서 두 개 이상의 패턴을 지원할 수 있으며 각 패턴은 서로 다른 정보 또는 상호 작용 분류를 나타냅니다.UI Automation control patterns: A control type might support more than one pattern, each of which represents a different classification of info or interaction. 각 컨트롤 형식에는 컨트롤에서 지원 해야 하는 컨트롤 패턴 집합, 선택 사항인 집합 및 컨트롤이 지원 하지 않아야 하는 집합이 있습니다.Each control type has a set of control patterns that the control must support, a set that is optional, and a set that the control must not support.
  • UI 자동화 속성 값: 각 컨트롤 형식에는 컨트롤에서 지원 해야 하는 속성 집합이 있습니다.UI Automation property values: Each control type has a set of properties that the control must support. 이러한 속성은 패턴에 따라 달라 지는 것이 아니라 UI 자동화 속성 개요에 설명 된 일반 속성입니다.These are the general properties, as described in UI Automation Properties Overview, not the ones that are pattern-specific.
  • UI 자동화 이벤트: 각 컨트롤 형식에는 컨트롤에서 지원 해야 하는 이벤트 집합이 있습니다.UI Automation events: Each control type has a set of events that the control must support. UI 자동화 이벤트 개요에 설명 된 대로이는 패턴에 한정 되지 않는 일반적인 기능입니다.Again these are general, not pattern-specific, as described in UI Automation Events Overview.
  • UI 자동화 트리 구조: 각 컨트롤 형식은 UI 자동화 트리 구조에서 컨트롤이 표시 되는 방법을 정의 합니다.UI Automation tree structure: Each control type defines how the control must appear in the UI Automation tree structure.

프레임 워크에 대 한 자동화 피어가 구현 되는 방법에 관계 없이 UI 자동화 클라이언트 기능은 UWP에 연결 되지 않으므로 보조 기술과 같은 기존 UI 자동화 클라이언트는 COM과 같은 다른 프로그래밍 모델을 사용 하 게 될 가능성이 높습니다.Regardless of how automation peers for the framework are implemented, UI Automation client functionality isn't tied to the UWP, and in fact it's likely that existing UI Automation clients such as assistive technologies will use other programming models, such as COM. COM에서 클라이언트는 속성, 이벤트 또는 트리 검사를 위해 요청 된 패턴 또는 일반 UI 자동화 프레임 워크를 구현 하는 COM 컨트롤 패턴 인터페이스에 대해 QueryInterface 를 수행할 수 있습니다.In COM, clients can QueryInterface for the COM control pattern interface that implements the requested pattern or the general UI Automation framework for properties, events or tree examination. 패턴의 경우 UI 자동화 프레임 워크는 해당 인터페이스 코드를 앱 UI 자동화 공급자 및 관련 피어에 대해 실행 되는 UWP 코드로 마샬링합니다.For the patterns, the UI Automation framework marshals that interface code across into UWP code running against the app's UI Automation provider and the relevant peer.

C 또는 Microsoft Visual Basic를 사용 하 여 UWP 앱과 같은 관리 코드 프레임 워크에 대 한 컨트롤 패턴을 구현 하는 경우 # COM 인터페이스 표현을 사용 하는 대신 .NET Framework 인터페이스를 사용 하 여 이러한 패턴을 나타낼 수 있습니다.When you implement control patterns for a managed-code framework such as a UWP app using C# or Microsoft Visual Basic, you can use .NET Framework interfaces to represent these patterns instead of using the COM interface representation. 예를 들어 호출 패턴의 Microsoft .NET 공급자 구현에 대 한 UI 자동화 패턴 인터페이스는 IInvokeProvider입니다.For example, the UI Automation pattern interface for a Microsoft .NET provider implementation of the Invoke pattern is IInvokeProvider.

컨트롤 패턴, 공급자 인터페이스 및 해당 용도에 대 한 목록은 컨트롤 패턴 및 인터페이스를 참조 하세요.For a list of control patterns, provider interfaces, and their purpose, see Control patterns and interfaces. 컨트롤 형식 목록에 대해서는 UI 자동화 컨트롤 형식 개요를 참조 하세요.For the list of the control types, see UI Automation Control Types Overview.

컨트롤 패턴을 구현 하는 방법에 대 한 지침Guidance for how to implement control patterns

컨트롤 패턴 및 컨트롤 패턴은 UI 자동화 프레임 워크의 더 큰 정의의 일부 이며, UWP 앱에 대 한 액세스 가능성 지원에만 적용 되지 않습니다.The control patterns and what they're intended for are part of a larger definition of the UI Automation framework, and don't just apply to the accessibility support for a UWP app. 컨트롤 패턴을 구현 하는 경우 이러한 문서와 UI 자동화 사양에 설명 된 지침과 일치 하는 방식으로 구현 하 고 있는지 확인 해야 합니다.When you implement a control pattern you should make sure you're implementing it in a way that matches the guidance as documented in these docs and also in the UI Automation specification. 지침을 찾고 있다면 일반적으로 Microsoft 설명서를 사용할 수 있으며 사양을 참조할 필요가 없습니다.If you're looking for guidance, you can generally use the Microsoft documentation and won't need to refer to the specification. 각 패턴에 대 한 지침은 UI 자동화 컨트롤 패턴 구현에 설명 되어 있습니다.Guidance for each pattern is documented here: Implementing UI Automation Control Patterns. 이 영역에 있는 각 항목에는 "구현 지침 및 규칙" 섹션과 "필수 멤버" 섹션이 있습니다.You'll notice that each topic under this area has an "Implementation Guidelines and Conventions" section and "Required Members" section. 이 지침은 일반적으로 공급자 참조를 위한 컨트롤 패턴 인터페이스 에 있는 관련 컨트롤 패턴 인터페이스의 특정 api를 나타냅니다.The guidance usually refers to specific APIs of the relevant control pattern interface in the Control Pattern Interfaces for Providers reference. 이러한 인터페이스는 네이티브/COM 인터페이스 이며 해당 Api는 COM 스타일 구문을 사용 합니다.Those interfaces are the native/COM interfaces (and their APIs use COM-style syntax). 그러나 표시 되는 모든 항목에는 해당 하는 것이 Windows. .xaml. 공급자 네임 스페이스에 있습니다.But everything you see there has an equivalent in the Windows.UI.Xaml.Automation.Provider namespace.

기본 자동화 피어를 사용 하 고 해당 동작을 확장 하는 경우 해당 피어는 이미 UI 자동화 지침에 따라 작성 되었습니다.If you're using the default automation peers and expanding on their behavior, those peers have already been written in conformance to UI Automation guidelines. 컨트롤 패턴을 지 원하는 경우 UI 자동화 컨트롤 패턴 구현의 지침을 준수 하는 패턴 지원을 사용할 수 있습니다.If they support control patterns, you can rely on that pattern support conforming with guidance at Implementing UI Automation Control Patterns. 컨트롤 피어에서 UI 자동화로 정의 된 컨트롤 형식에 대 한 대표를 보고 하는 경우 Ui 자동화 컨트롤 형식 지원 에 설명 된 지침에 해당 피어가 나옵니다.If a control peer reports that it's representative of a control type defined by UI Automation, then the guidance documented at Supporting UI Automation Control Types has been followed by that peer.

그럼에도 불구 하 고 피어 구현에서 UI 자동화 권장 사항을 따르기 위해 컨트롤 패턴 또는 컨트롤 형식에 대 한 추가 지침이 필요할 수 있습니다.Nevertheless you might need additional guidance for control patterns or control types in order to follow the UI Automation recommendations in your peer implementation. 이는 UWP 컨트롤에서 아직 기본 구현으로 존재 하지 않는 패턴 또는 컨트롤 형식 지원을 구현 하는 경우에 특히 그렇습니다.That would be particularly true if you're implementing pattern or control type support that doesn't yet exist as a default implementation in a UWP control. 예를 들어 주석의 패턴은 기본 XAML 컨트롤에서 구현 되지 않습니다.For example, the pattern for annotations isn't implemented in any of the default XAML controls. 하지만 주석을 광범위 하 게 사용 하는 앱이 있을 수 있으므로 해당 기능을 액세스할 수 있도록 노출 하려고 합니다.But you might have an app that uses annotations extensively and therefore you want to surface that functionality to be accessible. 이 시나리오의 경우 피어는 IAnnotationProvider 을 구현 해야 하며, 문서가 주석을 지원 한다는 것을 나타내는 적절 한 속성을 가진 문서 컨트롤 형식으로 자신을 보고 해야 합니다.For this scenario, your peer should implement IAnnotationProvider and should probably report itself as the Document control type with appropriate properties to indicate that your documents support annotation.

Ui 자동화 컨트롤 패턴을 구현 하는 패턴 또는 Ui 자동화 컨트롤 형식 지원 아래에 표시 되는 패턴에 대 한 지침을 방향 및 일반 지침으로 사용 하는 것이 좋습니다.We recommend that you use the guidance that you see for the patterns under Implementing UI Automation Control Patterns or control types under Supporting UI Automation Control Types as orientation and general guidance. Api의 용도에 대 한 설명 및 설명에 대 한 몇 가지 API 링크를 수행해 볼 수도 있습니다.You might even try following some of the API links for descriptions and remarks as to the purpose of the APIs. 그러나 UWP 앱 프로그래밍에 필요한 구문에 대 한 자세한 내용은 해당 API를 Windows. c o n. c o n. c o n. c o n 네임 스페이스 내에서 확인 하 고 자세한 내용을 보려면 해당 참조 페이지를 사용 하세요.But for syntax specifics that are needed for UWP app programming, find the equivalent API within the Windows.UI.Xaml.Automation.Provider namespace and use those reference pages for more info.

기본 제공 자동화 피어 클래스Built-in automation peer classes

일반적으로 요소는 사용자의 UI 작업을 수락 하거나 응용 프로그램의 대화형 또는 의미 있는 UI를 나타내는 보조 기술의 사용자에 게 필요한 정보를 포함 하는 경우 자동화 피어 클래스를 구현 합니다.In general, elements implement an automation peer class if they accept UI activity from the user, or if they contain information needed by users of assistive technologies that represent the interactive or meaningful UI of apps. 일부 UWP 시각적 요소에는 자동화 피어가 없습니다.Not all UWP visual elements have automation peers. 자동화 피어를 구현 하는 클래스의 예로는 단추텍스트 상자가있습니다.Examples of classes that implement automation peers are Button and TextBox. 자동화 피어를 구현 하지 않는 클래스의 예로는 GridCanvas와 같은 패널기반 테두리 및 클래스가 있습니다.Examples of classes that do not implement automation peers are Border and classes based on Panel, such as Grid and Canvas. 패널 은 시각적 으로만 표시 되는 레이아웃 동작을 제공 하기 때문에 피어가 없습니다.A Panel has no peer because it is providing a layout behavior that is visual only. 사용자가 패널과 상호 작용할 수 있는 접근성 관련 방법이 없습니다.There is no accessibility-relevant way for the user to interact with a Panel . 패널 에 포함 된 자식 요소는 모두 UI 자동화 트리에 피어 또는 요소 표현이 있는 트리에서 사용 가능한 다음 부모의 자식 요소로 보고 됩니다.Whatever child elements a Panel contains are instead reported to UI Automation trees as child elements of the next available parent in the tree that has a peer or element representation.

UI 자동화 및 UWP 프로세스 경계UI Automation and UWP process boundaries

일반적으로 UWP 앱에 액세스 하는 UI 자동화 클라이언트 코드는 out-of-process를 실행 합니다.Typically, UI Automation client code that accesses a UWP app runs out-of-process. UI 자동화 프레임 워크 인프라를 사용 하면 프로세스 경계를 넘어 정보를 가져올 수 있습니다.The UI Automation framework infrastructure enables information to get across the process boundary. 이 개념에 대해서는 UI 자동화 기본 사항에 자세히 설명 되어 있습니다.This concept is explained in more detail in UI Automation Fundamentals.

System.windows.uielement.oncreateautomationpeerOnCreateAutomationPeer

UIElement 에서 파생 되는 모든 클래스에는 protected 가상 메서드 Oncreateautomationpeer가 포함 됩니다.All classes that derive from UIElement contain the protected virtual method OnCreateAutomationPeer. Automation 피어의 개체 초기화 시퀀스는 Oncreateautomationpeer 를 호출 하 여 각 컨트롤에 대 한 자동화 피어 개체를 가져온 다음 런타임 사용을 위한 UI 자동화 트리를 생성 합니다.The object initialization sequence for automation peers calls OnCreateAutomationPeer to get the automation peer object for each control and thus to construct a UI Automation tree for run-time use. UI 자동화 코드는 피어를 사용 하 여 컨트롤의 특징과 기능에 대 한 정보를 가져오고 컨트롤 패턴을 통해 대화형 사용을 시뮬레이션할 수 있습니다.UI Automation code can use the peer to get information about a control’s characteristics and features and to simulate interactive use by means of its control patterns. Automation을 지 원하는 사용자 지정 컨트롤은 Oncreateautomationpeer 를 재정의 하 고 automation피어에서파생 된 클래스의 인스턴스를 반환 해야 합니다.A custom control that supports automation must override OnCreateAutomationPeer and return an instance of a class that derives from AutomationPeer. 예를 들어 사용자 지정 컨트롤이 Buttonbase 클래스에서 파생 되는 경우 oncreateautomationpeer 반환 되는 개체는 buttonbaseautomation피어에서파생 되어야 합니다.For example, if a custom control derives from the ButtonBase class, the object returned by OnCreateAutomationPeer should derive from ButtonBaseAutomationPeer.

사용자 지정 컨트롤 클래스를 작성 하 고 새 자동화 피어를 제공 하려는 경우 사용자 지정 컨트롤에 대 한 Oncreateautomationpeer 메서드를 재정의 하 여 피어의 새 인스턴스를 반환 하도록 해야 합니다.If you're writing a custom control class and intend to also supply a new automation peer, you should override the OnCreateAutomationPeer method for your custom control so that it returns a new instance of your peer. 피어 클래스는 automationpeer에서 직접 또는 간접적으로 파생 되어야 합니다.Your peer class must derive directly or indirectly from AutomationPeer.

예를 들어 다음 코드는 사용자 지정 컨트롤이 NumericUpDown UI 자동화를 위해 피어를 사용 해야 함을 선언 합니다 NumericUpDownPeer .For example, the following code declares that the custom control NumericUpDown should use the peer NumericUpDownPeer for UI Automation purposes.

using Windows.UI.Xaml.Automation.Peers;
...
public class NumericUpDown : RangeBase {
    public NumericUpDown() {
    // other initialization; DefaultStyleKey etc.
    }
    ...
    protected override AutomationPeer OnCreateAutomationPeer()
    {
        return new NumericUpDownAutomationPeer(this);
    }
}
Public Class NumericUpDown
    Inherits RangeBase
    ' other initialization; DefaultStyleKey etc.
       Public Sub New()
       End Sub
       Protected Overrides Function OnCreateAutomationPeer() As AutomationPeer
              Return New NumericUpDownAutomationPeer(Me)
       End Function
End Class
// NumericUpDown.idl
namespace MyNamespace
{
    runtimeclass NumericUpDown : Windows.UI.Xaml.Controls.Primitives.RangeBase
    {
        NumericUpDown();
        Int32 MyProperty;
    }
}

// NumericUpDown.h
...
struct NumericUpDown : NumericUpDownT<NumericUpDown>
{
    ...
    Windows::UI::Xaml::Automation::Peers::AutomationPeer OnCreateAutomationPeer()
    {
        return winrt::make<MyNamespace::implementation::NumericUpDownAutomationPeer>(*this);
    }
};
//.h
public ref class NumericUpDown sealed : Windows::UI::Xaml::Controls::Primitives::RangeBase
{
// other initialization not shown
protected:
    virtual AutomationPeer^ OnCreateAutomationPeer() override
    {
         return ref new NumericUpDownAutomationPeer(this);
    }
};

참고

Oncreateautomationpeer 구현에서는 사용자 지정 자동화 피어의 새 인스턴스를 초기화 하 고 호출 하는 컨트롤을 소유자로 전달 하 고 해당 인스턴스를 반환 하는 것 외에는 아무 작업도 수행 하지 않아야 합니다.The OnCreateAutomationPeer implementation should do nothing more than initialize a new instance of your custom automation peer, passing the calling control as owner, and return that instance. 이 메서드에서 추가 논리를 시도 하지 마십시오.Do not attempt additional logic in this method. 특히 동일한 호출 내에서 Automationpeer 를 소멸 시킬 수 있는 모든 논리에서 예기치 않은 런타임 동작이 발생할 수 있습니다.In particular, any logic that could potentially lead to destruction of the AutomationPeer within the same call may result in unexpected runtime behavior.

Oncreateautomationpeer일반적인 구현에서는 메서드 재정의가 컨트롤 클래스 정의의 나머지 부분과 동일한 범위에 있기 때문에 소유자this 또는 Me 로 지정 됩니다.In typical implementations of OnCreateAutomationPeer, the owner is specified as this or Me because the method override is in the same scope as the rest of the control class definition.

실제 피어 클래스 정의는 컨트롤과 같은 코드 파일이 나 별도의 코드 파일에서 수행할 수 있습니다.The actual peer class definition can be done in the same code file as the control or in a separate code file. 피어 정의는 피어를 제공 하는 컨트롤과는 별도의 네임 스페이스인 Windows. .xaml 네임 스페이스에 있습니다.The peer definitions all exist in the Windows.UI.Xaml.Automation.Peers namespace that is a separate namespace from the controls that they provide peers for. Oncreateautomationpeer 메서드 호출에 필요한 네임 스페이스를 참조 하는 한 별도의 네임 스페이스에도 피어를 선언 하도록 선택할 수 있습니다.You can choose to declare your peers in separate namespaces also, as long as you reference the necessary namespaces for the OnCreateAutomationPeer method call.

올바른 피어 기본 클래스 선택Choosing the correct peer base class

사용자가 파생 하는 컨트롤 클래스의 기존 피어 논리와 가장 일치 하는 항목을 제공 하는 기본 클래스에서 Automationpeer 가 파생 되는지 확인 합니다.Make sure that your AutomationPeer is derived from a base class that gives you the best match for the existing peer logic of the control class you are deriving from. 이전 예제의 경우가 범위 NumericUpDown 기반에서 파생 되기 때문에 피어를 기반으로 하는 범위 지정 클래스 사용할 수 있습니다.In the case of the previous example, because NumericUpDown derives from RangeBase, there is a RangeBaseAutomationPeer class available that you should base your peer on. 가장 근접 하 게 일치 하는 피어 클래스를 파생 하는 방법에 대해 병렬로 사용 하 여 기본 피어 클래스가 이미 IRangeValueProvider 기능을 구현 하기 때문에 최소한의 기능을 재정의 하지 않을 수 있습니다.By using the closest matching peer class in parallel to how you derive the control itself, you can avoid overriding at least some of the IRangeValueProvider functionality because the base peer class already implements it.

기본 컨트롤 클래스에 해당 하는 피어 클래스가 없습니다.The base Control class does not have a corresponding peer class. 컨트롤 에서 파생 되는 사용자 지정 컨트롤에 해당 하는 피어 클래스가 필요한 경우 FrameworkElementAutomationPeer에서 사용자 지정 피어 클래스를 파생 시킵니다.If you need a peer class to correspond to a custom control that derives from Control , derive the custom peer class from FrameworkElementAutomationPeer.

ContentControl 에서 직접 파생 하는 경우 피어 클래스를 참조 하는 oncreateautomationpeer 구현이 없으므로 해당 클래스에 기본 자동화 피어 동작이 없습니다.If you derive from ContentControl directly, that class has no default automation peer behavior because there is no OnCreateAutomationPeer implementation that references a peer class. 따라서 사용자 고유의 피어를 사용 하려면 Oncreateautomationpeer 를 구현 하거나, 내게 필요한 옵션 지원 수준이 컨트롤에 적절 한 경우 FrameworkElementAutomationPeer 을 피어로 사용 해야 합니다.So make sure either to implement OnCreateAutomationPeer to use your own peer, or to use FrameworkElementAutomationPeer as the peer if that level of accessibility support is adequate for your control.

참고

일반적으로 FrameworkElementAutomationPeer가 아니라 automationpeer 파생 되지 않습니다.You don't typically derive from AutomationPeer rather than FrameworkElementAutomationPeer. Automationpeer 에서 직접 파생 한 경우 FrameworkElementAutomationPeer 에서 제공 되는 많은 기본 접근성 지원 기능을 복제 해야 합니다.If you did derive directly from AutomationPeer you'll need to duplicate a lot of basic accessibility support that would otherwise come from FrameworkElementAutomationPeer .

사용자 지정 피어 클래스 초기화Initialization of a custom peer class

자동화 피어는 기본 초기화에 대 한 소유자 컨트롤의 인스턴스를 사용 하는 형식이 안전한 생성자를 정의 해야 합니다.The automation peer should define a type-safe constructor that uses an instance of the owner control for base initialization. 다음 예제에서 구현은 소유자 값을 범위 baseautomation피어 기반에 전달 하 고 궁극적으로 FrameworkElementAutomationPeer 를 사용 하FrameworkElementAutomationPeer를 설정 하는 것입니다.In the next example, the implementation passes the owner value on to the RangeBaseAutomationPeer base, and ultimately it is the FrameworkElementAutomationPeer that actually uses owner to set FrameworkElementAutomationPeer.Owner.

public NumericUpDownAutomationPeer(NumericUpDown owner): base(owner)
{}
Public Sub New(owner As NumericUpDown)
    MyBase.New(owner)
End Sub
// NumericUpDownAutomationPeer.idl
import "NumericUpDown.idl";
namespace MyNamespace
{
    runtimeclass NumericUpDownAutomationPeer : Windows.UI.Xaml.Automation.Peers.AutomationPeer
    {
        NumericUpDownAutomationPeer(NumericUpDown owner);
        Int32 MyProperty;
    }
}

// NumericUpDownAutomationPeer.h
...
struct NumericUpDownAutomationPeer : NumericUpDownAutomationPeerT<NumericUpDownAutomationPeer>
{
    ...
    NumericUpDownAutomationPeer(MyNamespace::NumericUpDown const& owner);
};
//.h
public ref class NumericUpDownAutomationPeer sealed :  Windows::UI::Xaml::Automation::Peers::RangeBaseAutomationPeer
//.cpp
public:    NumericUpDownAutomationPeer(NumericUpDown^ owner);

AutomationPeer의 핵심 메서드Core methods of AutomationPeer

UWP 인프라의 경우, 자동화 피어의 재정의 가능 메서드는 UI 자동화 공급자가 UI 자동화 클라이언트에 대 한 전달 지점으로 사용 하는 공용 액세스 메서드와, UWP 클래스가 동작에 영향을 주도록 재정의 될 수 있는 보호 된 "코어" 사용자 지정 메서드를 사용 하는 메서드 쌍의 일부입니다.For UWP infrastructure reasons, the overridable methods of an automation peer are part of a pair of methods: the public access method that the UI Automation provider uses as a forwarding point for UI Automation clients, and the protected "Core" customization method that a UWP class can override to influence the behavior. 액세스 메서드를 호출할 때 항상 공급자 구현이 있는 병렬 "Core" 메서드를 호출 하거나 대체 (fallback)를 사용 하 여 기본 클래스에서 기본 구현을 호출 하는 방식으로 메서드 쌍은 기본적으로 함께 사용 됩니다.The method pair is wired together by default in such a way that the call to the access method always invokes the parallel "Core" method that has the provider implementation, or as a fallback, invokes a default implementation from the base classes.

사용자 지정 컨트롤에 대 한 피어를 구현할 때 사용자 지정 컨트롤에 고유한 동작을 노출 하려는 기본 자동화 피어 클래스의 "핵심" 메서드를 재정의 합니다.When implementing a peer for a custom control, override any of the "Core" methods from the base automation peer class where you want to expose behavior that is unique to your custom control. UI 자동화 코드는 피어 클래스의 공용 메서드를 호출 하 여 컨트롤에 대 한 정보를 가져옵니다.UI Automation code gets information about your control by calling public methods of the peer class. 컨트롤에 대 한 정보를 제공 하려면 컨트롤 구현 및 디자인에서 내게 필요한 옵션 시나리오 또는 기본 자동화 피어 클래스에서 지원 되는 것과 다른 UI 자동화 시나리오를 만들 때 "Core"로 끝나는 이름으로 각 메서드를 재정의 합니다.To provide information about your control, override each method with a name that ends with "Core" when your control implementation and design creates accessibility scenarios or other UI Automation scenarios that differ from what's supported by the base automation peer class.

최소한 새 피어 클래스를 정의할 때마다 다음 예제와 같이 Getclassnamecore 메서드를 구현 합니다.At a minimum, whenever you define a new peer class, implement the GetClassNameCore method, as shown in the next example.

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

참고

문자열을 메서드 본문에 직접 저장 하는 것이 아니라 상수로 저장할 수도 있습니다.You might want to store the strings as constants rather than directly in the method body, but that is up to you. Getclassnamecore의 경우이 문자열을 지역화할 필요가 없습니다.For GetClassNameCore, you won't need to localize this string. LocalizedControlType 속성은 CLASSNAME 이 아닌 UI 자동화 클라이언트에서 지역화 된 문자열이 필요할 때마다 사용 됩니다.The LocalizedControlType property is used any time a localized string is needed by a UI Automation client, not ClassName .

GetAutomationControlType GetAutomationControlType

일부 보조 기술에서는 ui 자동화 트리에서 항목의 특성을 보고 하는 경우 UI 자동화 이름을 벗어나는 추가 정보로 GetAutomationControlType 값을 직접 사용 합니다.Some assistive technologies use the GetAutomationControlType value directly when reporting characteristics of the items in a UI Automation tree, as additional information beyond the UI Automation Name . 컨트롤이 파생 되는 컨트롤과 크게 다른 경우 컨트롤에서 사용 하는 기본 피어 클래스가 보고 하는 것과 다른 컨트롤 형식을 보고 하려면 피어를 구현 하 고 피어 구현에서 system.windows.automation.peers.automationpeer.getautomationcontroltypecore 를 재정의 해야 합니다.If your control is significantly different from the control you are deriving from and you want to report a different control type from what is reported by the base peer class used by the control, you must implement a peer and override GetAutomationControlTypeCore in your peer implementation. ItemsControl 또는 ContentControl와 같은 일반화 된 기본 클래스에서 파생 하는 경우 기본 피어에서 컨트롤 형식에 대 한 정확한 정보를 제공 하지 않는 경우에 특히 중요 합니다.This is particularly important if you derive from a generalized base class such as ItemsControl or ContentControl, where the base peer doesn't provide precise information about control type.

System.windows.automation.peers.automationpeer.getautomationcontroltypecore 구현에서는 AutomationControlType 값을 반환 하 여 컨트롤을 설명 합니다.Your implementation of GetAutomationControlTypeCore describes your control by returning an AutomationControlType value. AutomationControlType를 반환할 수 있지만 컨트롤의 주 시나리오를 정확 하 게 설명 하는 경우에는 보다 구체적인 컨트롤 형식 중 하나를 반환 해야 합니다 .Although you can return AutomationControlType.Custom , you should return one of the more specific control types if it accurately describes your control's main scenarios. 예를 들면 다음과 같습니다.Here's an example.

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

참고

AutomationControlType를 지정 하지 않으면 GetLocalizedControlTypeCore 를 구현 하 여 클라이언트에 LocalizedControlType 속성 값을 제공할 필요가 없습니다.Unless you specify AutomationControlType.Custom, you don't have to implement GetLocalizedControlTypeCore to provide a LocalizedControlType property value to clients. UI 자동화 common infrastructure는 AutomationControlType 이외의 모든 가능한 AutomationControlType 값에 대해 번역 된 문자열을 제공 합니다.UI Automation common infrastructure provides translated strings for every possible AutomationControlType value other than AutomationControlType.Custom .

GetPattern 및 GetPatternCoreGetPattern and GetPatternCore

피어의 GetPatternCore 구현은 입력 매개 변수에서 요청 된 패턴을 지 원하는 개체를 반환 합니다.A peer's implementation of GetPatternCore returns the object that supports the pattern that is requested in the input parameter. 특히, UI 자동화 클라이언트는 공급자의 Getpattern 메서드에 전달 되는 메서드를 호출 하 고, 요청 된 패턴의 이름을 지정 하는 PatternInterface 열거형 값을 지정 합니다.Specifically, a UI Automation client calls a method that is forwarded to the provider's GetPattern method, and specifies a PatternInterface enumeration value that names the requested pattern. GetPatternCore 의 재정의는 지정 된 패턴을 구현 하는 개체를 반환 해야 합니다.Your override of GetPatternCore should return the object that implements the specified pattern. 해당 개체는 피어 자체 이며, 피어는 패턴을 지원 한다는 것을 보고할 때마다 해당 패턴 인터페이스를 구현 해야 합니다.That object is the peer itself, because the peer should implement the corresponding pattern interface any time that it reports that it supports a pattern. 피어에 패턴의 사용자 지정 구현이 없지만 피어의 기반이 패턴을 구현 하는 것을 알고 있는 경우 GetPatternCore 에서 기본 형식의 GetPatternCore 구현을 호출할 수 있습니다.If your peer does not have a custom implementation of a pattern, but you know that the peer's base does implement the pattern, you can call the base type's implementation of GetPatternCore from your GetPatternCore . 피어에서 패턴이 지원 되지 않는 경우 피어의 GetPatternCorenull 을 반환 해야 합니다.A peer's GetPatternCore should return null if a pattern is not supported by the peer. 그러나 구현에서 직접 null 을 반환 하는 대신 일반적으로 기본 구현에 대 한 호출을 사용 하 여 지원 되지 않는 모든 패턴에 대해 null 을 반환 합니다.However, instead of returning null directly from your implementation, you would usually rely on the call to the base implementation to return null for any unsupported pattern.

패턴을 지 원하는 경우 GetPatternCore 구현에서 또는 Me 를 반환할 수 있습니다.When a pattern is supported, the GetPatternCore implementation can return this or Me . UI 자동화 클라이언트는 null 이 아닌 경우 요청 된 패턴 인터페이스로 getpattern 반환 값을 캐스팅 하는 것이 예상 됩니다.The expectation is that the UI Automation client will cast the GetPattern return value to the requested pattern interface whenever it is not null .

피어 클래스가 다른 피어에서 상속 하 고 필요한 모든 지원 및 패턴 보고가 기본 클래스에서 이미 처리 된 경우 GetPatternCore 구현은 필요 하지 않습니다.If a peer class inherits from another peer, and all necessary support and pattern reporting is already handled by the base class, implementing GetPatternCore isn't necessary. 예를 들어 범위 컨트롤을 구현 하는 경우 범위 기반에서 파생 되 고, 피어가 범위 baseautomation피어에서 파생 되는 경우 해당 피어는 PatternInterface 값 을 반환 하 고 패턴을 지 원하는 IRangeValueProvider 인터페이스의 작업 구현을 포함 합니다.For example, if you are implementing a range control that derives from RangeBase, and your peer derives from RangeBaseAutomationPeer, that peer returns itself for PatternInterface.RangeValue and has working implementations of the IRangeValueProvider interface that supports the pattern.

이 예제는 리터럴 코드가 아니지만,이 예제에서는 GetPatternCore 의 구현이 현재 범위를 계산하는 것과 비슷합니다.Although it is not the literal code, this example approximates the implementation of GetPatternCore already present in RangeBaseAutomationPeer.

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

기본 피어 클래스에서 필요한 모든 지원이 없는 피어를 구현 하거나 피어가 지원할 수 있는 기본 상속 패턴 집합을 변경 하거나 추가 하려는 경우 GetPatternCore 를 재정의 하 여 UI 자동화 클라이언트가 패턴을 사용할 수 있도록 해야 합니다.If you are implementing a peer where you don't have all the support you need from a base peer class, or you want to change or add to the set of base-inherited patterns that your peer can support, then you should override GetPatternCore to enable UI Automation clients to use the patterns.

UI 자동화 지원의 UWP 구현에서 사용할 수 있는 공급자 패턴의 목록은 Windows. .xaml.For a list of the provider patterns that are available in the UWP implementation of UI Automation support, see Windows.UI.Xaml.Automation.Provider. 이러한 각 패턴에는 PatternInterface 열거형의 해당 값이 있습니다 .이 값은 UI 자동화 클라이언트가 getpattern 호출에서 패턴을 요청 하는 방법입니다.Each such pattern has a corresponding value of the PatternInterface enumeration, which is how UI Automation clients request the pattern in a GetPattern call.

피어는 둘 이상의 패턴을 지원함을 보고할 수 있습니다.A peer can report that it supports more than one pattern. 그렇다면 재정의에는 지원 되는 각 PatternInterface 값에 대 한 반환 경로 논리가 포함 되 고 각 일치 하는 대/소문자에 피어가 반환 되어야 합니다.If so, the override should include return path logic for each supported PatternInterface value and return the peer in each matching case. 호출자는 한 번에 하나의 인터페이스만 요청 하 고 호출자는 예상 되는 인터페이스로 캐스팅 해야 합니다.It is expected that the caller will request only one interface at a time, and it is up to the caller to cast to the expected interface.

다음은 사용자 지정 피어에 대 한 GetPatternCore 재정의의 예입니다.Here's an example of a GetPatternCore override for a custom peer. IRangeValueProviderIToggleProvider의 두 가지 패턴에 대 한 지원을 보고 합니다.It reports the support for two patterns, IRangeValueProvider and IToggleProvider. 이 컨트롤은 전체 화면 (설정/해제 모드)으로 표시 되 고 사용자가 위치 (범위 컨트롤)를 선택할 수 있는 진행률 표시줄이 있는 미디어 표시 컨트롤입니다.The control here is a media display control that can display as full-screen (the toggle mode) and that has a progress bar within which users can select a position (the range control). 이 코드는 XAML 접근성 샘플에서 가져온 것입니다.This code came from the XAML accessibility sample.

protected override object GetPatternCore(PatternInterface patternInterface)
{
    if (patternInterface == PatternInterface.RangeValue)
    {
        return this;
    }
    else if (patternInterface == PatternInterface.Toggle)
    {
        return this;
    }
    return null;
}

하위 요소의 전달 패턴Forwarding patterns from sub-elements

GetPatternCore 메서드 구현에서는 하위 요소 또는 파트를 해당 호스트의 패턴 공급자로 지정할 수도 있습니다.A GetPatternCore method implementation can also specify a sub-element or part as a pattern provider for its host. 이 예제에서는 ItemsControl 가 내부 ScrollViewer 컨트롤의 피어에 스크롤 패턴 처리를 전송 하는 방법을 모방 합니다.This example mimics how ItemsControl transfers scroll-pattern handling to the peer of its internal ScrollViewer control. 패턴 처리에 대 한 하위 요소를 지정 하기 위해이 코드는 하위 요소 개체를 가져오고 FrameworkElementAutomationPeer 를 사용 하 여 하위 요소에 대 한 피어를 만들고 새 피어를 반환 합니다.To specify a sub-element for pattern handling, this code gets the sub-element object, creates a peer for the sub-element by using the FrameworkElementAutomationPeer.CreatePeerForElement method, and returns the new peer.

protected override object GetPatternCore(PatternInterface patternInterface)
{
    if (patternInterface == PatternInterface.Scroll)
    {
        ItemsControl owner = (ItemsControl) base.Owner;
        UIElement itemsHost = owner.ItemsHost;
        ScrollViewer element = null;
        while (itemsHost != owner)
        {
            itemsHost = VisualTreeHelper.GetParent(itemsHost) as UIElement;
            element = itemsHost as ScrollViewer;
            if (element != null)
            {
                break;
            }
        }
        if (element != null)
        {
            AutomationPeer peer = FrameworkElementAutomationPeer.CreatePeerForElement(element);
            if ((peer != null) && (peer is IScrollProvider))
            {
                return (IScrollProvider) peer;
            }
        }
    }
    return base.GetPatternCore(patternInterface);
}

기타 핵심 방법Other Core methods

컨트롤에서 기본 시나리오에 대 한 키보드 관련 기능을 지원 해야 할 수도 있습니다. 이 작업이 필요한 이유에 대 한 자세한 내용은 키보드 접근성을 참조 하세요.Your control may need to support keyboard equivalents for primary scenarios; for more info about why this might be necessary, see Keyboard accessibility. 키 지원을 구현 하는 것은 컨트롤 코드의 일부 이며, 컨트롤의 논리의 일부 이기 때문에 피어 코드가 아니라, 피어 클래스가 GetAcceleratorKeyCoreGetaccesskeycore 메서드를 재정의 하 여 사용 되는 키를 UI 자동화 클라이언트에 보고 해야 합니다.Implementing the key support is necessarily part of the control code and not the peer code because that is part of a control's logic, but your peer class should override the GetAcceleratorKeyCore and GetAccessKeyCore methods to report to UI Automation clients which keys are used. 키 정보를 보고 하는 문자열은 지역화 해야 할 수 있으므로 하드 코드 된 문자열이 아닌 리소스에서 가져와야 합니다.Consider that the strings that report key information might need to be localized, and should therefore come from resources, not hard-coded strings.

컬렉션을 지 원하는 클래스에 대 한 피어를 제공 하는 경우 함수 클래스와 이미 해당 종류의 컬렉션을 지 원하는 피어 클래스에서 파생 하는 것이 가장 좋습니다.If you are providing a peer for a class that supports a collection, it's best to derive from both functional classes and peer classes that already have that kind of collection support. 이렇게 할 수 없는 경우 자식 컬렉션을 유지 관리 하는 컨트롤의 피어는 부모-자식 관계를 UI 자동화 트리에 올바르게 보고 하기 위해 컬렉션 관련 피어 메서드 GetChildrenCore 를 재정의 해야 할 수 있습니다.If you can't do so, peers for controls that maintain child collections may have to override the collection-related peer method GetChildrenCore to properly report the parent-child relationships to the UI Automation tree.

사용자 인터페이스 (또는 둘 다)에서 컨트롤이 데이터 콘텐츠를 포함 하거나 대화형 역할을 수행할지 여부를 나타내는 Iscontentelementcoreiscontentelementcore 메서드를 구현 합니다.Implement the IsContentElementCore and IsControlElementCore methods to indicate whether your control contains data content or fulfills an interactive role in the user interface (or both). 기본적으로 두 메서드는 모두 true 를 반환 합니다.By default, both methods return true . 이러한 설정은 화면 판독기와 같은 보조 기술의 유용성을 향상 시킵니다. 이러한 메서드를 사용 하 여 자동화 트리를 필터링 할 수 있습니다.These settings improve the usability of assistive technologies such as screen readers, which may use these methods to filter the automation tree. GetPatternCore 메서드가 하위 요소 피어로 패턴 처리를 전송 하는 경우 하위 요소 피어의 Iscontrolelementcore 메서드에서 false 를 반환 하 여 자동화 트리에서 하위 요소 피어를 숨길 수 있습니다.If your GetPatternCore method transfers pattern handling to a sub-element peer, the sub-element peer's IsControlElementCore method can return false to hide the sub-element peer from the automation tree.

일부 컨트롤은 텍스트 레이블 파트에서 텍스트가 아닌 부분에 대 한 정보를 제공 하거나 컨트롤을 UI의 다른 컨트롤과 알려진 레이블 지정 관계로 사용 하기 위해 레이블 지정 시나리오를 지원할 수 있습니다.Some controls may support labeling scenarios, where a text label part supplies information for a non-text part, or a control is intended to be in a known labeling relationship with another control in the UI. 유용한 클래스 기반 동작을 제공할 수 있는 경우 Getlabeledbycore 를 재정의 하 여이 동작을 제공할 수 있습니다.If it's possible to provide a useful class-based behavior, you can override GetLabeledByCore to provide this behavior.

GetBoundingRectangleCoreGetClickablePointCore 는 주로 자동화 된 테스트 시나리오에 사용 됩니다.GetBoundingRectangleCore and GetClickablePointCore are used mainly for automated testing scenarios. 컨트롤에 대 한 자동화 된 테스트를 지원 하려는 경우 이러한 메서드를 재정의할 수 있습니다.If you want to support automated testing for your control, you might want to override these methods. 사용자가 좌표 공간에서 클릭 한 범위가 범위에 다른 영향을 주므로 단일 지점만 제안할 수 없는 범위 형식 컨트롤의 경우이 작업이 필요할 수 있습니다.This might be desired for range-type controls, where you can't suggest just a single point because where the user clicks in coordinate space has a different effect on a range. 예를 들어 기본 스크롤 막대 자동화 피어는 GetClickablePointCore 를 재정의 하 여 "Not a number" Point 값을 반환 합니다.For example, the default ScrollBar automation peer overrides GetClickablePointCore to return a "not a number" Point value.

GetLiveSettingCore 는 UI 자동화에 대 한 LiveSetting 값의 컨트롤 기본값에 영향을 미칩니다.GetLiveSettingCore influences the control default for the LiveSetting value for UI Automation. 컨트롤이 AutomationLiveSetting이외의 값을 반환 하도록 하려면이 재정의를 재정의 하는 것이 좋습니다.You might want to override this if you want your control to return a value other than AutomationLiveSetting.Off. LiveSetting 가 나타내는 항목에 대 한 자세한 내용은 LiveSetting를 참조 하세요.For more info on what LiveSetting represents, see AutomationProperties.LiveSetting.

컨트롤에 automationorientation에 매핑할 수 있는 설정 가능한 방향 속성이 있는 경우 GetOrientationCore 을 재정의할 수 있습니다.You might override GetOrientationCore if your control has a settable orientation property that can map to AutomationOrientation. ScrollBarAutomationPeerSliderAutomationPeer 클래스에서이 작업을 수행 합니다.The ScrollBarAutomationPeer and SliderAutomationPeer classes do this.

FrameworkElementAutomationPeer의 기본 구현Base implementation in FrameworkElementAutomationPeer

FrameworkElementAutomationPeer 의 기본 구현에서는 프레임 워크 수준에서 정의 된 다양 한 레이아웃 및 동작 속성으로 해석할 수 있는 몇 가지 UI 자동화 정보를 제공 합니다.The base implementation of FrameworkElementAutomationPeer provides some UI Automation information that can be interpreted from various layout and behavior properties that are defined at the framework level.

  • GetBoundingRectangleCore: 알려진 레이아웃 특성을 기반으로 하는 Rect 구조체를 반환 합니다.GetBoundingRectangleCore: Returns a Rect structure based on the known layout characteristics. IsOffscreentrue 인 경우 0 값 Rect 를 반환 합니다.Returns a 0-value Rect if IsOffscreen is true .
  • GetClickablePointCore: 알 수 없는 BoundingRectangle 이 있는 한 알려진 레이아웃 특성을 기반으로 하는 구조를 반환 합니다.GetClickablePointCore: Returns a Point structure based on the known layout characteristics, as long as there is a nonzero BoundingRectangle .
  • Getnamecore: 여기에 요약 될 수 있는 것 보다 더 광범위 한 동작입니다. Getnamecore를 참조 하십시오.GetNameCore: More extensive behavior than can be summarized here; see GetNameCore. 기본적으로 콘텐츠를 포함 하는 ContentControl 또는 관련 클래스의 알려진 콘텐츠에서 문자열 변환을 시도 합니다.Basically, it attempts a string conversion on any known content of a ContentControl or related classes that have content. 또한 있으면 labeledby에 대 한 값이 있는 경우 해당 항목의 이름 값이 이름 으로 사용 됩니다.Also, if there is a value for LabeledBy, that item's Name value is used as the Name .
  • HasKeyboardFocusCore: 소유자의 FocusStateIsEnabled 속성을 기반으로 평가 됩니다.HasKeyboardFocusCore: Evaluated based on the owner's FocusState and IsEnabled properties. 컨트롤이 아닌 요소는 항상 false 를 반환 합니다.Elements that aren't controls always return false .
  • IsEnabledCore: 소유자의 IsEnabled 속성 ( 컨트롤인 경우)을 기반으로 평가 됩니다.IsEnabledCore: Evaluated based on the owner's IsEnabled property if it is a Control. 컨트롤이 아닌 요소는 항상 true 를 반환 합니다.Elements that aren't controls always return true . 이는 소유자가 기존 상호 작용 센스에서 사용 하도록 설정 된 것을 의미 하지 않습니다. 이는 소유자가 IsEnabled 속성을 갖지 않더라도 피어를 사용할 수 있음을 의미 합니다.This doesn't mean that the owner is enabled in the conventional interaction sense; it means that the peer is enabled despite the owner not having an IsEnabled property.
  • IsKeyboardFocusableCore: Owner가 컨트롤인경우 true 를 반환 합니다. 그렇지 않으면 false 입니다.IsKeyboardFocusableCore: Returns true if owner is a Control; otherwise it is false .
  • IsOffscreenCore: owner 요소 또는 해당 부모 항목에서 축소표시 유형은 IsOffscreen에 대 한 true 값과 같습니다.IsOffscreenCore: A Visibility of Collapsed on the owner element or any of its parents equates to a true value for IsOffscreen. 예외: 해당 소유자의 부모가이 아닌 경우에도 Popup 개체를 표시할 수 있습니다.Exception: a Popup object can be visible even if its owner's parents are not.
  • SetFocusCore: 포커스를 호출 합니다.SetFocusCore: Calls Focus.
  • Getparent: 소유자에서 FrameworkElement. 부모 를 호출 하 고 적절 한 피어를 조회 합니다.GetParent: Calls FrameworkElement.Parent from the owner, and looks up the appropriate peer. 이는 "Core" 메서드를 사용 하는 재정의 쌍이 아니므로이 동작을 변경할 수 없습니다.This isn't an override pair with a "Core" method, so you can't change this behavior.

참고

기본 UWP 피어는 실제 UWP 코드를 사용할 필요는 없지만 UWP를 구현 하는 내부 네이티브 코드를 사용 하 여 동작을 구현 합니다.Default UWP peers implement a behavior by using internal native code that implements the UWP, not necessarily by using actual UWP code. CLR (공용 언어 런타임) 리플렉션 또는 기타 기술을 통해 구현에 대 한 코드 또는 논리를 볼 수 없습니다.You won't be able to see the code or logic of the implementation through common language runtime (CLR) reflection or other techniques. 기본 피어 동작의 서브 클래스 관련 재정의에 대 한 별도의 참조 페이지도 표시 되지 않습니다.You also won't see distinct reference pages for subclass-specific overrides of base peer behavior. 예를 들어 TextBoxAutomationPeer에 대 한 추가 동작이 있을 수 있으며,이는 automationpeer 참조 페이지에 설명 되지 않으며, TextBoxAutomationPeer.GetNameCore 에 대 한 참조 페이지는 없습니다.For example, there might be additional behavior for GetNameCore of a TextBoxAutomationPeer, which won't be described on the AutomationPeer.GetNameCore reference page, and there is no reference page for TextBoxAutomationPeer.GetNameCore . TextBoxAutomationPeer 참조 페이지도 없습니다.There isn't even a TextBoxAutomationPeer.GetNameCore reference page. 대신, 가장 직접적인 피어 클래스에 대 한 참조 항목을 읽고 설명 섹션에서 구현 메모를 찾습니다.Instead, read the reference topic for the most immediate peer class, and look for implementation notes in the Remarks section.

피어 및 AutomationPropertiesPeers and AutomationProperties

자동화 피어는 컨트롤의 접근성 관련 정보에 대 한 적절 한 기본값을 제공 해야 합니다.Your automation peer should provide appropriate default values for your control's accessibility-related information. 컨트롤을 사용 하는 모든 앱 코드는 컨트롤 인스턴스에 Automationproperties 연결 된 속성 값을 포함 하 여 해당 동작 중 일부를 재정의할 수 있습니다.Note that any app code that uses the control can override some of that behavior by including AutomationProperties attached-property values on control instances. 호출자는 기본 컨트롤이 나 사용자 지정 컨트롤에 대해이 작업을 수행할 수 있습니다.Callers can do this either for the default controls or for custom controls. 예를 들어 다음 XAML은 두 개의 사용자 지정 된 UI 자동화 속성이 있는 단추를 만듭니다. <Button AutomationProperties.Name="Special" AutomationProperties.HelpText="This is a special button."/>For example, the following XAML creates a button that has two customized UI Automation properties: <Button AutomationProperties.Name="Special" AutomationProperties.HelpText="This is a special button."/>

Automationproperties 연결 된 속성에 대 한 자세한 내용은 기본 접근성 정보를 참조 하세요.For more info about AutomationProperties attached properties, see Basic accessibility information.

일부 Automationpeer 메서드는 UI 자동화 공급자가 정보를 보고 하는 방법의 일반적인 계약 때문에 존재 하지만 이러한 메서드는 일반적으로 컨트롤 피어에서 구현 되지 않습니다.Some of the AutomationPeer methods exist because of the general contract of how UI Automation providers are expected to report information, but these methods are not typically implemented in control peers. 이러한 정보는 특정 UI에서 컨트롤을 사용 하는 응용 프로그램 코드에 적용 된 Automationproperties 값에서 제공 될 것으로 예상 되기 때문입니다.This is because that info is expected to be provided by AutomationProperties values applied to the app code that uses the controls in a specific UI. 예를 들어 대부분의 앱은 있으면 labeledby 값을 적용 하 여 UI에서 서로 다른 두 컨트롤 간의 레이블 지정 관계를 정의 합니다.For example, most apps would define the labeling relationship between two different controls in the UI by applying a AutomationProperties.LabeledBy value. 그러나 Labeledbycore 는 헤더 파트를 사용 하 여 데이터 필드 파트에 레이블을 지정 하거나, 컨테이너를 사용 하 여 항목을 레이블 지정 하거나, 유사한 시나리오를 비롯 하 여 컨트롤의 데이터 또는 항목 관계를 나타내는 특정 피어에서 구현 됩니다.However, LabeledByCore is implemented in certain peers that represent data or item relationships in a control, such as using a header part to label a data-field part, labeling items with their containers, or similar scenarios.

구현 패턴Implementing patterns

확장-축소를 위해 컨트롤 패턴 인터페이스를 구현 하 여 확장/축소 동작을 구현 하는 컨트롤에 대 한 피어를 작성 하는 방법을 살펴보겠습니다.Let's look at how to write a peer for a control that implements an expand-collapse behavior by implementing the control pattern interface for expand-collapse. PatternInterface ExpandCollapse값을 사용 하 여 getpattern 이 호출 될 때마다 자체를 반환 하 여 확장-축소 동작에 대 한 액세스 가능성을 피어가 사용 하도록 설정 해야 합니다.The peer should enable the accessibility for the expand-collapse behavior by returning itself whenever GetPattern is called with a value of PatternInterface.ExpandCollapse. 그런 다음 피어는 해당 패턴 ( IExpandCollapseProvider)에 대 한 공급자 인터페이스를 상속 하 고 해당 공급자 인터페이스의 각 멤버에 대 한 구현을 제공 해야 합니다.The peer should then inherit the provider interface for that pattern ( IExpandCollapseProvider) and provide implementations for each of the members of that provider interface. 이 경우 인터페이스에는 재정의 하는 세 가지 멤버 ( 확장, 축소, ExpandCollapseState)가 있습니다.In this case the interface has three members to override: Expand, Collapse, ExpandCollapseState.

클래스 자체의 API 디자인에서 접근성에 대해 미리 계획 하는 것이 좋습니다.It's helpful to plan ahead for accessibility in the API design of the class itself. UI에서 작업하는 사용자의 일반적인 조작 결과로 또는 자동화 공급자 패턴을 통해 잠재적으로 요청되는 동작이 있을 때마다 UI 응답이나 자동화 패턴에서 호출할 수 있는 단일 메서드를 제공합니다.Whenever you have a behavior that is potentially requested either as a result of typical interactions with a user who is working in the UI or through an automation provider pattern, provide a single method that either the UI response or the automation pattern can call. 예를 들어 컨트롤에 컨트롤을 확장 하거나 축소할 수 있는 유선 이벤트 처리기를 포함 하는 단추 파트가 있고 이러한 작업에 대해 키보드를 포함 하는 경우 이러한 이벤트 처리기는 피어의 IExpandCollapseProvider 에 대 한 확장 또는 축소 구현의 본문 내에서 호출 하는 것과 동일한 메서드를 호출 합니다.For example, if your control has button parts that have wired event handlers that can expand or collapse the control, and has keyboard equivalents for those actions, have these event handlers call the same method that you call from within the body of the Expand or Collapse implementations for IExpandCollapseProvider in the peer. 또한 공통 논리 메서드를 사용 하면 컨트롤의 시각적 상태가 동작의 호출 방식에 관계 없이 일관 된 방식으로 논리적 상태를 표시 하도록 업데이트 되도록 하는 데 유용할 수 있습니다.Using a common logic method can also be a useful way to make sure that your control's visual states are updated to show logical state in a uniform way, regardless of how the behavior was invoked.

일반적인 구현에서는 공급자 Api가 런타임에 컨트롤 인스턴스에 액세스 하기 위해 소유자 를 먼저 호출 합니다.A typical implementation is that the provider APIs first call Owner for access to the control instance at run time. 그런 다음 해당 개체에 대해 필요한 동작 메서드를 호출할 수 있습니다.Then the necessary behavior methods can be called on that object.

public class IndexCardAutomationPeer : FrameworkElementAutomationPeer, IExpandCollapseProvider {
    private IndexCard ownerIndexCard;
    public IndexCardAutomationPeer(IndexCard owner) : base(owner)
    {
         ownerIndexCard = owner;
    }
}

대체 구현에서는 컨트롤 자체에서 피어를 참조할 수 있습니다.An alternate implementation is that the control itself can reference its peer. 이는 RaiseAutomationEvent 메서드가 피어 메서드 이기 때문에 컨트롤에서 자동화 이벤트를 발생 시키는 경우 일반적인 패턴입니다.This is a common pattern if you are raising automation events from the control, because the RaiseAutomationEvent method is a peer method.

UI 자동화 이벤트UI Automation events

UI 자동화 이벤트는 다음 범주로 분류 됩니다.UI Automation events fall into the following categories.

이벤트Event 설명Description
속성 변경Property change UI 자동화 요소 또는 컨트롤 패턴의 속성이 변경 될 때 발생 합니다.Fires when a property on a UI Automation element or control pattern changes. 예를 들어 클라이언트가 응용 프로그램의 확인란 컨트롤을 모니터링 해야 하는 경우 ToggleState 속성의 속성 변경 이벤트를 수신 하도록 등록할 수 있습니다.For example, if a client needs to monitor an app's check box control, it can register to listen for a property change event on the ToggleState property. 확인란 컨트롤을 선택 하거나 선택 취소 하면 공급자가 이벤트를 발생 시키고 클라이언트가 필요에 따라 작동할 수 있습니다.When the check box control is checked or unchecked, the provider fires the event and the client can act as necessary.
요소 작업Element action 사용자 또는 프로그래밍 방식 작업에서 UI가 변경 되 면 발생 합니다. 예를 들어 호출 패턴을 통해 단추를 클릭 하거나 호출할 때입니다.Fires when a change in the UI results from user or programmatic activity; for example, when a button is clicked or invoked through the Invoke pattern.
구조 변경Structure change UI 자동화 트리의 구조가 변경 되 면 발생 합니다.Fires when the structure of the UI Automation tree changes. 새 UI 항목이 데스크톱에서 표시 되거나 숨겨지거나 제거 되 면 구조가 변경 됩니다.The structure changes when new UI items become visible, hidden, or removed on the desktop.
전역 변경Global change 클라이언트에 대해 전역적으로 관심이 있는 작업 (예: 포커스가 한 요소에서 다른 요소로 이동 하거나 자식 창이 닫히면)이 발생 하는 경우에 발생 합니다.Fires when actions of global interest to the client occur, such as when the focus shifts from one element to another, or when a child window closes. 일부 이벤트는 UI 상태가 변경된 것을 의미하지 않을 수도 있습니다.Some events do not necessarily mean that the state of the UI has changed. 예를 들어 사용자가 텍스트 입력 필드를 탭 한 다음 단추를 클릭 하 여 필드를 업데이트 하면 사용자가 실제로 텍스트를 변경 하지 않은 경우에도 TextChanged 이벤트가 발생 합니다.For example, if the user tabs to a text-entry field and then clicks a button to update the field, a TextChanged event fires even if the user did not actually change the text. 이벤트를 처리할 때 클라이언트 애플리케이션이 작업을 수행하기 전에 실제로 변경된 사항이 있는지 여부를 확인해야 할 수도 있습니다.When processing an event, it may be necessary for a client application to check whether anything has actually changed before taking action.

AutomationEvents 식별자AutomationEvents identifiers

UI 자동화 이벤트는 automationevents 값으로 식별 됩니다.UI Automation events are identified by AutomationEvents values. 열거형의 값은 이벤트의 종류를 고유 하 게 식별 합니다.The values of the enumeration uniquely identify the kind of event.

이벤트 발생Raising events

UI 자동화 클라이언트에서 자동화 이벤트를 구독할 수 있습니다.UI Automation clients can subscribe to automation events. 자동화 피어 모델에서 사용자 지정 컨트롤에 대 한 피어는 RaiseAutomationEvent 메서드를 호출 하 여 접근성과 관련 된 컨트롤 상태의 변경 내용을 보고 해야 합니다.In the automation peer model, peers for custom controls must report changes to control state that are relevant to accessibility by calling the RaiseAutomationEvent method. 마찬가지로, 키 UI 자동화 속성 값이 변경 되 면 사용자 지정 컨트롤 피어는 RaisePropertyChangedEvent 메서드를 호출 해야 합니다.Similarly, when a key UI Automation property value changes, custom control peers should call the RaisePropertyChangedEvent method.

다음 코드 예제에서는 컨트롤 정의 코드 내에서 피어 개체를 가져오고 메서드를 호출 하 여 해당 피어에서 이벤트를 발생 시키는 방법을 보여 줍니다.The next code example shows how to get the peer object from within the control definition code and call a method to fire an event from that peer. 최적화를 위해이 이벤트 유형에 대 한 수신기가 있는지 여부를 코드에서 결정 합니다.As an optimization, the code determines whether there are any listeners for this event type. 수신기가 있는 경우에만 이벤트를 실행 하 고 피어 개체를 만들어 불필요 한 오버 헤드를 방지 하 고 컨트롤의 응답성을 유지할 수 있습니다.Firing the event and creating the peer object only when there are listeners avoids unnecessary overhead and helps the control remain responsive.

if (AutomationPeer.ListenerExists(AutomationEvents.PropertyChanged))
{
    NumericUpDownAutomationPeer peer =
        FrameworkElementAutomationPeer.FromElement(nudCtrl) as NumericUpDownAutomationPeer;
    if (peer != null)
    {
        peer.RaisePropertyChangedEvent(
            RangeValuePatternIdentifiers.ValueProperty,
            (double)oldValue,
            (double)newValue);
    }
}

피어 탐색Peer navigation

자동화 피어를 찾은 후에는 UI 자동화 클라이언트에서 피어 개체의 Getchildrengetchildren 메서드를 호출 하 여 앱의 피어 구조를 탐색할 수 있습니다.After locating an automation peer, a UI Automation client can navigate the peer structure of an app by calling the peer object's GetChildren and GetParent methods. 컨트롤 내의 UI 요소 간 탐색은 피어의 GetChildrenCore 메서드 구현에서 지원 됩니다.Navigation among UI elements within a control is supported by the peer's implementation of the GetChildrenCore method. UI 자동화 시스템은이 메서드를 호출 하 여 컨트롤 내에 포함 된 하위 요소의 트리를 빌드합니다. 예를 들어 목록 상자에 항목을 나열 합니다.The UI Automation system calls this method to build up a tree of sub-elements contained within a control; for example, list items in a list box. FrameworkElementAutomationPeer 의 기본 GetChildrenCore 메서드는 요소의 시각적 트리를 순회 하 여 자동화 피어의 트리를 빌드합니다.The default GetChildrenCore method in FrameworkElementAutomationPeer traverses the visual tree of elements to build the tree of automation peers. 사용자 지정 컨트롤은이 메서드를 재정의 하 여 자식 요소의 다른 표현을 automation 클라이언트에 노출 하 고, 정보를 전달 하거나 사용자 상호 작용을 허용 하는 요소의 자동화 피어를 반환할 수 있습니다.Custom controls can override this method to expose a different representation of child elements to automation clients, returning the automation peers of elements that convey information or allow user interaction.

텍스트 패턴에 대 한 네이티브 자동화 지원Native automation support for text patterns

일부 기본 UWP 앱 자동화 피어는 텍스트 패턴 ( PatternInterface)에 대 한 컨트롤 패턴 지원을 제공 합니다.Some of the default UWP app automation peers provide control pattern support for the text pattern ( PatternInterface.Text). 그러나 이러한 메서드는 네이티브 메서드를 통해 이러한 지원을 제공 하며, 관련 된 피어는 관리 되는 상속의 Itextprovider 인터페이스를 확인 하지 않습니다.But they provide this support through native methods, and the peers involved won't note the ITextProvider interface in the (managed) inheritance. 그러나 관리 되거나 관리 되지 않는 UI 자동화 클라이언트에서 패턴에 대 한 피어를 쿼리하면 텍스트 패턴에 대 한 지원을 보고 하 고 클라이언트 Api가 호출 될 때 패턴의 일부에 대 한 동작을 제공 합니다.Still, if a managed or non-managed UI Automation client queries the peer for patterns, it will report support for the text pattern, and provide behavior for parts of the pattern when client APIs are called.

UWP 앱 텍스트 컨트롤 중 하나에서 파생 시키고 텍스트 관련 피어 중 하나에서 파생 되는 사용자 지정 피어를 만들려면 피어에 대 한 설명 섹션을 확인 하 여 패턴에 대 한 기본 수준 지원에 대해 자세히 알아보세요.If you intend to derive from one of the UWP app text controls and also create a custom peer that derives from one of the text-related peers, check the Remarks sections for the peer to learn more about any native-level support for patterns. 관리 되는 공급자 인터페이스 구현에서 기본 구현을 호출 하는 경우 사용자 지정 피어의 기본 기본 동작에 액세스할 수 있지만, 피어와 해당 소유자 컨트롤의 네이티브 인터페이스가 노출 되지 않기 때문에 기본 구현에서 수행 하는 작업을 수정 하는 것은 어렵습니다.You can access the native base behavior in your custom peer if you call the base implementation from your managed provider interface implementations, but it's difficult to modify what the base implementation does because the native interfaces on both the peer and its owner control aren't exposed. 일반적으로 기본 구현을 그대로 사용 하거나 (call base 전용) 기능을 자체 관리 코드로 완전히 바꾸고 기본 구현을 호출 하지 않아야 합니다.Generally you should either use the base implementations as-is (call base only) or completely replace the functionality with your own managed code and don't call the base implementation. 후자는 고급 시나리오 이므로 해당 프레임 워크를 사용할 때 내게 필요한 옵션 요구 사항을 지원 하기 위해 컨트롤에서 사용 하는 텍스트 서비스 프레임 워크에 대해 잘 알고 있어야 합니다.The latter is an advanced scenario, you'll need good familiarity with the text services framework being used by your control in order to support the accessibility requirements when using that framework.

AutomationProperties. AccessibilityViewAutomationProperties.AccessibilityView

사용자 지정 피어를 제공 하는 것 외에도 XAML에서 Automationproperties 를 설정 하 여 모든 컨트롤 인스턴스에 대 한 트리 뷰 표현을 조정할 수 있습니다.In addition to providing a custom peer, you can also adjust the tree view representation for any control instance, by setting AutomationProperties.AccessibilityView in XAML. 이는 피어 클래스의 일부로 구현 되지 않지만 사용자 지정 컨트롤 또는 사용자 지정 템플릿에 대 한 전반적인 접근성 지원에 germane 때문에 여기에 언급 합니다.This isn't implemented as part of a peer class, but we'll mention it here because it's germane to overall accessibility support either for custom controls or for templates you customize.

AccessibilityView를 사용 하는 주요 시나리오는 UI 자동화 뷰에서 템플릿의 특정 컨트롤을 의도적으로 생략 하는 것입니다 .이는 전체 컨트롤의 접근성 보기에 영향을 주지 않기 때문입니다 .The main scenario for using AutomationProperties.AccessibilityView is to deliberately omit certain controls in a template from the UI Automation views, because they don't meaningfully contribute to the accessibility view of the entire control. 이를 방지 하려면 Automationproperties 을 "Raw"로 설정 합니다.To prevent this, set AutomationProperties.AccessibilityView to "Raw".

자동화 피어에서 예외 throwThrowing exceptions from automation peers

자동화 피어 지원에 대해 구현 하는 Api는 예외를 throw 할 수 있습니다.The APIs that you are implementing for your automation peer support are permitted to throw exceptions. 대부분의 예외가 throw 된 후에도 계속 사용할 수 있는 모든 UI 자동화 클라이언트는 정상적으로 작동 합니다.It's expected any UI Automation clients that are listening are robust enough to continue on after most exceptions are thrown. 수신기가 자체 이외의 앱을 포함 하는 모든 자동화 트리를 살펴볼 가능성이 있으므로 클라이언트에서 Api를 호출할 때 트리의 한 영역에서 피어 기반 예외가 발생 했기 때문에 전체 클라이언트를 중단 하는 것은 불가능 한 클라이언트 디자인입니다.In all likelihood that listener is looking at an all-up automation tree that includes apps other than your own, and it's an unacceptable client design to bring down the entire client just because one area of the tree threw a peer-based exception when the client called its APIs.

피어로 전달 되는 매개 변수의 경우 입력의 유효성을 검사할 수 있으며, null 이 전달 되었고 구현에 유효한 값이 아닌 경우 argumentnullexception 을 throw 할 수 있습니다.For parameters that are passed in to your peer, it's acceptable to validate the input, and for example throw ArgumentNullException if it was passed null and that's not a valid value for your implementation. 그러나 피어에서 후속 작업을 수행 하는 경우 호스트 컨트롤과의 피어 상호 작용에는 비동기 문자가 포함 됩니다.However, if there are subsequent operations performed by your peer, remember that the peer's interactions with the hosting control have something of an asynchronous character to them. 피어가 컨트롤의 UI 스레드를 차단 하지 않아도 되는 것은 아닙니다.Anything a peer does won't necessarily block the UI thread in the control (and it probably shouldn't). 따라서 개체를 사용할 수 있거나, 피어가 만들어지거나 자동화 피어 메서드가 처음 호출 될 때 또는 컨트롤 상태가 변경 된 경우에는 특정 속성을 가진 상황이 발생할 수 있습니다.So you could have situations where an object was available or had certain properties when the peer was created or when an automation peer method was first called, but in the meantime the control state has changed. 이러한 경우에는 공급자가 throw 할 수 있는 두 가지 전용 예외가 있습니다.For these cases, there are two dedicated exceptions that a provider can throw:

  • API가 전달 된 원래 정보에 따라 피어의 소유자 또는 관련 피어 요소에 액세스할 수 없는 경우 Elementnot사용할 수 있는 예외를 Throw 합니다.Throw ElementNotAvailableException if you're unable to access either the peer's owner or a related peer element based on the original info your API was passed. 예를 들어 메서드를 실행 하려고 하지만 닫힌 모달 대화 상자와 같이 소유자가 UI에서 제거 된 후에는 피어가 있을 수 있습니다.For example, you might have a peer that's trying to run its methods but the owner has since been removed from the UI, such as a modal dialog that's been closed. Non-.NET client의 경우 UIA _ E _ elementnotavailable에 매핑됩니다.For a non-.NET client, this maps to UIA_E_ELEMENTNOTAVAILABLE.
  • 여전히 소유자 이지만 해당 소유자가 IsEnabledfalse와 같은 모드에 있는 경우에는 피어에서 system.windows.automation.elementnotenabledexception 에서 = false 수행 하려고 하는 특정 프로그래밍 변경 내용의 일부를 차단 하는 경우에 Throw 됩니다.Throw ElementNotEnabledException if there still is an owner, but that owner is in a mode such as IsEnabled=false that's blocking some of the specific programmatic changes that your peer is trying to accomplish. Non-.NET client의 경우 UIA _ E _ elementnotenabled에 매핑됩니다.For a non-.NET client, this maps to UIA_E_ELEMENTNOTENABLED.

이 외에 피어는 피어 지원에서 throw 되는 예외와 관련 하 여 상대적으로는 안 됩니다.Beyond this, peers should be relatively conservative regarding exceptions that they throw from their peer support. 대부분의 클라이언트는 피어의 예외를 처리 하 고 클라이언트와 상호 작용할 때 사용자가 수행할 수 있는 실행 가능한 선택 항목으로 전환할 수 없습니다.Most clients won't be able to handle exceptions from peers and turn these into actionable choices that their users can make when interacting with the client. 따라서 피어 구현 내에서 다시 throw 없는 경우에도 작동 하지 않고 예외를 catch 하는 것은 피어가 작동 하지 않는 항목이 발생할 때마다 예외를 throw 하는 것 보다 더 나은 전략입니다.So sometimes a no-op, and catching exceptions without rethrowing within your peer implementations, is a better strategy than is throwing exceptions every time something the peer tries to do doesn't work. 또한 대부분의 UI 자동화 클라이언트는 관리 코드로 작성 되지 않습니다.Consider also that most UI Automation clients aren't written in managed code. 대부분은 COM으로 작성 되며, 피어에 대 한 액세스를 종료 하는 UI 자동화 클라이언트 메서드를 호출할 때마다 HRESULT 에서 _ OK 를 확인 하는 것입니다.Most are written in COM and are just checking for S_OK in an HRESULT whenever they call a UI Automation client method that ends up accessing your peer.