코드의 리소스(WPF .NET)

이 개요에서는 XAML 구문이 아닌 코드를 사용하여 WPF (Windows Presentation Foundation) 리소스에 액세스 하거나 이 리소스를 만들 수 있는 방법을 중점적으로 설명합니다. 일반적인 리소스 사용법 및 XAML 구문 측면에서 본 리소스에 관한 자세한 내용은 XAML 리소스 개요를 참조하세요.

코드에서 리소스 액세스

XAML을 통해 정의된 리소스를 식별하는 키는 코드에서 리소스를 요청할 경우 특정 리소스를 검색하는 용도로도 사용됩니다. 코드에서 리소스를 검색하는 가장 간단한 방법은 사용 중인 애플리케이션의 프레임워크 수준 개체에서 FindResource 또는 TryFindResource 메서드를 호출하는 것입니다. 이러한 메서드 간의 동작 차이는 요청된 키를 찾을 수 없는 경우에 발생합니다. FindResource에서는 예외가 발생합니다. TryFindResource에서는 예외가 발생하지 않으며 null을 반환합니다. 각 메서드는 리소스 키를 입력 매개 변수로 사용하고 느슨하게 형식화된 개체를 반환합니다.

일반적으로 리소스 키는 문자열이지만, 문자열이 아닌 리소스 키를 사용하기도 합니다. 코드 리소스 확인을 위한 조회 논리는 동적 리소스 참조 XAML 사례와 동일합니다. 리소스 검색은 호출 요소에서 시작되며 논리 트리의 부모 요소를 통해 계속 실행됩니다. 조회는 애플리케이션 리소스, 테마 및 시스템 리소스(필요한 경우)로 계속 진행됩니다. 리소스에 대한 코드 요청은 런타임 중에 발생한 해당 리소스의 변경 내용을 적절하게 고려합니다.

다음 코드 예제에서는 키로 리소스를 찾고 반환된 값을 사용하여 속성을 설정하는 Click이벤트 처리기를 보여줍니다.

private void myButton_Click(object sender, RoutedEventArgs e)
{
    Button button = (Button)sender;
    button.Background = (Brush)this.FindResource("RainbowBrush");
}
Private Sub myButton_Click(sender As Object, e As RoutedEventArgs)
    Dim buttonControl = DirectCast(sender, Button)
    buttonControl.Background = DirectCast(Me.FindResource("RainbowBrush"), Brush)
End Sub

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

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

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

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

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

개체를 키로 사용

대부분의 리소스 사용에서는 리소스 키를 문자열로 설정합니다. 그러나 다양한 WPF 기능은 의도적으로 문자열 대신 개체 형식을 키로 사용합니다. 리소스에 개체 유형으로 키를 지정하는 기능은 WPF 스타일 및 테마 지정 지원에서 사용됩니다. 별도로 스타일이 지정되지 않은 컨트롤에 대해 기본 설정되는 스타일과 테마는 그것이 적용되어야 하는 컨트롤의 Type에 따라 각각 키가 지정됩니다.

형식에 따라 키를 지정하면 각 컨트롤 형식의 기본 인스턴스에서 작동하는 신뢰할 수 있는 조회 메커니즘이 제공됩니다. 파생된 형식에 기본 스타일이 없는 경우에도 해당 형식은 리플렉션을 통해 검색할 수 있으며 파생된 클래스의 스타일을 지정하는 데 사용할 수도 있습니다. x:Type 태그 확장을 사용하여 XAML에 정의된 리소스에 대한 Type 키를 지정할 수 있습니다. ComponentResourceKey 태그 확장과 같은 WPF 기능을 지원하는 문자열 이외의 기타 키 사용에 대해 비슷한 확장명이 있습니다.

자세한 내용은 스타일, DataTemplates 및 암시적 키를 참조하세요.

참고 항목