다음을 통해 공유


ResourceDictionary 클래스

정의

앱에서 사용하는 스타일과 같은 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>
상속
Object IInspectable DependencyObject ResourceDictionary
파생
특성
구현

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.ResourcesApplication.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} 태그 확장을 사용하여 TitleStyleH1Style 스타일에 액세스합니다.

...
<!-- 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 특성값이 필요하지 않은 세 가지 주목할 만한 경우가 있습니다.

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는 사용하는 프로그래밍 언어에 따라 달라집니다.

코드에서 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"에 대한 테마 값 제공).

메서드

Clear()

ResourceDictionary에서 모든 항목을 제거합니다.

ClearValue(DependencyProperty)

종속성 속성의 로컬 값을 지웁니다.

(다음에서 상속됨 DependencyObject)
First()

컬렉션의 항목에 대한 반복기를 반환합니다.

GetAnimationBaseValue(DependencyProperty)

애니메이션이 활성화되지 않은 경우 적용되는 종속성 속성에 대해 설정된 모든 기본 값을 반환합니다.

(다음에서 상속됨 DependencyObject)
GetValue(DependencyProperty)

DependencyObject에서 종속성 속성의 현재 유효 값을 반환합니다.

(다음에서 상속됨 DependencyObject)
GetView()

ResourceDictionary에 대한 뷰를 검색합니다.

HasKey(Object)

ResourceDictionary에 요청된 키가 있는 항목이 있는지 여부를 반환합니다.

Insert(Object, Object)

ResourceDictionary에 새 항목을 추가합니다.

Lookup(Object)

해당 키가 있는 항목이 있는 경우 요청된 키의 값을 반환합니다.

ReadLocalValue(DependencyProperty)

로컬 값이 설정된 경우 종속성 속성의 로컬 값을 반환합니다.

(다음에서 상속됨 DependencyObject)
RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback)

DependencyObject instance 특정 DependencyProperty의 변경 내용을 수신 대기하기 위한 알림 함수를 등록합니다.

(다음에서 상속됨 DependencyObject)
Remove(Object)

ResourceDictionary에서 특정 항목을 제거합니다.

SetValue(DependencyProperty, Object)

DependencyObject에서 종속성 속성의 로컬 값을 설정합니다.

(다음에서 상속됨 DependencyObject)
UnregisterPropertyChangedCallback(DependencyProperty, Int64)

RegisterPropertyChangedCallback을 호출하여 이전에 등록된 변경 알림을 취소합니다.

(다음에서 상속됨 DependencyObject)

적용 대상

추가 정보