다음을 통해 공유


{ThemeResource} 태그 확장

현재 활성 테마에 따라 다른 리소스를 검색하는 추가 시스템 논리와 함께 리소스에 대한 참조를 평가하여 XAML 특성에 대한 값을 제공합니다. {StaticResource} 태그 확장과 마찬가지로 리소스는 ResourceDictionary 정의되며 ThemeResource 사용은 ResourceDictionary에서 해당 리소스의 키를 참조합니다.

XAML 특성 사용

<object property="{ThemeResource key}" .../>

XAML 값

용어 설명
key 요청한 리소스의 키입니다. 이 키는 처음에 ResourceDictionary에 의해 할당됩니다. 리소스 키는 XamlName 문법에 정의된 문자열일 수 있습니다.

설명

ThemeResource 는 XAML 리소스 사전의 다른 위치에 정의된 XAML 특성에 대한 값을 가져오는 기술입니다. 태그 확장은 {StaticResource} 태그 확장과 동일한 기본 용도로 사용됩니다. 동작과 {StaticResource} 태그 확장의 차이점은 ThemeResource 참조가 시스템에서 현재 사용 중인 테마에 따라 다른 사전을 기본 조회 위치로 동적으로 사용할 수 있다는 것입니다.

앱이 처음 시작되면 시작 시 사용 중인 테마에 따라 ThemeResource 참조에서 만든 모든 리소스 참조가 평가됩니다. 그러나 사용자가 이후에 런타임에 활성 테마를 변경하는 경우 시스템은 모든 ThemeResource 참조를 다시 평가하고, 다를 수 있는 테마 별 리소스를 검색하고, 시각적 트리의 모든 적절한 위치에서 새 리소스 값으로 앱을 다시 표시합니다. StaticResource는 XAML 로드 시간/앱 시작 시 결정되며 런타임에 다시 평가되지 않습니다. (XAML을 동적으로 다시 로드하는 시각적 상태와 같은 다른 기술이 있지만 이러한 기술은 기본 리소스 평가에서 사용하도록 설정된 더 높은 수준에서 작동합니다 .{StaticResource} 태그 확장).

StaticResource 는 요청된 리소스의 키를 지정하는 하나의 인수를 사용합니다. 리소스 키는 항상 Windows 런타임 XAML의 문자열입니다. 리소스 키를 처음 지정하는 방법에 대한 자세한 내용은 x:Key 특성을 참조 하세요.

리소스를 정의하고 샘플 코드를 포함하여 ResourceDictionary올바르게 사용하는 방법에 대한 자세한 내용은 ResourceDictionary 및 XAML 리소스 참조를 참조하세요.

중요 StaticResource와 마찬가지로, ThemeResource는 XAML 파일에서 어휘상으로 정의되어 있는 리소스에 대한 전방 참조를 시도해서는 안 됩니다. 이렇게 하려는 시도는 지원되지 않습니다. 전방 참조가 실패하지 않더라도 이를 수행하려고 하면 성능이 저하됩니다. 최상의 결과를 얻으려면 전방 참조를 피할 수 있도록 리소스 사전의 컴퍼지션을 조정합니다.

해결할 수 없는 키에 StaticResource를 지정하려고 하면 런타임에 XAML 구문 분석 예외가 throw됩니다. 디자인 도구는 경고 또는 오류를 제공할 수도 있습니다.

Windows 런타임 XAML 프로세서 구현에는 ThemeResource에 대한 지원 클래스 표현이 없습니다. 코드에서 가장 가까운 값은 Contains 또는 TryGetValue 호출과 같이 ResourceDictionary 컬렉션 API를 사용하는 것입니다.

