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