병합된 리소스 사전Merged Resource Dictionaries

WPF(Windows Presentation Foundation)Windows Presentation Foundation (WPF) 리소스에서는 병합된 리소스 사전 기능을 지원합니다.resources support a merged resource dictionary feature. 이 기능을 사용하면 WPFWPF 애플리케이션의 리소스 부분을 컴파일된 XAMLXAML 애플리케이션 외부에서 정의할 수 있습니다.This feature provides a way to define the resources portion of a WPFWPF application outside of the compiled XAMLXAML application. 그런 다음 리소스를 애플리케이션 간에 공유하고 지역화를 위해 더욱 간편하게 격리할 수도 있습니다.Resources can then be shared across applications and are also more conveniently isolated for localization.

병합된 리소스 사전 도입Introducing a Merged Resource Dictionary

태그에서 다음 구문을 사용하여 병합된 리소스 사전을 페이지에 도입할 수 있습니다.In markup, you use the following syntax to introduce a merged resource dictionary into a page:

<Page.Resources>
  <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
      <ResourceDictionary Source="myresourcedictionary.xaml"/>
      <ResourceDictionary Source="myresourcedictionary2.xaml"/>
    </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>
</Page.Resources>

ResourceDictionary 요소에는 일반적으로 리소스 컬렉션의 모든 항목에 필요한 X:Key 지시문이 없습니다.Note that the ResourceDictionary element does not have an x:Key Directive, which is generally required for all items in a resource collection. 그러나 MergedDictionaries 컬렉션 내의 또 다른 ResourceDictionary 참조는이 병합 된 리소스 사전 시나리오에 대해 예약 된 특별 한 사례입니다.But another ResourceDictionary reference within the MergedDictionaries collection is a special case, reserved for this merged resource dictionary scenario. 병합 된 리소스 사전을 소개 하는 ResourceDictionary에는 X:Key 지시문을 사용할 수 없습니다.The ResourceDictionary that introduces a merged resource dictionary cannot have an x:Key Directive. 일반적으로 MergedDictionaries 컬렉션 내의 각 ResourceDictionarySource 특성을 지정 합니다.Typically, each ResourceDictionary within the MergedDictionaries collection specifies a Source attribute. Source 값은 병합할 리소스 파일의 위치로 확인 되는 URI (uniform resource identifier) 여야 합니다.The value of Source should be a uniform resource identifier (URI) that resolves to the location of the resources file to be merged. 해당 URI의 대상은 루트 요소로 ResourceDictionary 있는 다른 XAMLXAML 파일 이어야 합니다.The destination of that URI must be another XAMLXAML file, with ResourceDictionary as its root element.

참고

Source를 지정 하는 대신 또는 지정 된 원본에서 포함 되는 리소스 외에도 병합 된 사전으로 지정 된 ResourceDictionary 내에서 리소스를 정의할 수 있습니다.It is legal to define resources within a ResourceDictionary that is specified as a merged dictionary, either as an alternative to specifying Source, or in addition to whatever resources are included from the specified source. 그러나 이는 일반적인 시나리오가 아닙니다. 병합된 사전의 기본 시나리오는 외부 파일 위치에서 리소스를 병합하는 것입니다.However, this is not a common scenario; the main scenario for merged dictionaries is to merge resources from external file locations. 페이지의 태그 내에 리소스를 지정 하려면 일반적으로 병합 된 사전이 아닌 기본 ResourceDictionary에 이러한 리소스를 정의 해야 합니다.If you want to specify resources within the markup for a page, you should typically define these in the main ResourceDictionary and not in the merged dictionaries.

병합된 사전 동작Merged Dictionary Behavior

병합된 사전의 리소스는 리소스 조회 범위에서 이 사전이 병합된 주 리소스 사전의 범위 바로 뒤에 있는 위치에 있습니다.Resources in a merged dictionary occupy a location in the resource lookup scope that is just after the scope of the main resource dictionary they are merged into. 개별 사전 내에서는 리소스 키가 고유해야 하지만 하나의 키가 병합된 사전 집합 내에서 여러 번 나올 수 있습니다.Although a resource key must be unique within any individual dictionary, a key can exist multiple times in a set of merged dictionaries. 이 경우 반환 되는 리소스는 MergedDictionaries 컬렉션에서 순차적으로 찾은 마지막 사전에서 제공 됩니다.In this case, the resource that is returned will come from the last dictionary found sequentially in the MergedDictionaries collection. MergedDictionaries 컬렉션이 XAMLXAML에 정의 된 경우 컬렉션에 있는 병합 된 사전의 순서는 태그에서 제공 되는 요소의 순서입니다.If the MergedDictionaries collection was defined in XAMLXAML, then the order of the merged dictionaries in the collection is the order of the elements as provided in the markup. 키를 기본 사전에서 정의하고 병합된 사전에서도 정의하는 경우 반환되는 리소스는 기본 사전에서 가져옵니다.If a key is defined in the primary dictionary and also in a dictionary that was merged, then the resource that is returned will come from the primary dictionary. 이러한 범위 지정 규칙은 정적 리소스 참조와 동적 리소스 참조 모두에 동일하게 적용됩니다.These scoping rules apply equally for both static resource references and dynamic resource references.