ThemeResource는 태그 확장입니다. 태그 확장은 특성 값을 리터럴 값 또는 처리기 이름이 아닌 다른 값이 되도록 이스케이프해야 하는 요구 사항이 있는 경우 일반적으로 구현되며 이러한 요구 사항은 특정 형식 또는 속성에 형식 변환기를 배치하는 것보다 더 포괄적입니다. XAML의 모든 태그 확장은 특성 구문에 "{" 및 "}" 문자를 사용하며, 여기서 특성 구문은 XAML 프로세서가 태그 확장이 특성을 처리해야 함을 인식하는 데 사용하는 규칙입니다.

{StaticResource} 대신 {ThemeResource}를 사용하는 시기 및 방법

ThemeResource리소스 사전의 항목으로 확인하는 규칙은 일반적으로 StaticResource동일합니다. ThemeResource 조회는 ThemeDictionaries 컬렉션에서 참조되는 ResourceDictionary 파일로 확장할 수 있지만 StaticResource도 이를 수행할 수 있습니다. 차이점은 ThemeResource런타임에 다시 평가할 수 있고 StaticResource할 수 없다는 것입니다.

각 테마 사전의 키 집합은 활성 상태인 테마에 관계없이 동일한 키 리소스 집합을 제공해야 합니다. 지정된 키로 된 리소스가 HighContrast 테마 사전에 있는 경우 해당 이름의 다른 리소스도 밝게기본값있어야 합니다. 그렇지 않은 경우 사용자가 테마를 전환하고 앱이 제대로 표시되지 않을 때 리소스 조회가 실패할 수 있습니다. 테마 사전은 하위 값을 제공하기 위해 동일한 범위 내에서만 참조되는 키로 된 리소스를 포함할 수 있습니다. 이러한 항목이 모든 테마에서 동일할 필요는 없습니다.

일반적으로 테마 사전에 리소스를 배치하고 테마 간에 해당 값이 변경되거나 변경되는 값에서 지원되는 경우에만 ThemeResource를 사용하여 해당 리소스를 참조해야 합니다. 이러한 종류의 리소스에 적합합니다.

  • 브러시, 특히 SolidColorBrush색입니다. 이는 기본 XAML 컨트롤 템플릿(generic.xaml)에서 ThemeResource 사용량의 약 80%를 차지합니다.
  • 테두리, 오프셋, 여백 및 안쪽 여백 등에 대한 픽셀 값입니다.
  • FontFamily 또는 FontSize와 같은 글꼴 속성입니다.
  • 일반적으로 시스템 스타일이 지정되고 GridViewItem 및 ListViewItem과 같은 동적 프레젠테이션에 사용되는 제한된 수의 컨트롤에 대한 전체 템플릿입니다.
  • 텍스트 표시 스타일(일반적으로 글꼴 색, 배경 및 크기 변경).

Windows 런타임 ThemeResource에서 특별히 참조할 리소스 집합을 제공합니다. 이러한 항목은 모두 XAML 파일 themeresources.xaml의 일부로 나열되며, SDK(Windows 소프트웨어 개발 키트)의 일부로 include/winrt/xaml/design 폴더에서 사용할 수 있습니다. 테마 브러시 및 themeresources.xaml에 정의된 추가 스타일에 대한 설명서는 XAML 테마 리소스를 참조 하세요. 브러시는 가능한 세 가지 활성 테마 각각에 대해 각 브러시의 색 값을 알려주는 표에 설명되어 있습니다.

컨트롤 템플릿의 시각적 상태 XAML 정의는 테마 변경으로 인해 변경될 수 있는 기본 리소스가 있을 때마다 ThemeResource 참조를 사용해야 합니다. 시스템 테마 변경은 일반적으로 시각적 상태 변경의 원인이 되지 않습니다. 이 경우 리소스는 여전히 활성 상태인 시각적 상태에 대해 값을 다시 평가할 수 있도록 ThemeResource 참조를 사용해야 합니다. 예를 들어 특정 UI 부분과 해당 속성 중 하나의 브러시 색을 변경하는 시각적 상태가 있고 브러시 색이 테마 별로 다른 경우 기본 템플릿에서 해당 속성의 값을 제공하고 기본 템플릿에 시각적 상태 수정을 제공하기 위해 ThemeResource 참조를 사용해야 합니다.

