리소스 및 코드Resources and Code

이 개요에서는 XAML(Extensible Application Markup Language)Extensible Application Markup Language (XAML) 구문이 아닌 코드를 사용하여 WPF(Windows Presentation Foundation)Windows Presentation Foundation (WPF) 리소스를 만들거나 리소스에 액세스하는 방법을 중점적으로 설명합니다.This overview concentrates on how WPF(Windows Presentation Foundation)Windows Presentation Foundation (WPF) resources can be accessed or created using code rather than XAML(Extensible Application Markup Language)Extensible Application Markup Language (XAML) syntax. 일반적인 리소스 사용 및 XAMLXAML 구문 측면에서 본 리소스에 대한 자세한 내용은 XAML 리소스를 참조하세요.For more information on general resource usage and resources from a XAMLXAML syntax perspective, see XAML Resources.

코드에서 리소스 액세스Accessing Resources from Code

XAMLXAML를 통해 정의된 리소스를 식별하는 키는 코드에서 리소스를 요청할 경우 특정 리소스를 검색하는 데도 사용됩니다.The keys that identify resources if they are defined through XAMLXAML are also used to retrieve specific resources if you request the resource in code. 코드에서 리소스를 검색하는 가장 간단한 방법은 FindResource 응용 TryFindResource 프로그램의 프레임워크 수준 개체에서 또는 메서드를 호출하는 것입니다.The simplest way to retrieve a resource from code is to call either the FindResource or the TryFindResource method from framework-level objects in your application. 이러한 메서드 간의 동작 차이는 요청된 키를 찾을 수 없는 경우에 발생합니다.The behavioral difference between these methods is what happens if the requested key is not found. FindResource예외를 제기합니다. TryFindResource 예외를 발생시키지 않지만 null반환합니다.FindResource raises an exception; TryFindResource will not raise an exception but returns null. 각 메서드는 리소스 키를 입력 매개 변수로 사용하고 느슨하게 형식화된 개체를 반환합니다.Each method takes the resource key as an input parameter, and returns a loosely typed object. 일반적으로 리소스 키는 문자열이지만 문자열이 아닌 리소스 키가 사용되기도 합니다. 자세한 내용은 개체를 키로 사용 섹션을 참조하세요.Typically, a resource key is a string, but there are occasional nonstring usages; see the Using Objects as Keys section for details. 일반적으로 반환된 개체는 리소스를 요청할 때 설정할 속성에 필요한 형식으로 캐스트합니다.Typically you would cast the returned object to the type required by the property that you are setting when requesting the resource. 코드 리소스 확인에 대한 조회 논리는 동작 리소스 참조 XAMLXAML 사례와 같습니다.The lookup logic for code resource resolution is the same as the dynamic resource reference XAMLXAML case. 리소스 검색은 호출 요소에서 시작되고 논리 트리의 다음 부모 요소로 계속됩니다.The search for resources starts from the calling element, then continues to successive parent elements in the logical tree. 조회는 애플리케이션 리소스, 테마 및 시스템 리소스(필요한 경우)로 계속 진행됩니다.The lookup continues onwards into application resources, themes, and system resources if necessary. 리소스에 대한 코드 요청은 XAMLXAML에서 로드되는 리소스 사전 다음에 만들어졌을 수 있는 리소스 사전의 런타임 변경 내용 및 실시간 시스템 리소스 변경 내용을 제대로 처리합니다.A code request for a resource will properly account for runtime changes in resource dictionaries that might have been made subsequent to that resource dictionary being loaded from XAMLXAML, and also for realtime system resource changes.

다음은 키별로 리소스를 찾아 반환된 값을 사용하여 이벤트 처리기로 구현된 속성을 Click 설정하는 간단한 코드 예제입니다.The following is a brief code example that finds a resource by key and uses the returned value to set a property, implemented as a Click event handler.

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방법은 은입니다.An alternative method for assigning a resource reference is SetResourceReference. 이 메서드가 사용하는 두 개의 매개 변수는 리소스 키 및 리소스 값을 할당해야 하는 요소 인스턴스에 있는 특정 종속성 속성의 식별자입니다.This method takes two parameters: the key of the resource, and the identifier for a particular dependency property that is present on the element instance to which the resource value should be assigned. 기능적으로 이 메서드는 동일하고 반환 값을 캐스트할 필요가 없는 장점이 있습니다.Functionally, this method is the same and has the advantage of not requiring any casting of return values.

프로그래밍 방식으로 리소스에 액세스하는 또 다른 방법은 Resources 사전으로 속성의 내용에 액세스하는 것입니다.Still another way to access resources programmatically is to access the contents of the Resources property as a dictionary. 이 속성에 포함된 사전에 액세스하면 새 리소스를 기존 컬렉션에 추가하고, 특정 키 이름이 이미 컬렉션에 사용되는지 확인하는 작업과 같은 사전/컬렉션 작업을 수행할 수 있습니다.Accessing the dictionary contained by this property is also how you can add new resources to existing collections, check to see if a given key name is already taken in the collection, and other dictionary/collection operations. 코드에서 WPFWPF 응용 프로그램을 완전히 작성하는 경우 코드에서 전체 컬렉션을 만들고 키를 할당한 다음 완료된 컬렉션을 Resources 설정된 요소의 속성에 할당할 수도 있습니다.If you are writing a WPFWPF application entirely in code, you can also create the entire collection in code, assign keys to it, and then assign the finished collection to the Resources property of an established element. 이 내용은 다음 섹션에서 설명합니다.This will be described in the next section.

