ResourceDictionary 클래스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
앱에서 사용하는 스타일과 같은 XAML 리소스에 대한 리포지토리를 정의합니다. XAML에서 리소스를 정의한 다음 {StaticResource} 태그 확장 및 {ThemeResource} 태그 확장을 사용하여 XAML에서 리소스를 검색할 수 있습니다. 코드를 사용하여 리소스에 액세스할 수도 있지만 덜 일반적입니다.
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class ResourceDictionary : DependencyObject, IIterable<IKeyValuePair<IInspectable, IInspectable const&>>, IMap<IInspectable, IInspectable const&>
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public class ResourceDictionary : DependencyObject, IDictionary<object,object>, IEnumerable<KeyValuePair<object,object>>
Public Class ResourceDictionary
Inherits DependencyObject
Implements IDictionary(Of Object, Object), IEnumerable(Of KeyValuePair(Of Object, Object))
<ResourceDictionary>
oneOrMoreResources
</ResourceDictionary>
- or -
<frameworkElement>
<frameworkElement.Resources>
oneOrMoreResources
</frameworkElement.Resources>
</frameworkElement>
- 상속
- 파생
- 특성
- 구현
-
IDictionary<Object,Object> IMap<IInspectable,IInspectable> IIterable<IKeyValuePair<K,V>> IEnumerable<KeyValuePair<K,V>> IEnumerable<KeyValuePair<Object,Object>> IIterable<IKeyValuePair<IInspectable,IInspectable>>
Windows 요구 사항
디바이스 패밀리 |
Windows 10 (10.0.10240.0에서 도입되었습니다.)
|
API contract |
Windows.Foundation.UniversalApiContract (v1.0에서 도입되었습니다.)
|
설명
리소스 사전은 앱에서 사용하는 스타일과 같은 XAML 리소스에 대한 리포지토리입니다. XAML에서 리소스를 정의한 다음 {StaticResource} 태그 확장 및 {ThemeResource} 태그 확장을 사용하여 XAML에서 리소스를 검색할 수 있습니다. 코드를 사용하여 리소스에 액세스할 수도 있지만 덜 일반적입니다. 리소스를 사용하여 브러시 색 또는 픽셀 측정과 같은 특정 값이 앱 전체에서 일관되게 사용되도록 적용할 수 있습니다. 리소스 사전을 효과적으로 사용하는 방법에 대한 자세한 내용은 ResourceDictionary 및 XAML 리소스 참조를 참조하세요.
ResourceDictionary 요소 사용
ResourceDictionary 형식은 UWP 앱의 전체 구조에 중요한 두 속성 FrameworkElement.Resources 및 Application.Resources의 값으로 사용됩니다. 앱의 시작 프로젝트 템플릿에서 가져오는 XAML 파일은 FrameworkElement.Resources에 대한 초기 값으로 시작하고 app.xaml 파일은 Application.Resources에 대한 초기 값으로 시작할 수 있습니다. 정확히 어떤 리소스가 정의되어 있는지는 사용 중인 프로젝트 시작 템플릿에 따라 달라집니다.
이 XAML은 FrameworkElement.Resources 속성의 사용을 보여 줍니다. 이 경우 FrameworkElement 는 페이지입니다. Page.Resources 속성 요소에 종속된 ResourceDictionary 요소는 없지만 해당 존재는 암시적입니다. 자세한 내용은 아래의 "XAML 구문에 대한 참고 사항" 섹션을 참조하세요. XAML은 X:Key 특성 값이 "TextBlockStyle1"인 ResourceDictionary에 Style을 배치합니다. XAML의 아래쪽에서 {StaticResource} 태그 확장은 리소스 사전의 Style을 참조하여 TextBlock 요소의 Style 속성에 대한 값을 제공합니다.
표시된 스타일은 실제로 TextBlock에 스타일을 적용하지 않지만 Microsoft Visual Studio에서 Style 속성을 추가할 수 있습니다. 그런 다음 페이지에서 원하는 만큼 Style 리소스를 사용하여 균일성을 적용할 수 있습니다.
Microsoft Visual Studio를 사용하여 리소스 사전을 만들 수 있습니다. 이 예제는 디자인 화면에 TextBlock 을 놓고 마우스 오른쪽 단추를 클릭하고 스타일 편집/빈 만들기, "이 문서" 를 차례로 선택하여 Page.Resources에서 새 리소스를 정의합니다.
<Page
x:Class="ResourceDictionary_example.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:ResourceDictionary_example"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Page.Resources>
<Style x:Key="TextBlockStyle1" TargetType="TextBlock"/>
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<TextBlock Style="{StaticResource TextBlockStyle1}" Text="TextBlock"/>
</Grid>
</Page>
AtomPub 샘플의 AppPage.xaml 파일에서 이 XAML은 Application.Resources 속성의 사용을 보여 줍니다. XAML은 두 개의 Style 요소를 리소스 사전에 배치하여 애플리케이션 전체에서 사용할 수 있도록 합니다.
<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="AtomPub.App"
RequestedTheme="Light" >
<Application.Resources>
<ResourceDictionary>
<Style x:Key="TitleStyle" TargetType="TextBlock">
<Setter Property="Foreground" Value="#707070"/>
<Setter Property="FontFamily" Value="Segoe UI Light"/>
<Setter Property="FontSize" Value="16"/>
</Style>
<Style x:Key="H1Style" TargetType="TextBlock">
<Setter Property="Foreground" Value="#212121"/>
<Setter Property="FontFamily" Value="Segoe UI Semilight"/>
<Setter Property="FontSize" Value="26.667"/>
<Setter Property="Margin" Value="0,0,0,25"/>
</Style>
...
</ResourceDictionary>
</Application.Resources>
</Application>
MainPage.xaml 파일의 이 XAML은 {StaticResource} 태그 확장을 사용하여 TitleStyle 및 H1Style 스타일에 액세스합니다.
...
<!-- Header -->
<StackPanel x:Name="Header" Grid.Row="0">
<StackPanel Orientation="Horizontal">
...
<TextBlock Text="Windows SDK Samples" VerticalAlignment="Bottom" Style="{StaticResource TitleStyle}" TextWrapping="Wrap"/>
</StackPanel>
<TextBlock x:Name="FeatureName" Text="Add Feature Name" Style="{StaticResource H1Style}" TextWrapping="Wrap"/>
</StackPanel>
...
ResourceDictionary를 파일의 루트 요소로 사용하여 리소스를 자체 XAML 파일로 팩터리할 수 있습니다. 그런 다음 이러한 리소스를 FrameworkElement.Resources 또는 Application.Resources 리소스 사전에 포함할 수 있습니다. 이렇게 하려면 ResourceDictionary 요소의 ResourceDictionary.MergedDictionaries 속성 또는 ResourceDictionary.ThemeDictionaries 속성을 사용합니다.
Common/Styles1.xaml 파일은 ResourceDictionary를 루트 요소로 사용하여 스타일 리소스를 정의합니다.
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="TitleTextStyle" TargetType="TextBlock">
<Setter Property="FontFamily" Value="Segoe UI Light"/>
<Setter Property="FontSize" Value="16"/>
</Style>
<Style x:Key="HeaderTextStyle" TargetType="TextBlock">
<Setter Property="FontFamily" Value="Segoe UI Semilight"/>
<Setter Property="FontSize" Value="26.667"/>
<Setter Property="Margin" Value="0,0,0,25"/>
</Style>
...
</ResourceDictionary>
이제 스타일 리소스를 비슷하게 정의하는 다른 파일 Common/Styles2.xaml이 있다고 가정합니다. 이 XAML은 ResourceDictionary.MergedDictionaries 속성을 사용하여 두 파일의 리소스를 병합하여 Application.Resources 리소스 사전을 만드는 방법을 보여 줍니다. 또한 XAML은 두 개의 추가 Style 리소스를 정의하고 두 파일의 리소스와 병합합니다.
<Application
.... >
<Application.Resources>
<ResourceDictionary>
<Style x:Key="ErrorStyle" TargetType="TextBlock">
<Setter Property="Foreground" Value="DarkRed"/>
<Setter Property="FontFamily" Value="Segoe UI Semilight"/>
<Setter Property="FontSize" Value="15"/>
</Style>
<Style x:Key="StatusStyle" TargetType="TextBlock">
<Setter Property="Foreground" Value="Black"/>
<Setter Property="FontFamily" Value="Segoe UI Semilight"/>
<Setter Property="FontSize" Value="15"/>
</Style>
<ResourceDictionary.MergedDictionaries>
<!--
Styles that define common aspects of the platform look and feel
-->
<ResourceDictionary Source="Common/Styles1.xaml"/>
<ResourceDictionary Source="Common/Styles2.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
병합된 사전 리소스를 확인하는 방법에 대한 자세한 내용은 ResourceDictionary 및 XAML 리소스 참조의 "병합된 리소스 사전" 섹션을 참조하세요.
x:Key 속성
XAML에서 ResourceDictionaryitems의 키는 XAML 리소스를 나타내는 요소에서 x:Key 특성을설정하여 선언됩니다. 일반적으로 키 값이 없는 자식 요소를 ResourceDictionary에 넣으려고 하면 XAML 구문 분석 예외 또는 Windows Runtimeexception이 throw됩니다. 예외 조건은 XAML 디자인 화면에서 경고로 표시될 수도 있습니다. 그러나 ResourceDictionarychild 요소에 x:Key 특성값이 필요하지 않은 세 가지 주목할 만한 경우가 있습니다.
- Style 리소스는 TargetType 값을 암시적 리소스 키로 사용할 수 있습니다. 스타일 및 컨트롤 템플릿의 암시적 키가 작동하는 방식에 대한 자세한 내용은 컨트롤 스타일 지정을 참조하세요.
- ResourceDictionary.MergedDictionaries 값을 나타내는 원본 값이 있는 ResourceDictionary 요소는 ResourceDictionary에 x:Key 특성을 가질 수 없습니다. 병합된 각 사전 파일 내에서(URI에서 원본으로 참조하는 사전 파일) 각 리소스에 대한 키가 필요합니다.
- 레거시 이유로 x:Key 특성 대신 x:Name 특성을 사용할 수 있습니다. 그러나 x:Name 특성 자체는 해당 항목의 XAML 리소스 조회를 사용하도록 설정하지 않습니다. x:Name 특성 식별 규칙은 스토리보드 애니메이션 정의와 같은 특정 시나리오에 사용됩니다. 자세한 내용은 x:Name 특성을 참조하세요.
ResourceDictionary를 반복하는 중
C# 또는 Microsoft Visual Basic에서 ResourceDictionary를 반복할 수 있습니다. foreach 구문 사용과 같은 대부분의 경우 컴파일러는 이 캐스팅을 수행하므로 명시적으로 캐스팅 IEnumerable
할 필요가 없습니다. GetEnumerator를 호출하려는 경우와 같이 명시적으로 캐스팅해야 하는 경우 KeyValuePair<개체, 개체> 제약 조건을 사용하여 IEnumerable<T>로 캐스팅합니다.
ResourceDictionary 및 Microsoft Visual Studio
Microsoft Visual Studio는 리소스 사전에 대한 새 항목 추가 페이지 선택을 제공합니다. 새 느슨한 XAML 리소스 사전을 정의하려는 경우(예: 병합된 사전의 원본으로 사용) 이 옵션을 사용합니다. 또한 새 항목 추가 를 사용하여 템플릿 컨트롤을 만들 때마다 Microsoft Visual Studio에서 느슨한 XAML 리소스 사전을 프로젝트에 추가합니다. 이 리소스 사전은 기본 테마 템플릿을 제공합니다. 스타일 또는 템플릿의 복사본을 편집하고 선택한 리소스 위치(앱, 페이지 또는 독립 실행형)에 대한 ResourceDictionary가 아직 없는 경우 Microsoft Visual Studio에서 XAML에 새 ResourceDictionary를 만들 수 있습니다.
XAML 구문에 대한 참고 사항
ResourceDictionary에 대한 XAML 암시적 컬렉션 구문에는 ResourceDictionary에 대한 개체 요소가 포함되지 않습니다. XAML 암시적 컬렉션 구문의 예입니다. 컬렉션 요소를 나타내는 태그를 생략할 수 있습니다. 컬렉션에 항목으로 추가되는 요소는 기본 형식이 사전/map Add 메서드를 지원하는 속성의 속성 요소에 대한 자식 요소로 지정됩니다.
병합된 리소스 사전의 경우 ResourceDictionary.MergedDictionaries 속성 요소 및 Source를 선언할 수 있도록 ResourceDictionary 개체 요소를 명시적으로 선언해야 합니다. 따라서 최소 두 개의 ResourceDictionary 개체 요소가 관련되어 있으며 이 구문을 사용합니다.
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="uri"/>
...
</ResourceDictionary.MergedDictionaries>
...
</ResourceDictionary>
이 구문에서 외부 ResourceDictionary는 기본 ResourceDictionary입니다. 내부 ResourceDictionary는 병합되는 ResourceDictionary입니다.
암시적 컬렉션 사용의 경우 FrameworkElement.Resources 속성에 적합한 자리 표시자가 표시됩니다. Application.Resources 속성 또는 ResourceDictionary를 속성 형식으로 사용하는 사용자 지정 속성에 대해 이 암시적 컬렉션 사용을 사용할 수도 있습니다.
공유 가능한 형식 및 UIElement 형식
리소스 사전은 XAML에서 이러한 형식의 공유 가능한 형식 및 값을 정의하는 기술입니다. 모든 형식 또는 값이 ResourceDictionary의 사용에 적합한 것은 아닙니다. 공유가 지원되는 형식의 예로는 Style, FrameworkTemplate 하위 클래스, XAML 내장 데이터 형식, 브러시, 색 및 변환이 있습니다. 공유할 수 있는 형식에 대한 자세한 내용은 ResourceDictionary 및 XAML 리소스 참조를 참조하세요. 일반적으로 UIElement 파생 형식은 특정 컨트롤 instance 템플릿 및 템플릿의 애플리케이션에서 제공되지 않는 한 공유할 수 없습니다. 템플릿 사례를 제외하면 UIElement 는 인스턴스화된 후 개체 트리의 한 곳에만 존재해야 하며 UIElement 를 공유할 수 있으면 이 원칙을 위반할 수 있습니다.
실제로 ResourceDictionary에 정의된 대부분의 리소스는 다음 중 하나입니다.
- 시각적 상태를 포함하여 컨트롤에 대한 컨트롤 템플릿입니다.
- 컨트롤의 일부에 대한 스타일 지원
- 일반적인 앱 UI의 일부이지만 TextBlock과 같이 컨트롤이 아닌 요소의 스타일
- 데이터 바인딩을 사용하는 컨트롤 및 패널에 대한 데이터 템플릿
- 특정 브러시 값( 주로 SolidColorBrush)
- 지역화할 필요가 없는 문자열 또는 기타 상수(지역화해야 하는 문자열 및 상수는 ResourceDictionary에 있으면 안 됩니다. 자세한 내용은 빠른 시작: UI 리소스 번역을 참조하세요.)
코드에서 ResourceDictionary 개체에 액세스
코드에서 ResourceDictionary의 리소스에 액세스하는 데 사용하는 API는 사용하는 프로그래밍 언어에 따라 달라집니다.
- C# 또는 Microsoft Visual Basic의 경우 IDictionary<TKey, TValue> 및 IEnumerable T>를 구현하는<API를 사용합니다. 예를 들어 TryGetValue 또는 항목 인덱서입니다.
- Visual C++ 구성 요소 확장(C++/CX)의 경우 IMap<K, V> 및 IIterable을 구현하는 API를 사용합니다. 예를 들어 조회입니다.
- 원본과 같은 컬렉션 지원의 일부가 아닌 API는 모든 언어에서 동일합니다.
코드에서 ResourceDictionary를 사용하는 방법에 대한 자세한 내용은 ResourceDictionary 및 XAML 리소스 참조의 "코드에서 ResourceDictionary 사용" 섹션을 참조하세요.
시스템 리소스
일부 테마 리소스는 기본 하위 값으로 시스템 리소스 값을 참조합니다. 시스템 리소스는 XAML 리소스 사전에서 찾을 수 없는 특수 리소스 값입니다. 이 값은 Windows 런타임 XAML 지원에서 시스템 자체의 값을 전달하는 동작에 따라 결정되며 XAML 리소스가 참조할 수 있는 형태로 값이 표현됩니다.
이전 버전에 대한 참고 사항
Windows 8.1 리소스 로드 최적화
Windows 8.1 시작하여 앱 모델 및 Windows 런타임 XAML 파서에서 사용하도록 설정된 리소스 로드 최적화가 있습니다. Windows 8 경우 XAML 파서는 app.xaml에서 리소스를 로드하고 각 리소스를 시작의 일부로 개체로 만들었습니다. 거기에 큰 사전이 있다면 그것은 매우 효율적이지 않았습니다. 또한 이러한 리소스에는 세 가지 테마 모두에 필요한 항목이 포함되었으며, 세 가지 테마 중 두 가지는 활성화되지 않습니다. Windows 8.1 시작해서 XAML 파서는 특별히 요청된 경우에만 리소스를 만듭니다. 요청은 각각 로드될 때 다른 리소스 또는 앱 또는 페이지 XAML에서 올 수 있습니다. 이 파서 동작은 시작 시 앱 수준 사전을 읽는 데 걸리는 시간을 최소화하고 대부분의 경우 첫 번째 앱 페이지가 더 빠르게 로드되도록 합니다. 다른 현재 비활성 테마에 필요한 리소스는 해당 테마가 사용자가 활성 테마가 되도록 선택한 경우에만 로드됩니다. 이때 요청에 {ThemeResource} 태그 확장 이 사용된 리소스는 새로 활성화된 테마에 따라 다시 계산됩니다.
Windows 8 동작
Windows 8 위에서 설명한 최적화가 없습니다. 에 대한 Application.Resources
ResourceDictionary는 시작 화면 이외의 페이지가 앱의 창에 로드되기 전에 구문 분석을 완료해야 했습니다. 이 때문에 Windows 8.1 대한 앱의 대상을 다시 지정할 때 타이밍에 몇 가지 차이점이 표시될 수 있습니다. 앱이 더 빠르게 로드되어야 하지만, 대상 변경의 일부로 앱 코드에 적용한 다른 변경 내용과 비교해도 이러한 개선 사항을 격리할 수 없습니다. 최적화된 리소스 로드로 인해 타이밍 변경의 증거가 표시될 수 있는 위치 중 일부는 Application 개체, 변환기 또는 기타 사용자 지정 클래스와 같은 개체에 대해 파서에서 생성자를 호출하는 경우를 포함합니다. Windows 8용으로 컴파일되었지만 Windows 8.1에서 실행하는 앱은 Windows 8 동작을 계속 사용합니다.
성능 및 XAML 리소스 팩터링에 대한 자세한 내용은 XAML 태그 최적화를 참조하세요.
생성자
ResourceDictionary() |
ResourceDictionary 클래스의 새 instance 초기화합니다. |
속성
Dispatcher |
이 개체가 연결된 CoreDispatcher 를 가져옵니다. CoreDispatcher는 코드가 비 UI 스레드에서 시작된 경우에도 UI 스레드에서 DependencyObject에 액세스할 수 있는 기능을 나타냅니다. (다음에서 상속됨 DependencyObject) |
MergedDictionaries |
병합된 사전의 다양한 리소스 사전을 구성하는 ResourceDictionary 사전의 컬렉션을 가져옵니다. |
Size |
컬렉션에 포함된 요소 수를 가져옵니다. |
Source |
병합된 리소스 사전의 원본 위치를 제공하는 URI(Uniform Resource Identifier)를 가져오거나 설정합니다. |
ThemeDictionaries |
테마 시나리오를 해결하기 위해 특별히 키 지정되고 구성된 병합된 리소스 사전의 컬렉션을 가져옵니다(예: "HighContrast"에 대한 테마 값 제공). |