Xamarin доступ к MergedDictionaries из кода

191
27 апреля 2018, 11:40

Есть страница, в ней подключаются стили через xaml таким образом:

<ContentPage.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <themes:MainStyles />
        </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary>
</ContentPage.Resources>

Сам словарь выглядит так:

<ResourceDictionary xmlns="http://xamarin.com/schemas/2014/forms"
                xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                x:Class="MyMobApp.Themes.MainStyles">
<OnPlatform x:Key="BaseFont" x:TypeArguments="x:String">
    <On Platform="Android" Value="cuprum_standard.ttf#Cuprum" />
    <On Platform="iOS" Value="Cuprum" />
    <On Platform="UWP, WinRT, WinPhone" Value="Assets/Fonts/cuprum_standard.ttf#Cuprum" />
</OnPlatform>
<Style x:Key="Grey" TargetType="Label">
    <Setter Property="FontFamily" Value="{StaticResource BaseFont}" />
    <Setter Property="FontSize" Value="12" />
    <Setter Property="TextColor" Value="#A0A0A0" />
</Style>
<Style x:Key="h1" TargetType="Label">
    <Setter Property="TextColor" Value="#000000" />
    <Setter Property="FontSize" Value="14" />
    <Setter Property="FontFamily" Value="{StaticResource BaseFont}" />
</Style>

В XAML применяю стили так:

<Label Text="{Binding Date}" Margin="10,10,10,0" HeightRequest="13" Style="{StaticResource Grey}" />

Всё работает. Но затем появилась необходимость добавлять на страницу динамически Label, к которым нужно прилепить стиль Grey, например. Погуглил и нашел такой вполне логичный вариант:

this.Wrapper.Children.Add(new Label
        {
            Text = this._Event.Date,
            Style = Application.Current.Resources["Grey"] as Style
        });

НО он выбрасывает исключение System.NullReferenceException: Object reference not set to an instance of an object.

Склоняюсь к тому, что в моём случае не просто Resource, а дело в MergedDictionaries. Как в таком случае применить стиль из кода C#?

Answer 1

Моё предположение касательно MergedDictionaries оказалось верно. Но я не понимал, что несмотря на то, что словарь подключен в XAML, работая с ним из кода его нужно дополнительно подключать. Я сделал так:

  1. Подключил пространство где лежит словарь со стилями using MyMobApp.Themes;
  2. Инициализировал новый ресурс this.Resources = new ResourceDictionary();
  3. Добавил в него свой словарь как MergedDictionaries Resources.MergedDictionaries.Add(new MainStyles());
  4. При создании Label применил стиль из своего словаря

    this.Wrapper.Children.Add(new Label
            {
                Text = this._Event.Date,
                Style = Resources["Grey"] as Style
            });
    

ADD: Если мержить словари нет необходимости (используете один, например), инициализируем объект ресурса только одним своим словарём вот так: this.Resources = new MainStyles(); и далее по схеме выше.

READ ALSO
Как вызвать элемент из UseControl?

Как вызвать элемент из UseControl?

На UseControl у меня есть картинка и два эллипса (круга, как угодно), я хочу связать два UseControl на холсте , вывод UseControl на холст сделан, вопрос вот...

168
Обращение к элементам формы

Обращение к элементам формы

Допустим у меня есть 10 textBox ( textBox1, textBox2,

140
Можно ли использовать Menu как ContextMenu?

Можно ли использовать Menu как ContextMenu?

Существует Menu, например такое:

175
Проблема получения записи из модели

Проблема получения записи из модели

Есть модель заказыЕсть форма на которой я работаю с этой моделью

209