Часто ресурсы приложения выносят в отдельные файлы, что позволяет не захламлять исходный код приложения. В .NET MAUI мы также можем выносить ресурсы во внешние файлы и подключать их в своих приложениях.
Файлы ресурсов в .NET MAUI
В шаблонном проекте .NET MAUI уже продемонстрирована работа с внешними ресурсами. Так, в папке проекта Resources/Styles уже содержатся два файла — Colors.xaml и Styles.xaml, которые используются в приложении. Технически, мы можем использовать эту же папку для хранения своих ресурсов, а можем создать другую.
Например, создадим новый проект .NET MAUI и добавим в него папку Resources/ExamleRes:
Теперь добавим в эту папку новый файл с ресурсами. Для этого можно воспользоваться контекстным меню проекта:
В результате, в наш проект добавиться новый файл, содержащий «скелет» словаря ресурсов:
<?xml version="1.0" encoding="utf-8" ?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MauiApp9.Resources.ExamleRes.MyResources">
</ResourceDictionary>
Добавим в этот файл несколько ресурсов. Например,
<?xml version="1.0" encoding="utf-8" ?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MauiApp9.Resources.ExamleRes.MyResources">
<x:String x:Key="hello">Привет, Мир!</x:String>
<Color x:Key="color">#7b68ee</Color>
<x:Double x:Key="size">24</x:Int32>
</ResourceDictionary>
Здесь мы определили три ресурса — строку, цвет и число типа double. Теперь можно подключить наш файл ресурсов и воспользоваться им в любом месте приложения.
Подключение файла ресурсов
Файлы ресурсов подключаются также с использованием тэга ResourceDictionary следующим образом:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MauiApp9.MainPage">
<ContentPage.Resources>
<ResourceDictionary Source="/Resources/ExamleRes/MyResources.xaml"/>
</ContentPage.Resources>
<ScrollView>
<VerticalStackLayout
Padding="30,0"
Spacing="25">
<Label
Text="{StaticResource hello}"
FontSize="{StaticResource size}"
TextColor="{StaticResource color}" />
</VerticalStackLayout>
</ScrollView>
</ContentPage>
то есть в атрибуте Source мы указываем путь к файлу, содержащему словарь ресурсов. Полученные ресурсы мы используем для метки Label. В результате, после запуска приложения мы получим следующий результат:
Объединение словарей ресурсов
При необходимости, мы можем объединять различные файлы ресурсов в один словарь. Такая возможность, опять же, продемонстрирована в шаблонном проекте .NET MAUI в файле App.xaml:
<?xml version = "1.0" encoding = "UTF-8" ?>
<Application xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:MauiApp9"
x:Class="MauiApp9.App">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Resources/Styles/Colors.xaml" />
<ResourceDictionary Source="Resources/Styles/Styles.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
Здесь объединяются два файла ресурсов — Colors.xaml и Styles.xaml с использованием MergedDictionaries. Однако, это не единственная возможность объединения словарей. В .NET MAUI мы можем объединять словари, расположенные в различных сборках.
Например, создадим на нашем решении ещё один проект типа «Библиотека классов .NET MAUI», назовем его MauiRsources и добавим в этот проект словарь ресурсов с именем ExternalResources
Содержимое файла ресурсов будет следующим:
<?xml version="1.0" encoding="utf-8" ?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MauiResources.ExternalResources">
<x:String x:Key="helloEng">Hello, world!</x:String>
</ResourceDictionary>
Теперь добавим ссылку на новый проект в основной. У вас должна получиться следующая структура проекта:
Подключим внешний файл ресурсов к ресурсам на уровне страницы. Для этого в основном проекте изменим код страницы MainPage.xaml следующим образом:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MauiApp9.MainPage"
xmlns:external="clr-namespace:MauiResources;assembly=MauiResources">
<ContentPage.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Resources/ExamleRes/MyResources.xaml"/>
<external:ExternalResources></external:ExternalResources>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</ContentPage.Resources>
<ScrollView>
<VerticalStackLayout
Padding="30,0"
Spacing="25">
<Label
Text="{StaticResource helloEng}"
FontSize="{StaticResource size}"
TextColor="{StaticResource color}" />
</VerticalStackLayout>
</ScrollView>
</ContentPage>
Первое, на что необходимо обратить внимание, это на подключение нового пространства имен у которого мы указали сборку:
xmlns:external="clr-namespace:MauiResources;assembly=MauiResources"
Далее мы, используя свойство MergedDictionaries, объединяем локальные ресурсы из файла MyResources.xaml с внешними ресурсами, указав в качестве словаря ресурсов объект ExternalResources:
<ContentPage.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Resources/ExamleRes/MyResources.xaml"/>
<external:ExternalResources></external:ExternalResources>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</ContentPage.Resources>
После объединения мы можем использовать все внешние ресурсы точно так же, как и локальные, что мы и сделали изменив текст метки:
Text="{StaticResource helloEng}"
Запустим приложение и проверим результат:
Итого
При необходимости, мы можем выносить ресурсы .NET MAUI в отдельные файлы и подключать их в проект, используя свойство ResourceDictionary.Source. Также, в .NET MAUI поддерживается объединение словарей ресурсов как расположенных локально, так и в разных сборках.