병합된 사전 및 코드Merged Dictionaries and Code

병합된 사전을 코드를 통해 Resources 사전에 추가할 수 있습니다.Merged dictionaries can be added to a Resources dictionary through code. 모든 Resources 속성에 대해 존재 하는 기본적으로 비어 있는 ResourceDictionary에는 기본적으로 비어 있는 MergedDictionaries 컬렉션 속성이 있습니다.The default, initially empty ResourceDictionary that exists for any Resources property also has a default, initially empty MergedDictionaries collection property. 코드를 통해 병합 된 사전을 추가 하려면 원하는 기본 ResourceDictionary에 대 한 참조를 가져오고, MergedDictionaries 속성 값을 가져오고, MergedDictionaries에 포함 된 제네릭 Collection Add를 호출 합니다.To add a merged dictionary through code, you obtain a reference to the desired primary ResourceDictionary, get its MergedDictionaries property value, and call Add on the generic Collection that is contained in MergedDictionaries. 추가 하는 개체는 새 ResourceDictionary 이어야 합니다.The object you add must be a new ResourceDictionary. 코드에서는 Source 속성을 설정 하지 않습니다.In code, you do not set the Source property. 대신 하나를 만들거나 로드 하 여 ResourceDictionary 개체를 가져와야 합니다.Instead, you must obtain a ResourceDictionary object by either creating one or loading one. 기존 ResourceDictionary를 로드 하 여 ResourceDictionary 루트가 있는 기존 XAMLXAML 파일 스트림에서 XamlReader.Load를 호출한 다음 XamlReader.Load 반환 값을 ResourceDictionary로 캐스팅 하는 한 가지 방법입니다.One way to load an existing ResourceDictionary to call XamlReader.Load on an existing XAMLXAML file stream that has a ResourceDictionary root, then casting the XamlReader.Load return value to ResourceDictionary.

병합된 리소스 사전 URIMerged Resource Dictionary URIs

사용할 URI (uniform resource identifier) 형식으로 표시 되는 병합 된 리소스 사전을 포함 하는 방법에 대 한 몇 가지 기술이 있습니다.There are several techniques for how to include a merged resource dictionary, which are indicated by the uniform resource identifier (URI) format that you will use. 대체로 이러한 기술은 프로젝트의 일부로 컴파일된 리소스와 프로젝트의 일부로 컴파일되지 않은 리소스의 두 가지 범주로 나눌 수 있습니다.Broadly speaking, these techniques can be divided into two categories: resources that are compiled as part of the project, and resources that are not compiled as part of the project.

프로젝트의 일부로 컴파일된 리소스의 경우 리소스 위치를 참조하는 상대 경로를 사용할 수 있습니다.For resources that are compiled as part of the project, you can use a relative path that refers to the resource location. 상대 경로는 컴파일하는 동안 평가됩니다.The relative path is evaluated during compilation. 리소스 빌드 작업을 통해 리소스를 프로젝트의 일부로 정의해야 합니다.Your resource must be defined as part of the project as a Resource build action. 리소스 .xaml 파일을 프로젝트에 리소스로 포함하는 경우 리소스 파일을 출력 디렉터리로 복사할 필요가 없습니다. 리소스가 컴파일된 애플리케이션 내에 이미 포함되어 있습니다.If you include a resource .xaml file in the project as Resource, you do not need to copy the resource file to the output directory, the resource is already included within the compiled application. 또한 콘텐츠 빌드 작업을 사용할 수도 있지만 이 경우 파일을 출력 디렉터리에 복사하는 것뿐만 아니라 실행 파일과의 동일한 경로 관계에 리소스 파일을 배포해야 합니다.You can also use Content build action, but you must then copy the files to the output directory and also deploy the resource files in the same path relationship to the executable.

