Xamarin Forms - как выбрать ресурс в C # из MergedDictionaries - PullRequest
1 голос
/ 08 октября 2019

Может кто-нибудь показать мне запрос Linq, который будет использоваться для выбора стиля AdjustmentsIcon в файле IconResources.xaml ниже?

Я знаю, что вы можете получить ...

Application.Current.Resources["key"]

но я ищу эффективный для кода способ выбора стиля из MergeDictionary с помощью Linq.

App.xaml

<?xml version="1.0" encoding="utf-8" ?>
    <Application xmlns="http://xamarin.com/schemas/2014/forms"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 xmlns:font="clr-namespace:WP.Device.Resources"
                 xmlns:resources="clr-namespace:WP.Device.Resources"
                 x:Class="WP.Device.App"
                 >
        <Application.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <resources:IconResources />
                    <resources:ColorResources />
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Application.Resources>
    </Application>

IconResources. xaml

<?xml version="1.0" encoding="UTF-8"?>
    <ResourceDictionary xmlns="http://xamarin.com/schemas/2014/forms" 
                        xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                        xmlns:font="clr-namespace:WP.Device.Resources"
                        xmlns:resources="clr-namespace:WP.Device.Resources"
                        x:Class="WP.Device.Resources.IconResources">

        <ResourceDictionary.MergedDictionaries>
            <resources:ColorResources />
        </ResourceDictionary.MergedDictionaries>

        <Style TargetType="Label" x:Key="AddNewIcon">
            <Setter Property="FontSize" Value="30" />
        </Style>
        <Style TargetType="Label" x:Key="AdjustmentsIcon">
            <Setter Property="FontSize" Value="40" />
        </Style>
    </ResourceDictionary>

ОБНОВЛЕНИЕ

Я ценю ответ @pinedax, но для меня ...

Application.Current.Resources["key"]

не имеет ключей из объединенных словарей. Я не смог сформулировать запрос Linq, чтобы найти свой стиль, но я написал следующее, которое работает ...

    public Style FindStyle(ResourceDictionary resourceDictionary, string key)
    {
        Style style = resourceDictionary.ContainsKey(key) ? resourceDictionary[key] as Style : null;

        if (style == null)
        {
            foreach (var mergedDictionary in resourceDictionary.MergedDictionaries)
            {
                style = FindStyle(mergedDictionary, key);

                if (style != null) break;
            }
        }

        return style;
    }

и вызывается с ...

Style errorIcon = FindStyle(Application.Current.Resources, "AddNewIcon");

1 Ответ

3 голосов
/ 08 октября 2019

Я рекомендую вам использовать способ извлечения ресурсов из ResourceDictionary по умолчанию, поскольку для меня это очень эффективно.

Если вы посмотрите на исходный код ResourceDictionary ( здесь ) вы увидите, что есть внутренний словарь, в котором хранятся все ключи ресурсов, поэтому, когда мы делаем:1009 *

Но чтобы ответить на ваш вопрос, вы сможете получить значения с помощью Linq, используя метод SelectMany в свойстве MergeDictionaries. Примерно так:

var mergedDictionary = Application.Current.Resources.MergedDictionaries;
var resourceK = mergedDictionary.SelectMany(x => x)
                                .Where(v => v.Key == "Key")
                                .Select(t => t.Value)
                                .FirstOrDefault();

Надеюсь, это поможет .-

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...