ThemeResource 사용량은 일련의 종속 값에서 볼 수 있습니다. 예를 들어 Keyed 리소스인 SolidColorBrush에서 사용하는 Color 값은 ThemeResource 참조를 사용할 수 있습니다. 그러나 키 지정된 SolidColorBrush 리소스를 사용하는 모든 UI 속성은 ThemeResource 참조를 사용하므로 테마가 변경될 때 동적 값을 변경할 수 있도록 하는 각 Brush 형식 속성입니다.

테마 전환에 대한 참고{ThemeResource} 및 런타임 리소스 평가는 Windows 8.1 XAML에서 지원되지만 Windows 8을 대상으로 하는 앱의 경우 XAML에서는 지원되지 않습니다.

시스템 리소스

일부 테마 리소스는 시스템 리소스 값을 기본 하위 값으로 참조합니다. 시스템 리소스는 XAML 리소스 사전에서 찾을 수 없는 특수 리소스 값입니다. 이러한 값은 Windows 런타임 XAML 지원에서 동작을 사용하여 시스템 자체에서 값을 전달하고 XAML 리소스가 참조할 수 있는 형식으로 나타냅니다. 예를 들어 RGB 색을 나타내는 "SystemColorButtonFaceColor"라는 시스템 리소스가 있습니다. 이 색은 Windows 런타임 및 Windows 런타임 앱에만 국한되지 않는 시스템 색 및 테마의 측면에서 제공됩니다.

시스템 리소스는 고대비 테마의 기본 값으로 흔히 선택됩니다. 사용자는 고대비 테마에 대한 색 선택을 제어하며, Windows 런타임 앱과 관련이 없는 시스템 기능을 사용하여 이러한 선택을 합니다. 시스템 리소스를 ThemeResource 참조로 참조하면 Windows 런타임 앱에 대한 고대비 테마의 기본 동작은 사용자가 제어하고 시스템에서 노출하는 테마 별 값을 사용할 수 있습니다. 또한 이제 시스템에서 런타임 테마 변경을 감지하면 참조가 다시 평가되도록 표시됩니다.

{ThemeResource} 사용 예제

다음은 ThemeResource를 사용하는 방법을 설명하기 위해 기본 generic.xaml 및 themeresources.xaml 파일에서 가져온 몇 가지 예제 XAML입니다. 하나의 템플릿(기본 단추)과 두 속성(배경 전경)을 선언하여 테마 변경에 응답하는 방법을 살펴보겠습니다.

    <!-- Default style for Windows.UI.Xaml.Controls.Button -->
    <Style TargetType="Button">
        <Setter Property="Background" Value="{ThemeResource ButtonBackgroundThemeBrush}" />
        <Setter Property="Foreground" Value="{ThemeResource ButtonForegroundThemeBrush}"/>
...

여기서 속성은 Brush 값을 사용하고, ThemeResource사용하여 명명 되고 ButtonBackgroundThemeBrush 만들어진 SolidColorBrushButtonForegroundThemeBrush 리소스에 대한 참조를 사용합니다.

이러한 동일한 속성은 단추에 대한 일부 시각적 상태에 의해 조정됩니다. 특히 단추를 클릭하면 배경색이 변경됩니다. 여기에서도 시각적 상태 스토리보드 배경 전경 애니메이션은 DiscreteObjectKeyFrame 개체 및 참조를 사용하여 ThemeResource를 키 프레임 값으로 사용하여 브러시에 사용합니다.

<VisualState x:Name="Pressed">
  <Storyboard>
    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Border"
        Storyboard.TargetProperty="Background">
      <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ButtonPressedBackgroundThemeBrush}" />
    </ObjectAnimationUsingKeyFrames>
    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter"
         Storyboard.TargetProperty="Foreground">
       <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ButtonPressedForegroundThemeBrush}" />
    </ObjectAnimationUsingKeyFrames>
  </Storyboard>
