Часто ресурсы приложения выносят в отдельные файлы, что позволяет не захламлять исходный код приложения. В .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 поддерживается объединение словарей ресурсов как расположенных локально, так и в разных сборках.