리소스 및 코드

이 개요에서는 XAML(Extensible Application Markup Language) 구문이 아닌 코드를 사용하여 WPF(Windows Presentation Foundation) 리소스에 액세스하거나 만드는 방법에 중점을 둡니다. 일반적인 리소스 사용 및 XAML 구문 측면에서 본 리소스에 대한 자세한 내용은 XAML 리소스를 참조하세요.

코드에서 리소스 액세스

XAML을 통해 정의된 리소스를 식별하는 키는 코드에서 리소스를 요청할 경우 특정 리소스를 검색하는 데도 사용됩니다. 코드에서 리소스를 검색하는 가장 간단한 방법은 사용 중인 애플리케이션의 프레임워크 수준 개체에서 FindResource 또는 TryFindResource 메서드를 호출하는 것입니다. 이러한 메서드 간의 동작 차이는 요청된 키를 찾을 수 없는 경우에 발생합니다. FindResource는 예외를 발생시킵니다. TryFindResource는 예외를 발생시키지 않지만 null을 반환합니다. 각 메서드는 리소스 키를 입력 매개 변수로 사용하고 느슨하게 형식화된 개체를 반환합니다. 일반적으로 리소스 키는 문자열이지만 문자열이 아닌 리소스 키가 사용되기도 합니다. 자세한 내용은 개체를 키로 사용 섹션을 참조하세요. 일반적으로 반환된 개체는 리소스를 요청할 때 설정할 속성에 필요한 형식으로 캐스트합니다. 코드 리소스 확인을 위한 조회 논리는 동적 리소스 참조 XAML 사례와 동일합니다. 리소스 검색은 호출 요소에서 시작되고 논리 트리의 다음 부모 요소로 계속됩니다. 조회는 애플리케이션 리소스, 테마 및 시스템 리소스(필요한 경우)로 계속 진행됩니다. 리소스에 대한 코드 요청은 XAML에서 로드되는 리소스 사전 다음에 만들어졌을 수 있는 리소스 사전의 런타임 변경 내용 및 실시간 시스템 리소스 변경 내용을 제대로 처리합니다.

다음은 키로 리소스를 찾고 반환된 값을 사용하여 Click 이벤트 처리기로 구현된 속성을 설정하는 간단한 코드 예제입니다.

void SetBGByResource(object sender, RoutedEventArgs e)
{
  Button b = sender as Button;
  b.Background = (Brush)this.FindResource("RainbowBrush");
}
Private Sub SetBGByResource(ByVal sender As Object, ByVal e As RoutedEventArgs)
  Dim b As Button = TryCast(sender, Button)
  b.Background = CType(Me.FindResource("RainbowBrush"), Brush)
End Sub

리소스 참조를 할당하는 또 다른 방법은 SetResourceReference입니다. 이 메서드가 사용하는 두 개의 매개 변수는 리소스 키 및 리소스 값을 할당해야 하는 요소 인스턴스에 있는 특정 종속성 속성의 식별자입니다. 기능적으로 이 메서드는 동일하고 반환 값을 캐스트할 필요가 없는 장점이 있습니다.

리소스에 프로그래밍 방식으로 액세스하는 또 다른 방법은 Resources 속성의 콘텐츠(사전)에 액세스하는 것입니다. 이 속성에 포함된 사전에 액세스하면 새 리소스를 기존 컬렉션에 추가하고, 특정 키 이름이 이미 컬렉션에 사용되는지 확인하는 작업과 같은 사전/컬렉션 작업을 수행할 수 있습니다. WPF 애플리케이션을 완전히 코드로 작성할 경우 코드의 전체 컬렉션을 만들고, 컬렉션에 키를 할당하고, 설정된 요소의 Resources 속성에 완성된 컬렉션을 할당합니다. 이 내용은 다음 섹션에서 설명합니다.

특정 키를 인덱스로 사용하여 지정된 Resources 컬렉션 내에서 인덱싱할 수 있지만 이 방법으로 리소스에 액세스하면 리소스 확인에 대한 일반 런타임 규칙이 준수되지 않는다는 점에 유의해야 합니다. 해당 특정 컬렉션에만 액세스하게 됩니다. 리소스 조회는 요청된 키에서 유효한 개체를 찾을 수 없는 경우 애플리케이션 또는 루트 범위를 통과하지 않습니다. 하지만 키 검색 범위가 더 제한되므로 정확히 말하자면 어떤 경우에는 이 방법에 성능상 장점이 있을 수 있습니다. 리소스 사전을 직접 사용하는 방법에 대한 자세한 내용은 ResourceDictionary 클래스를 참조하세요.

코드를 사용하여 리소스 만들기

코드에서 전체 WPF 애플리케이션을 만들려면 코드에서 해당 애플리케이션의 모든 리소스를 만들어야 할 수도 있습니다. 이를 위해 새 ResourceDictionary 인스턴스를 만든 다음 ResourceDictionary.Add에 대한 후속 호출을 사용하여 모든 리소스를 사전에 추가합니다. 그런 다음 생성된 ResourceDictionary를 사용하여 페이지 범위 또는 Application.Resources에 있는 요소의 Resources 속성을 설정합니다. ResourceDictionary를 하나의 요소에 추가하지 않고 독립 실행형 개체로 유지 관리할 수도 있습니다. 하지만 이 작업을 수행할 경우 제네릭 사전인 것처럼 항목 키를 사용하여 인스턴스 내의 리소스에 액세스해야 합니다. Resources 요소 속성에 연결되지 않은 ResourceDictionary는 요소 트리의 일부로 존재하지 않으며 FindResource 및 관련 메서드에서 사용할 수 있는 조회 시퀀스의 범위가 없습니다.

개체를 키로 사용

대부분의 리소스 사용에서는 리소스 키를 문자열로 설정합니다. 하지만 다양한 WPF 기능은 키를 지정하는 데 의도적으로 문자열 형식을 사용하지 않습니다. 대신에 이 매개 변수는 개체입니다. 리소스에 개체로 키를 지정하는 기능은 WPF 스타일 및 테마 지정 지원에서 사용됩니다. 별도로 스타일이 지정되지 않은 컨트롤의 기본 스타일이 되는 테마의 스타일은 각각 스타일이 적용되어야 하는 컨트롤의 Type으로 키가 지정됩니다. 형식으로 키가 지정되는 방법은 각 컨트롤 형식의 기본 인스턴스에 적용되는 안정적인 조회 메커니즘이고, 형식은 리플렉션을 통해 검색되고 파생 형식에 기본 스타일이 없더라도 파생 클래스의 스타일을 지정하는 데 사용될 수 있습니다. x:Type 태그 확장을 사용하여 XAML에 정의된 리소스에 대한 Type 키를 지정할 수 있습니다. ComponentResourceKey 태그 확장과 같은 WPF 기능을 지원하는 문자열 이외의 기타 키 사용에 대해 비슷한 확장명이 있습니다.

참고 항목