</VisualState>

이러한 각 브러시는 generic.xaml의 앞부분에서 정의됩니다. XAML 전달 참조를 방지하기 위해 템플릿을 사용하기 전에 해당 브러시를 정의해야 했습니다. 다음은 "기본" 테마 사전에 대한 정의입니다.

    <ResourceDictionary.ThemeDictionaries>
        <ResourceDictionary x:Key="Default">
...
            <SolidColorBrush x:Key="ButtonBackgroundThemeBrush" Color="Transparent" />
            <SolidColorBrush x:Key="ButtonForegroundThemeBrush" Color="#FFFFFFFF" />
...
            <SolidColorBrush x:Key="ButtonPressedBackgroundThemeBrush" Color="#FFFFFFFF" />
            <SolidColorBrush x:Key="ButtonPressedForegroundThemeBrush" Color="#FF000000" />
...

그런 다음 다른 각 테마 사전에는 다음과 같은 브러시가 정의되어 있습니다.

        <ResourceDictionary x:Key="HighContrast">
            <!-- High Contrast theme resources -->
...
            <SolidColorBrush x:Key="ButtonBackgroundThemeBrush" Color="{ThemeResource SystemColorButtonFaceColor}" />
            <SolidColorBrush x:Key="ButtonForegroundThemeBrush" Color="{ThemeResource SystemColorButtonTextColor}" />

...
            <SolidColorBrush x:Key="ButtonPressedBackgroundThemeBrush" Color="{ThemeResource SystemColorButtonTextColor}" />
            <SolidColorBrush x:Key="ButtonPressedForegroundThemeBrush" Color="{ThemeResource SystemColorButtonFaceColor}" />

여기서 색 값은 시스템 리소스에 대한 또 다른 ThemeResource 참조입니다. 시스템 리소스를 참조하고 테마 변경에 대한 응답으로 변경하려는 경우 ThemeResource를 사용하여 참조를 만들어야 합니다.

Windows 8 동작

Windows 8은 ThemeResource 태그 확장을 지원하지 않았으며 Windows 8.1부터 사용할 수 있습니다. 또한 Windows 8은 Windows 런타임 앱에 대한 테마 관련 리소스를 동적으로 전환하는 것을 지원하지 않았습니다. XAML 템플릿 및 스타일에 대한 테마 변경을 선택하기 위해 앱을 다시 시작해야 했습니다. 이는 좋은 사용자 환경이 아니므로 앱은 ThemeResource 사용과 함께 스타일을 사용하고 사용자가 테마를 동적으로 전환할 수 있도록 Windows 8.1을 다시 컴파일하고 대상으로 지정하는 것이 좋습니다. Windows 8용으로 컴파일 되었지만 Windows 8.1에서 실행되는 앱은 Windows 8 동작을 계속 사용합니다.

{ThemeResource} 태그 확장에 대한 디자인 타임 도구 지원

XAML 페이지에서 {ThemeResource} 태그 확장을 사용하는 경우 Microsoft Visual Studio 2013은 Microsoft IntelliSense 드롭다운에 가능한 키 값을 포함할 수 있습니다. 예를 들어 "{ThemeResource"를 입력하는 즉시 XAML 테마 리소스의 모든 리소스 키가 표시됩니다.

{ThemeResource} 사용량의 일부로 리소스 키가 있으면 F12(정의로 이동) 기능을 사용하여 해당 리소스를 확인하고 테마 리소스가 정의된 디자인 타임에 generic.xaml을 표시할 수 있습니다. 테마 리소스가 두 번 이상 정의되기 때문에(테마 당) 정의로 이동하면 파일에 있는 첫 번째 정의(기본값 정의)로 이동합니다. 다른 정의를 원하는 경우 파일 내에서 키 이름을 검색하고 다른 테마의 정의를 찾을 수 있습니다.