다음을 통해 공유


ResourceDictionary 클래스

정의

앱에서 사용하는 스타일과 같은 XAML 리소스에 대한 리포지토리를 정의합니다. XAML에서 리소스를 정의한 다음 { StaticResource} 태그 확장 및 {ThemeResource} 태그 확장을 사용하여 XAML에서 리소스 검색할 수 있습니다. 코드를 사용하여 리소스에 액세스할 수도 있지만 덜 일반적입니다.

/// [Windows.Foundation.Metadata.ContractVersion(Microsoft.UI.Xaml.WinUIContract, 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(Microsoft.UI.Xaml.WinUIContract), 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
파생
특성
구현

설명

리소스 사전은 앱에서 사용하는 스타일과 같은 XAML 리소스에 대한 리포지토리입니다. XAML에서 리소스를 정의한 다음 {StaticResource} 태그 확장 및 {ThemeResource} 태그 확장을 사용하여 XAML에서 리소스를 검색할 수 있습니다. 코드를 사용하여 리소스에 액세스할 수도 있지만 덜 일반적입니다. 리소스를 사용하여 브러시 색 또는 픽셀 측정과 같은 특정 값이 앱 전체에서 일관되게 사용되도록 적용할 수 있습니다. 리소스 사전을 효과적으로 사용하는 방법에 대한 자세한 내용은 ResourceDictionary 및 XAML 리소스 참조를 참조하세요.

ResourceDictionary 요소 사용

형식은 ResourceDictionary Windows 앱 SDK 앱의 전체 구조에 중요한 두 속성 FrameworkElement.ResourcesApplication.Resources의 값으로 사용됩니다. 앱의 시작 프로젝트 템플릿에서 가져오는 XAML 파일은 FrameworkElement.Resources에 대한 초기 값으로 시작하고 app.xaml 파일은 Application.Resources에 대한 초기 값으로 시작할 수 있습니다. 정확히 어떤 리소스가 정의되어 있는지는 사용 중인 프로젝트 시작 템플릿에 따라 달라집니다.

이 XAML은 FrameworkElement.Resources 속성의 사용을 보여 줍니다. 이 경우 FrameworkElement페이지입니다. 속성 요소에 Page.Resources 종속된 요소는 없지만 ResourceDictionary 해당 존재는 암시되어 있습니다. 자세한 내용은 아래의 "XAML 구문에 대한 참고 사항" 섹션을 참조하세요. XAML은 X:Key 특성 값이 ResourceDictionary "TextBlockStyle1"인 에 Style을 배치합니다. XAML의 아래쪽에서 {StaticResource} 태그 확장은 리소스 사전의 를 참조 Style 하여 TextBlock 요소의 Style 속성에 대한 값을 제공합니다.

표시된 스타일은 실제로 TextBlock에 스타일을 적용하지 않지만 Microsoft Visual Studio에서 속성을 추가할 Style 수 있습니다. 그런 다음 페이지에서 원하는 만큼 리소스를 사용하여 Style 균일성을 적용할 수 있습니다.

<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에서 항목의 ResourceDictionary 키는 XAML 리소스를 나타내는 요소에서 x:Key 특성을설정하여 선언됩니다. 일반적으로 키 값이 없는 자식 요소를 에 ResourceDictionary넣으려고 하면 XAML 구문 분석 예외 또는 Windows 런타임 예외가 throw됩니다. 예외 조건은 XAML 디자인 화면에서 경고로 표시될 수도 있습니다. 그러나 자식 요소에 x:Key 특성 값이 필요하지 않은 세 가지 주목할 만한 경우가 ResourceDictionary 있습니다.

ResourceDictionary를 반복하는 중

C#에서 를 ResourceDictionary 반복할 수 있습니다. 구문 사용 foreach 과 같은 대부분의 경우 컴파일러는 이 캐스팅을 수행하므로 명시적으로 캐스팅 IEnumerable 할 필요가 없습니다. 예를 들어 GetEnumerator를 호출하려는 경우 명시적으로 캐스팅해야 하는 경우 제약 조건을 사용하여 IEnumerableKeyValuePair<Object,Object> 캐스팅합니다.

ResourceDictionary 및 Microsoft Visual Studio

Microsoft Visual Studio는 리소스 사전에 대한 새 항목 추가 페이지 선택을 제공합니다. 새 느슨한 XAML 리소스 사전을 정의하려는 경우(예: 병합된 사전의 원본으로 사용) 이 옵션을 사용합니다. 또한 새 항목 추가 를 사용하여 템플릿 컨트롤을 만들 때마다 Microsoft Visual Studio에서 느슨한 XAML 리소스 사전을 프로젝트에 추가합니다. 이 리소스 사전은 기본 테마 템플릿을 제공합니다. 스타일 또는 템플릿의 복사본을 편집하고 선택한 리소스 위치(앱, 페이지 또는 독립 실행형)에 대한 가 ResourceDictionary 아직 없는 경우 Microsoft Visual Studio에서 XAML에 새 ResourceDictionary 를 만들 수 있습니다.

XAML 구문에 대한 참고 사항

에 대한 XAML 암시적 컬렉션 구문에는 에 ResourceDictionary 대한 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과 같이 컨트롤이 아닌 요소의 스타일
  • 데이터 바인딩을 사용하는 컨트롤 및 패널에 대한 데이터 템플릿
  • 특정 Brush 값( 주로 SolidColorBrush)
  • 지역화할 필요가 없는 문자열 또는 기타 상수(지역화해야 하는 문자열 및 상수는 ResourceDictionary에 있으면 안 됩니다. 자세한 내용은 빠른 시작: UI 리소스 번역을 참조하세요.)

코드에서 ResourceDictionary 개체에 액세스

코드가 ResourceDictionary의 리소스에 액세스하는 데 사용하는 API는 사용하는 프로그래밍 언어에 따라 달라집니다.

코드에서 사용하는 ResourceDictionary 방법에 대한 자세한 내용은 ResourceDictionary 및 XAML 리소스 참조의 "코드에서 ResourceDictionary 사용" 섹션을 참조하세요.

시스템 리소스

일부 테마 리소스는 기본 하위 값으로 시스템 리소스 값을 참조합니다. 시스템 리소스는 XAML 리소스 사전에서 찾을 수 없는 특수 리소스 값입니다. 이 값은 Windows 런타임 XAML 지원에서 시스템 자체의 값을 전달하는 동작에 따라 결정되며 XAML 리소스가 참조할 수 있는 형태로 값이 표현됩니다.

생성자

ResourceDictionary()

ResourceDictionary 클래스의 새 instance 초기화합니다.

속성

Dispatcher

항상 Windows 앱 SDK 앱에서 를 반환 null 합니다. 대신 DispatcherQueue 를 사용합니다.

(다음에서 상속됨 DependencyObject)
DispatcherQueue

DispatcherQueue 이 개체가 연결된 을 가져옵니다. 는 DispatcherQueue 코드가 비 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)

적용 대상

추가 정보