특정 키를 인덱스로 사용하여 지정된 Resources 컬렉션 내에서 인덱싱할 수 있지만 이러한 방식으로 리소스에 액세스하는 것은 리소스 확인의 일반적인 런타임 규칙을 따르지 않는다는 점에 유의해야 합니다.You can index within any given Resources collection, using a specific key as the index, but you should be aware that accessing the resource in this way does not follow the normal runtime rules of resource resolution. 해당 특정 컬렉션에만 액세스하게 됩니다.You are only accessing that particular collection. 리소스 조회는 요청된 키에서 유효한 개체를 찾을 수 없는 경우 애플리케이션 또는 루트 범위를 통과하지 않습니다.Resource lookup will not be traversing the scope to the root or the application if no valid object was found at the requested key. 하지만 키 검색 범위가 더 제한되므로 정확히 말하자면 어떤 경우에는 이 방법에 성능상 장점이 있을 수 있습니다.However, this approach may have performance advantages in some cases precisely because the scope of the search for the key is more constrained. 리소스 ResourceDictionary 사전을 직접 사용하여 작업하는 방법에 대한 자세한 내용은 클래스를 참조하십시오.See the ResourceDictionary class for more details on how to work with the resource dictionary directly.

코드를 사용하여 리소스 만들기Creating Resources with Code

코드에서 전체 WPFWPF 애플리케이션을 만들려면 코드에서 해당 애플리케이션의 모든 리소스를 만들어야 할 수도 있습니다.If you want to create an entire WPFWPF application in code, you might also want to create any resources in that application in code. 이를 위해 새 ResourceDictionary 인스턴스를 만든 다음 에 대한 연속 호출을 ResourceDictionary.Add사용하여 사전에 모든 리소스를 추가합니다.To achieve this, create a new ResourceDictionary instance, and then add all the resources to the dictionary using successive calls to ResourceDictionary.Add. 그런 다음 ResourceDictionary 이렇게 만든 을 Resources 사용하여 페이지 범위에 있는 요소 또는 에 Application.Resources있는 속성에 속성을 설정합니다.Then, use the ResourceDictionary thus created to set the Resources property on an element that is present in a page scope, or the Application.Resources. 요소에 추가하지 ResourceDictionary 않고 독립 실행형 개체로 유지할 수도 있습니다.You could also maintain the ResourceDictionary as a standalone object without adding it to an element. 하지만 이 작업을 수행할 경우 제네릭 사전인 것처럼 항목 키를 사용하여 인스턴스 내의 리소스에 액세스해야 합니다.However, if you do this, you must access the resources within it by item key, as if it were a generic dictionary. 요소 ResourceDictionary Resources 속성에 연결되지 않은 A는 요소 트리의 일부로 존재하지 않으며 관련 FindResource 메서드에서 사용할 수 있는 조회 시퀀스에 대한 범위가 없습니다.A ResourceDictionary that is not attached to an element Resources property would not exist as part of the element tree and has no scope in a lookup sequence that can be used by FindResource and related methods.

개체를 키로 사용Using Objects as Keys

대부분의 리소스 사용에서는 리소스 키를 문자열로 설정합니다.Most resource usages will set the key of the resource to be a string. 하지만 다양한 WPFWPF 기능은 키를 지정하는 데 의도적으로 문자열 형식을 사용하지 않습니다. 대신에 이 매개 변수는 개체입니다.However, various WPFWPF features deliberately do not use a string type to specify keys, instead this parameter is an object. 리소스에 개체로 키를 지정하는 기능은 WPFWPF 스타일 및 테마 지정 지원에서 사용됩니다.The capability of having the resource be keyed by an object is used by the WPFWPF style and theming support. 스타일이 아닌 Type 컨트롤의 기본 스타일이 되는 테마의 스타일은 각각 적용해야 하는 컨트롤의 키에 의해 키로 설정됩니다.The styles in themes which become the default style for an otherwise non-styled control are each keyed by the Type of the control that they should apply to. 형식으로 키가 지정되는 방법은 각 컨트롤 형식의 기본 인스턴스에 적용되는 안정적인 조회 메커니즘이고, 형식은 리플렉션을 통해 검색되고 파생 형식에 기본 스타일이 없더라도 파생 클래스의 스타일을 지정하는 데 사용될 수 있습니다.Being keyed by type provides a reliable lookup mechanism that works on default instances of each control type, and type can be detected by reflection and used for styling derived classes even though the derived type otherwise has no default style. Type x:Type 마크업 확장XAMLXAML 사용하여 정의된 리소스에 대한 키를 지정할 수 있습니다.You can specify a Type key for a resource defined in XAMLXAML by using the x:Type Markup Extension. ComponentResourceKey 태그 확장과 같은 WPFWPF 기능을 지원하는 기타 문자열이 아닌 키 사용에 대한 비슷한 확장이 있습니다.Similar extensions exist for other nonstring key usages that support WPFWPF features, such as ComponentResourceKey Markup Extension.

참고 항목See also