Saltar al contenido

Xamarin.Forms: ¿Cómo puedo cargar ResourceDictionary desde otro archivo?

Solución:

A partir de 2.3.0 se pueden fusionar oficialmente los diccionarios de recursos en xaml, observe el siguiente ejemplo

BlueTheme.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"
                    x:Class="UI.Themes.BlueTheme">
    <Style TargetType="Label">
        <Setter Property="TextColor" Value="Blue" />
    </Style>
</ResourceDictionary>

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:theme="clr-namespace:UI.Themes"
             x:Class="UI.App">
    <Application.Resources>
        <ResourceDictionary MergedWith="themes:BlueTheme" />
    </Application.Resources>
    <Label Text="Hello" />
</Application>

Los diccionarios combinados no se admiten en Xamarin Forms XAML por debajo de 2.1.0

La única forma en que puede hacerlo es ponerlo en otra página y luego cargarlo en el código subyacente y hacer referencia a él a través de DynamicResource en lugar de StaticResource.

Explico esto más aquí: http://www.xamarinhelp.com/styling-uiux-day-11/

Sin embargo, a partir de 2.1.0-pre1 (lanzado esta semana), ahora puede hacer plantillas, que es otra forma de hacerlo. Jason Smith ha escrito en su blog al respecto: http://xfcomplete.net/general/2016/01/20/control-templates/

Actualizar: A partir de la 2.3.0, puede crear un diccionario combinado con un atributo llamado MergedWith.

Crea un nuevo archivo 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"
                    x:Class="UIDemo.Style.NewStyle">
    <Style TargetType="Label">
        <Setter Property="TextColor" Value="Blue" />
    </Style>
</ResourceDictionary>

Ahora en su ContentPage use el atributo MergedWith en su ResourceDictionary.

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:theme="clr-namespace:UIDemo.Style"
             x:Class="UIDemo.MainPage">
    <ContentPage.Resources>
        <ResourceDictionary MergedWith="theme:NewStyle" />
    </ContentPage.Resources>
    <Grid>
        <Label Text="Hello" />
    </Grid>
</ContentPage>

De Xamarin.Forms 3.0 MergedWith ha quedado obsoleto y no debe utilizarse.

Ahora puedes usar cualquiera Source o MergeDictionaries.

MyResource.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"
                    x:Class="UI.MyResource">
    <Style TargetType="Label">
        <Setter Property="TextColor" Value="Blue" />
    </Style>
</ResourceDictionary>

Así que si MyResource.xaml está en el mismo ensamblaje que puede usar directamente:

<?xml version="1.0" encoding="utf-8" ?>
<ResourceDictionary xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    x:Class="UI.AnotherResource"
    Source="MyResource.xaml">
</ResourceDictionary>

De lo contrario (MyResource.xaml está en otra asamblea):

<?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:otherresources="clr-namespace:OtherAssembly.UI.Resources"
    x:Class="UI.AnotherResource">
    <ResourceDictionary.MergedDictionaries>
        <otherresources:MyResource />
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

Algunas cosas a tener en cuenta:

  • Fuente: solo se puede usar en XAML, y el valor es la ruta al archivo xaml (siempre en el mismo ensamblado)
  • MergeDictionaries: se puede usar independientemente del ensamblado donde resida el recurso

Más información en los diccionarios de recursos de Xamarin Forms

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *