Ресурсы и стили. Подключение внешних ресурсов

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

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии