Xamarin.Forms: Как загрузить ResourceDictionary из другого файла?
Я написал следующий код, но XamlParseException имеет bean. ( "StaticResource не найден для ключевого CustomColor" )
MyPage.xaml
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="XFApp11.MyPage">
<ContentPage.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="CustomResource.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</ContentPage.Resources>
<ContentPage.Content>
<BoxView Color="{StaticResource CustomColor}" />
</ContentPage.Content>
</ContentPage>
CustomResource.xaml(build action = EmbeddedResource)
<?xml version="1.0" encoding="UTF-8" ?>
<ResourceDictionary xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<Color x:Key="CustomColor">#004B86</Color>
</ResourceDictionary>
Ответы
Ответ 1
Объединенные словари не поддерживаются в Xamarin Forms XAML ниже 2.1.0
Единственный способ сделать это - разместить его на другой странице, а затем загрузить в код позади и ссылаться на него через DynamicResource вместо StaticResource.
Я объясняю это более подробно: http://www.xamarinhelp.com/styling-uiux-day-11/
Однако с 2.1.0-pre1 (выпущенный на этой неделе) вы можете теперь делать шаблоны, что является другим способом сделать это. Джейсон Смит писал об этом в блоге: http://xfcomplete.net/general/2016/01/20/control-templates/
Обновление: Начиная с версии 2.3.0 вы можете создать объединенный словарь с атрибутом MergedWith.
Создайте новый файл 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>
Теперь в вашем ContentPage используйте атрибут MergedWith в 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>
Ответ 2
Начиная с версии 2.3.0, можно официально объединить ресурсные словари в xaml
обратите внимание на следующий пример
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>
Ответ 3
С Xamarin.Forms 3.0 MergedWith
устарела и не должна использоваться.
Теперь вы можете использовать Source
или 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>
Итак, если 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.AnotherResource"
Source="MyResource.xaml">
</ResourceDictionary>
В противном случае (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"
xmlns:otherresources="clr-namespace:OtherAssembly.UI.Resources"
x:Class="UI.AnotherResource">
<ResourceDictionary.MergedDictionaries>
<otherresources:MyResource />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
Некоторые вещи, которые следует учитывать:
- Источник: он может использоваться только в XAML, а значением является путь к файлу xaml (всегда в одной сборке)
- MergeDictionaries: его можно использовать независимо от сборки, в которой находится ресурс.
Больше информации в ресурсных словарях Xamarin Forms