如何解决基于跨多个文件的其他样式的样式
如何使用带有多个文件的Style Inheritance?我已经可以使用Stand-alone resource dictionaries,但是如果子样式为 "hits" : [
{
"_index" : "file-names",..."_score" : null,"_source" : {
"filename" : "A Tribe Called Quest - Can I Kick It (1).mp3"
},"sort" : [
"A Tribe Called Quest - Can I Kick It (1).mp3"
]
},{
...
"_source" : {
"filename" : "Bcc 05.png"
},"sort" : [
"Bcc 05.png"
]
},{
...
"_source" : {
"filename" : "Birling Gap Cliffs.jpg"
},"sort" : [
"Birling Gap Cliffs.jpg"
]
},{
...
"_source" : {
"filename" : "Durdle Door.jpg"
},"sort" : [
"Durdle Door.jpg"
]
},{
...
"_source" : {
"filename" : "Frost.jpg"
},"sort" : [
"Frost.jpg"
]
},{
...
"_source" : {
"filename" : "Users order.mp4"
},"sort" : [
"Users order.mp4"
]
},{
...
"_source" : {
"filename" : "a.png"
},"sort" : [
"a.png"
]
},{
...
"_source" : {
"filename" : "f.png"
},"sort" : [
"f.png"
]
},{
...
"_source" : {
"filename" : "p.png"
},"sort" : [
"p.png"
]
},{
...
"_source" : {
"filename" : "z.png"
},"sort" : [
"z.png"
]
}
]
,则另一个文件中的样式无效。
在下面的示例中,BasedUpon
将具有指定的ListView
,但没有SeparatorColor
样式的BackgroundColor
。
BaseStyles.xaml
BasedUpon
SomeChildStyles.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">
<Color x:Key="LightPrimaryColor">LightPink</Color>
<Color x:Key="DarkPrimaryColor">DarkGreen</Color>
<Style x:Key="BaseColorStylePrimary" TargetType="View">
<Setter Property="BackgroundColor"
Value="{AppThemeBinding Light={StaticResource LightPrimaryColor},Dark={StaticResource DarkPrimaryColor}}" />
</Style>
</ResourceDictionary>
App.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">
<Style x:Key="ListViewStyleBasedOn"
TargetType="ListView"
BasedOn="{StaticResource BaseColorStylePrimary}">
<Setter Property="SeparatorColor"
Value="{AppThemeBinding Light=Orange,Dark=Red}" />
</Style>
</ResourceDictionary>
似乎他们made some changes a few years ago实现了我要做的事情,但是当they introduced AppThemeBinding
并没有扩展来处理此问题时?
解决方法
使用MergedDictionaries
为多个文件设置样式。
App.xaml
:
<Application.Resources>
<ResourceDictionary>
<!--Global Styles-->
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Styles/Base.xaml" />
<ResourceDictionary Source="/Styles/Child.xaml" />
</ResourceDictionary.MergedDictionaries>
...
</ResourceDictionary>
</Application.Resources>
Base.xaml
在文件夹Styles
中:
<?xml version="1.0" encoding="utf-8" ?>
<!--<?xaml-comp compile="true" ?>-->
<ResourceDictionary xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<Style x:Key="BaseStyle" TargetType="Label">
<Setter Property="BackgroundColor" Value="Green" />
</Style>
</ResourceDictionary>
Child.xaml
在文件夹Styles
中:
<?xml version="1.0" encoding="utf-8" ?>
<ResourceDictionary xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<Style x:Key="ChildStyle" TargetType="Label" BasedOn="{StaticResource BaseStyle}">
<Setter Property="FontAttributes" Value="Italic" />
</Style>
</ResourceDictionary>
XAML用法示例:
<Label Text="Background" Style="{StaticResource BaseStyle}"/>
<Label Text="Background+Italic" Style="{StaticResource ChildStyle}"/>
另请参阅Better Resource Organization in Xamarin.Forms
编辑:
要使用不带部分类的Xaml ResourceDictionary
(由类x:Class
指示),请除去类.xaml.cs
文件和{{1 }}属性。请注意,属性x:Class
应该为Build Action
。
应在项目文件中观察属性:
Embedded resource
,
- 即使this blog post表示不再需要对每个单独的资源文件进行调用,也可以在文件后面添加代码并调用
InitializeComponent()
。 - 请勿使用fancy clean way删除用于定义
<ResourceDictionary>
的额外代码
更新了 BaseStyles.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"
<!--change is here-->
x:Class="StyleInheritance.BaseStyles">
<Color x:Key="LightPrimaryColor">LightPink</Color>
<Color x:Key="DarkPrimaryColor">DarkGreen</Color>
<Style x:Key="BaseColorStylePrimary" TargetType="View">
<Setter Property="BackgroundColor"
Value="{AppThemeBinding Light={StaticResource LightPrimaryColor},Dark={StaticResource DarkPrimaryColor}}" />
</Style>
</ResourceDictionary>
BaseStyles.xaml.cs
using Xamarin.Forms;
namespace StyleInheritance
{
public partial class SomeStyles : ResourceDictionary
{ public SomeStyles() { InitializeComponent(); } }
}
SomeChildStyles.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"
<!--change is here-->
x:Class="StyleInheritance.SomeChildStyles">
<Style x:Key="ListViewStyleBasedOn"
TargetType="ListView"
BasedOn="{StaticResource BaseColorStylePrimary}">
<Setter Property="SeparatorColor"
Value="{AppThemeBinding Light=Orange,Dark=Red}" />
</Style>
</ResourceDictionary>
添加了 SomeChildStyles.xaml.cs
using Xamarin.Forms;
namespace StyleInheritance
{
public partial class SomeChildStyles : ResourceDictionary
{ public SomeStyles() { InitializeComponent(); } }
}
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"
x:Class="StyleInheritance.App">
<Application.Resources>
<!--change is here-->
<ResourceDictionary>
<ResourceDictionary Source="BaseStyles.xaml" />
<ResourceDictionary Source="SomeChildStyles.xaml" />
</ResourceDictionary>
</Application.Resources>
</Application>
我在自述文件中创建了完整的Sample project,带有一些其他详细信息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。