FrameworkElement.FindName 메서드

2013-12-13

지정된 식별자 이름이 있는 개체를 검색합니다.

Namespace:  System.Windows
어셈블리:  System.Windows(System.Windows.dll)

public Object FindName(
	string name
)

매개 변수

name
형식: System.String
요청된 개체의 이름입니다.

반환 값

형식: System.Object
요청된 개체입니다. 현재 XAML 이름 범위에 일치하는 개체가 없으면 null일 수 있습니다.

중요중요:

FindName 메서드를 효과적으로 사용하려면 XAML 이름 범위의 개념과 XAML 로드 시에 XAML 이름 범위가 만들어지고 런타임에 참조 및 수정되는 방법을 이해해야 합니다.

몇 가지 중요한 XAML 이름 범위 개념을 요약하면 다음과 같습니다.

  • FindName과 같은 런타임 API는 개체 트리에 대해 작업합니다. 이러한 개체는 CLR 런타임 엔진과 콘텐츠 영역에 로드됩니다. 개체 트리의 일부가 템플릿에서 만들어지거나 런타임 로드되는 XAML이면 XAML 이름 범위는 일반적으로 해당 개체 트리 전체에 연속적이지 않습니다. 따라서 지정된 FindName 호출에서 찾을 수 없는 명명된 개체가 개체 트리에 있을 수도 있습니다.

  • 일반적인 응용프로그램 시나리오에서 발생할 수 있는 XAML 이름 범위의 불연속성은 템플릿을 적용하여 개체를 만든 경우 또는 XamlReader.Load를 호출하여 개체를 만든 후 주 개체 트리에 추가한 경우에 나타납니다.

  • FindName에 대해 예기치 않은 null 결과를 반환하는 경우 원하는 명명된 개체를 찾을 수 있는 몇 가지 방법은 다음과 같습니다.

    • 템플릿에 있는 명명된 개체의 경우 컨트롤을 작성 중이면 템플릿이 적용되는 개체 범위에서 GetTemplateChild를 호출할 수 있습니다. Control의 보호된 메서드 때문에 GetTemplateChild를 사용하려면 파생 클래스 정의 범위 내에 있어야 합니다.

    • 파생 클래스 정의 범위에 있지 않은 경우 템플릿이 적용된 후 개체 수명의 한 시점에서 VisualTreeHelper를 사용하여 템플릿의 시각적 트리에 액세스할 수 있습니다. 그러나 VisualTreeHelper는 XAML 이름 범위 개념을 사용하는 대신 트리 탐색에 부모-자식 방법을 사용합니다. 트리 작업에는 일반적으로 주어진 템플릿에서 제공되는 컨트롤 컴퍼지션에 대한 특정 지식이 필요합니다.

    • XamlReader.Load의 경우 만든 관련 XAML 이름 범위의 소유자 또는 기초가 될 개체인 XamlReader.Load 호출의 반환 값 참조를 유지합니다. 그런 다음 해당 범위에서 FindName을 호출합니다.

FindName에서 반환한 개체가 반드시 FrameworkElement일 필요는 없습니다. 예를 들어 애니메이션 스토리보드에 이름을 지정할 수 있지만, 다양한 종류의 애니메이션 스토리보드가 모두 FrameworkElement에서 파생되는 것은 아닙니다.

개체 또는 동등한 x:Name XAML 지시문에 대한 Name 속성은 XAML 태그에서 개체 요소의 특성을 지정하여 할당됩니다. 초기 소스 XAML이 로드된 후 Name 값을 설정할 수 있지만 이 기술에는 몇 가지 제한 사항이 있습니다(Name의 설명 부분 참조). Load 호출에 대한 XAML 입력의 일부로 Name을 지정할 수 있습니다. 그러나 이렇게 생성된 이름은 제공된 XAML 입력에 해당하는 루트로만 확장되는 별개의 XAML 이름 범위에 저장됩니다. Load를 호출한 다음 생성된 개체를 주 개체 트리에 추가하는 경우 이 고려 사항은 FindName을 호출하는 방법 및 어떤 프로그래밍 범위에서 호출해야 하는지에 영향을 줍니다.

TextElement는 비슷한 FindName을 정의합니다. 따라서 FrameworkElement를 기반으로 하지 않는 Windows Phone 텍스트 개체 모델에서 FindName 동작이 가능합니다. FindName에 대한 두 가지 구현 중 하나를 사용하여 호출하면 FrameworkElement/텍스트 요소의 혼합 개체 트리로 이동하여 공통 XAML 이름 범위를 사용할 수 있습니다. 따라서 FrameworkElement.FindName 호출에서 명명된 텍스트 요소를 찾거나 그 반대로의 검색이 가능합니다.

런타임에 개체 트리에 추가되거나 변경된 Name 값은 개체 트리의 해당 수준에서 작동하는 XAML 이름 범위에 업데이트됩니다. 즉, 새 FrameworkElement를 만들고 Name을 지정한 다음 개체 트리에 추가하는 경우 해당 XAML 이름 범위 내에서 FindName을 호출하면 코드에서 만든 개체를 찾고 반환할 수 있습니다.

참고참고:

일반적으로 템플릿 기반 컨트롤은 FindName을 사용하는 대신 OnApplyTemplate 재정의의 일부로 GetTemplateChild를 사용하여 템플릿의 명명된 요소를 찾습니다. XAML 정의 템플릿의 클래스 논리와 요소 참조를 조인하려면 이 작업이 필요합니다.

다음 예제에서는 FindName을 사용하여 구성 요소로 방금 로드된 XAML 페이지에서 명명된 요소를 찾습니다. 이 경우 일반적으로 생성되는 InitializeComponent를 호출하지 않으면 해당 필드가 없기 때문에 명명된 요소를 필드 참조로 간단하게 참조할 수 없습니다.


private System.Windows.Controls.Grid LayoutRoot;

public Page()
{
    System.Windows.Application.LoadComponent(this, new System.Uri(
        "/WindowsPhoneApp1;component/Page.xaml", 
        System.UriKind.Relative));
    this.LayoutRoot = ((System.Windows.Controls.Grid)
        (this.FindName("LayoutRoot")));
}


Windows Phone 페이지에 대한 XAML 컴파일 빌드 작업에서 생성된 코드에서 InitializeComponent의 실제 정의를 검사하면 이와 유사한 코드를 확인할 수 있습니다. 각 명명된 요소에 대해 필드 참조 값을 할당하여 코드 숨김에서의 모든 런타임 호출이 이러한 필드 참조를 사용할 수 있게 만드는 연속된 FindName 호출을 확인합니다.

Windows Phone OS

지원되는 버전: 8.0, 7.1, 7.0

Windows Phone

표시:
© 2014 Microsoft