애플리케이션 수준 리소스 만들기 및 사용

완료됨

XAML 페이지에서 리소스 및 스타일을 정의하면 반복되는 코드를 효율적으로 줄일 수 있습니다. 하지만 문제가 있습니다. 이러한 리소스 및 스타일은 해당 특정 XAML 페이지에서만 사용할 수 있습니다. 여러 페이지를 사용하는 경우 페이지 수준 리소스 사전은 애플리케이션 간에 반복되는 코드를 방지하는 데 적합하지 않습니다. 이 단원에서는 애플리케이션의 모든 페이지에서 리소스 및 스타일을 공유하는 방법을 알아봅니다.

리소스 사전을 사용할 수 있는 위치

VisualElement 클래스는 Resources 속성을 정의합니다. 컨트롤, 페이지 및 레이아웃이 VisualElement에서 상속되므로 리소스 사전을 저장할 수 있는 Resources 속성이 모두 포함됩니다.

Application 클래스는 또한 Resources 속성을 정의합니다. ApplicationVisualElement에서 상속되지 않으므로 속성이 이 클래스의 일부로 정의됩니다.

다음 그림에서는 일반적인 애플리케이션의 구조를 보여 줍니다. 표시된 각 요소에는 리소스 사전을 저장할 수 있는 Resources 속성이 포함됩니다.

참고

이 다이어그램은 애플리케이션의 항목이 구성되는 방법을 간단히 보여줍니다. 이 다이어그램에서 View는 하위 컨트롤에 대해 컨테이너로 작동하지 않는 Button 또는 Label과 같은 싱글톤 컨트롤을 나타냅니다. 또한 Layout은 하위 컨트롤의 레이아웃을 구성하는 컨테이너를 의미합니다. 레이아웃은 중첩될 수 있습니다. 예를 들어 Grid 컨트롤은 StackLayout 컨트롤 내에 포함될 수 있습니다.

A diagram of the high-level structure of a typical .NET MAUI application.

애플리케이션 수준 리소스 및 스타일을 정의하는 방법

Application 클래스와 연결된 XAML 파일에서 애플리케이션 수준 리소스 및 스타일을 정의합니다. 다음 코드에서는 애플리케이션 리소스 사전에서 Color 리소스를 선언하는 방법을 보여줍니다.

<Application.Resources>
    <Color x:Key="MyTextColor">Blue</Color>
</Application.Resources>

.NET MAUI의 리소스 또는 스타일을 찾는 방법

다음 코드에 표시된 것처럼 컨트롤 중 하나에 리소스를 적용한다고 가정해 보세요.

<Label TextColor="{StaticResource MyTextColor}" ... />

.NET MAUI는 값을 적용할 수 있도록 해당 리소스 정의를 찾아야 합니다. 단일 애플리케이션에는 여러 사전이 포함될 수 있습니다. .NET MAUI는 어떤 사전을 어떤 순서로 검색할까요? 이러한 질문에 답하기 위해서는 페이지에서 VisualElement 인스턴스가 트리 구조를 형성한다고 생각해볼 수 있습니다. 애플리케이션이 맨 위에 있고 그 아래로 페이지, 레이아웃 및 뷰가 이어집니다. 이 구조는 종종 시각적 트리라고 합니다. 트리의 각 요소에는 리소스를 포함할 수 있는 고유한 사전이 있을 수 있습니다. .NET MAUI의 스타일 검색 알고리즘은 시각적 트리를 따라 수행됩니다.

  1. 리소스가 적용되는 VisualElement 인스턴스의 사전으로 검색을 시작합니다. 이전 예제에서는 검색이 Label 유형으로 시작됩니다. 리소스 사전이 없거나 사전이 있더라도 리소스가 없으면 검색이 다음으로 이동됩니다.

  2. 컨트롤의 부모로 이동해서 검색을 반복합니다. 일반적으로 검색할 다음 위치는 레이아웃입니다.

  3. 레이아웃의 부모를 확인합니다. 일반적으로 검색할 다음 위치는 페이지입니다. 그렇더라도 StackLayout 내의 Grid와 같이 레이아웃이 다른 레이아웃 내에 중첩된 경우에는 검색이 트리 구조를 따라서 부모 레이아웃으로 이동합니다.

  4. 사전에서 Application 클래스를 찾습니다.

검색은 x:Key 값과 일치하는 첫 번째 항목을 반환합니다. 다음 이미지에는 리소스 조회 순서가 요약되어 있습니다.

A diagram showing how .NET searches for resources. It starts at the view, then layouts, then pages, then to the application.

실제로 대부분의 개발자는 뷰 및 레이아웃에서 Resources 속성을 무시합니다. 한 페이지에서 사용하는 항목에 대한 페이지 수준 사전을 사용합니다. 여러 페이지에서 공유하려는 리소스 및 스타일은 애플리케이션 수준에서 정의됩니다. 그런 다음, 조회 프로세스에서 2개의 사전 즉, 현재 페이지 인스턴스에 있는 사전과 애플리케이션에 있는 사전만 확인해야 합니다.

참고

지정된 키가 있는 리소스를 찾을 수 없으면 앱에서 스타일 지정에 기본값이 사용됩니다.

중복 키

ResourceDictionary 인스턴스는 독립적입니다. 즉, 동일한 x:Key 값을 둘 이상의 사전에서 사용할 수 있습니다. 검색 경로에서 여러 개의 사전에 동일한 x:Key 식별자를 사용해도 오류가 발생하지 않습니다. 경로에서 처음으로 일치하는 x:Key 값과 연결된 리소스가 사용됩니다.

예를 들어 Application 클래스에 정의된 다음 리소스가 있다고 가정해보세요.

<Application.Resources>
    <x:String x:Key="msg">Two</x:String>
</Application.Resources>

그런 다음, ContentPage에서 다음 리소스를 정의하고 동일한 페이지에서 Label에 적용합니다.

<ContentPage.Resources>
    <x:String x:Key="msg">One</x:String>
</ContentPage.Resources>
...
<Label Text="{StaticResource msg}">

첫 번째로 일치하는 x:Key 값이 사용되므로 Text 속성은 One으로 설정됩니다.