참고

포함 리소스 빌드 작업은 사용하지 않습니다.Do not use the Embedded Resource build action. 빌드 작업 자체는 WPFWPF 응용 프로그램에 대해 지원 되지만 Source의 해상도는 ResourceManager를 통합 하지 않으므로 개별 리소스를 스트림에서 분리할 수 없습니다.The build action itself is supported for WPFWPF applications, but the resolution of Source does not incorporate ResourceManager, and thus cannot separate the individual resource out of the stream. 리소스에 액세스 하는 ResourceManager 사용 하는 경우에도 포함 리소스를 다른 용도로 사용할 수 있습니다.You could still use Embedded Resource for other purposes so long as you also used ResourceManager to access the resources.

관련 기술로는 XAMLXAML 파일에 대한 Pack URI를 소스로 참조하는 방법이 있습니다.A related technique is to use a Pack URI to a XAMLXAML file, and refer to it as Source. Pack URI를 사용하면 참조된 어셈블리 및 다른 기술의 구성 요소를 참조할 수 있습니다.Pack URI enables references to components of referenced assemblies and other techniques. Pack URI에 대한 자세한 내용은 WPF 애플리케이션 리소스, 콘텐츠 및 데이터 파일을 참조하세요.For more information on Pack URIs, see WPF Application Resource, Content, and Data Files.

프로젝트의 일부로 컴파일되지 않는 리소스의 경우 URI가 런타임에 평가됩니다.For resources that are not compiled as part of the project, the URI is evaluated at run time. file: 또는 http:와 같은 일반 URI 전송을 사용하여 리소스 파일을 참조할 수 있습니다.You can use a common URI transport such as file: or http: to refer to the resource file. 컴파일되지 않은 리소스 방법을 사용하는 경우 file: 액세스에 추가 배포 단계가 필요하고 http: 액세스에 인터넷 보안 영역이 수반된다는 단점이 있습니다.The disadvantage of using the noncompiled resource approach is that file: access requires additional deployment steps, and http: access implies the Internet security zone.

병합된 사전 다시 사용Reusing Merged Dictionaries

병합할 리소스 사전은 유효한 URI (uniform resource identifier)를 통해 참조할 수 있으므로 응용 프로그램 간에 병합 된 리소스 사전을 다시 사용 하거나 공유할 수 있습니다.You can reuse or share merged resource dictionaries between applications, because the resource dictionary to merge can be referenced through any valid uniform resource identifier (URI). 이렇게 하는 정확한 방법은 애플리케이션 배포 전략이나 사용하는 애플리케이션 모델에 따라 달라집니다.Exactly how you do this will depend on your application deployment strategy and which application model you follow. 앞서 설명한 Pack URI 전략에서는 배포하는 동안 어셈블리 참조를 공유하여 여러 프로젝트에서 병합된 리소스를 공통 소스로 지정할 수 있습니다.The aforementioned Pack URI strategy provides a way to commonly source a merged resource across multiple projects during development by sharing an assembly reference. 이 시나리오에서는 리소스가 계속 클라이언트별로 배포되며 하나 이상의 애플리케이션에서 참조된 어셈블리를 배포해야 합니다.In this scenario the resources are still distributed by the client, and at least one of the applications must deploy the referenced assembly. 또한 http 프로토콜을 사용하는 배포된 URI를 통해 병합된 리소스를 참조할 수도 있습니다.It is also possible to reference merged resources through a distributed URI that uses the http protocol.

병합된 사전을 로컬 애플리케이션 파일로 작성하거나 로컬 공유 스토리지에 기록하는 것도 병합된 사전/애플리케이션 배포의 사용 가능한 시나리오입니다.Writing merged dictionaries as local application files or to local shared storage is another possible merged dictionary / application deployment scenario.

지역화Localization

지역화해야 하는 리소스를 기본 사전에 병합된 사전으로 격리하고 XAMLXAML 사용 완화로 보관하는 경우 이러한 파일을 별도로 지역화할 수 있습니다.If resources that need to be localized are isolated to dictionaries that are merged into primary dictionaries, and kept as loose XAMLXAML, these files can be localized separately. 이 기술은 위성 리소스 어셈블리를 지역화하는 것에 비해 간단합니다.This technique is a lightweight alternative to localizing the satellite resource assemblies. 자세한 내용은 WPF 세계화 및 지역화 개요를 참조하세요.For details, see WPF Globalization and Localization Overview.

참조See also