ResourceDictionary 클래스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
앱에서 사용하는 스타일과 같은 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>
- 상속
- 파생
- 특성
- 구현
-
IDictionary<Object,Object> IMap<IInspectable,IInspectable> IIterable<IKeyValuePair<K,V>> IEnumerable<KeyValuePair<K,V>> IEnumerable<KeyValuePair<Object,Object>> IIterable<IKeyValuePair<IInspectable,IInspectable>>
설명
리소스 사전은 앱에서 사용하는 스타일과 같은 XAML 리소스에 대한 리포지토리입니다. XAML에서 리소스를 정의한 다음 {StaticResource} 태그 확장 및 {ThemeResource} 태그 확장을 사용하여 XAML에서 리소스를 검색할 수 있습니다. 코드를 사용하여 리소스에 액세스할 수도 있지만 덜 일반적입니다. 리소스를 사용하여 브러시 색 또는 픽셀 측정과 같은 특정 값이 앱 전체에서 일관되게 사용되도록 적용할 수 있습니다. 리소스 사전을 효과적으로 사용하는 방법에 대한 자세한 내용은 ResourceDictionary 및 XAML 리소스 참조를 참조하세요.
ResourceDictionary 요소 사용
형식은 ResourceDictionary
Windows 앱 SDK 앱의 전체 구조에 중요한 두 속성 FrameworkElement.Resources 및 Application.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} 태그 확장을 사용하여 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에서 항목의 ResourceDictionary
키는 XAML 리소스를 나타내는 요소에서 x:Key 특성을설정하여 선언됩니다. 일반적으로 키 값이 없는 자식 요소를 에 ResourceDictionary
넣으려고 하면 XAML 구문 분석 예외 또는 Windows 런타임 예외가 throw됩니다. 예외 조건은 XAML 디자인 화면에서 경고로 표시될 수도 있습니다. 그러나 자식 요소에 x:Key 특성 값이 필요하지 않은 세 가지 주목할 만한 경우가 ResourceDictionary
있습니다.
- Style 리소스는 TargetType 값을 암시적 리소스 키로 사용할 수 있습니다. 스타일 및 컨트롤 템플릿의 암시적 키가 작동하는 방식에 대한 자세한 내용은 컨트롤 스타일 지정을 참조하세요.
-
ResourceDictionary
ResourceDictionary.MergedDictionaries 값을 나타내는 Source 값이 있는 요소는 에ResourceDictionary
x:Key 특성을 가질 수 없습니다. 병합된 각 사전 파일 내에서(URI에서 원본으로 참조하는 사전 파일) 각 리소스에 대한 키가 필요합니다. - 레거시 이유로 x:Key 특성 대신 x:Name 특성을 사용할 수 있습니다. 그러나 x:Name 특성 자체는 해당 항목의 XAML 리소스 조회를 사용하도록 설정하지 않습니다. x:Name 특성 식별 규칙은 스토리보드 애니메이션 정의와 같은 특정 시나리오에 사용됩니다. 자세한 내용은 x:Name 특성을 참조하세요.
ResourceDictionary를 반복하는 중
C#에서 를 ResourceDictionary
반복할 수 있습니다. 구문 사용 foreach
과 같은 대부분의 경우 컴파일러는 이 캐스팅을 수행하므로 명시적으로 캐스팅 IEnumerable
할 필요가 없습니다. 예를 들어 GetEnumerator를 호출하려는 경우 명시적으로 캐스팅해야 하는 경우 제약 조건을 사용하여 IEnumerable 로 KeyValuePair<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는 사용하는 프로그래밍 언어에 따라 달라집니다.
- C#의 경우 IDictionary<TKey, TValue> 및 IEnumerable을 구현하는 API를 사용합니다. 예를 들어 TryGetValue 또는 항목 인덱서입니다.
- 원본과 같이 컬렉션 지원의 일부가 아닌 API는 모든 언어에서 동일합니다.
코드에서 사용하는 ResourceDictionary
방법에 대한 자세한 내용은 ResourceDictionary 및 XAML 리소스 참조의 "코드에서 ResourceDictionary 사용" 섹션을 참조하세요.
시스템 리소스
일부 테마 리소스는 기본 하위 값으로 시스템 리소스 값을 참조합니다. 시스템 리소스는 XAML 리소스 사전에서 찾을 수 없는 특수 리소스 값입니다. 이 값은 Windows 런타임 XAML 지원에서 시스템 자체의 값을 전달하는 동작에 따라 결정되며 XAML 리소스가 참조할 수 있는 형태로 값이 표현됩니다.
생성자
ResourceDictionary() |
ResourceDictionary 클래스의 새 instance 초기화합니다. |
속성
Dispatcher |
항상 Windows 앱 SDK 앱에서 를 반환 |
DispatcherQueue |
|
MergedDictionaries |
병합된 사전의 다양한 리소스 사전을 구성하는 ResourceDictionary 사전의 컬렉션을 가져옵니다. |
Size |
컬렉션에 포함된 요소 수를 가져옵니다. |
Source |
병합된 리소스 사전의 원본 위치를 제공하는 URI(Uniform Resource Identifier)를 가져오거나 설정합니다. |
ThemeDictionaries |
테마 시나리오를 해결하기 위해 특별히 키 지정되고 구성된 병합된 리소스 사전의 컬렉션을 가져옵니다(예: "HighContrast"에 대한 테마 값 제공). |