Wie kann ich Style Inheritance mit mehreren Dateien? Ich konnte Eigenständige Ressourcenwörterbücher, aber wenn ein untergeordneter Stil BasedUpon
ein Stil in einer anderen Datei ist, funktioniert er nicht.
Im folgenden Beispiel hat das ListView
das angegebene SeparatorColor
, jedoch nicht das BackgroundColor
aus dem BasedUpon
-Stil.
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">
<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>
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">
<Style x:Key="ListViewStyleBasedOn"
TargetType="ListView"
BasedOn="{StaticResource BaseColorStylePrimary}">
<Setter Property="SeparatorColor"
Value="{AppThemeBinding Light=Orange, Dark=Red}" />
</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"
x:Class="StyleInheritance.App">
<Application.Resources>
<ResourceDictionary Source="BaseStyles.xaml" />
<ResourceDictionary Source="SomeChildStyles.xaml" />
</Application.Resources>
</Application>
Es sieht so aus, als hätten sie vor einigen Jahren einige Änderungen vorgenommen um das zu erreichen, was ich versuche, aber wenn sie haben AppThemeBinding
eingeführt es wurde nicht erweitert, um damit umzugehen 🤔?
2 Antworten
- Fügen Sie jeder separaten Ressourcendatei einen Code hinter der Datei mit einem Aufruf von
InitializeComponent()
hinzu, obwohl dieser Blog-Beitrag sagt, dass es nicht mehr erforderlich ist. - Verwenden Sie nicht den ausgefallenen, sauberen Weg < / a>, um zusätzlichen Code zum Definieren von
<ResourceDictionary>
zu entfernen
BaseStyles.xaml wurde aktualisiert
<?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 hinzugefügt
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>
Ich habe ein vollständiges Beispielprojekt mit erstellt Einige zusätzliche Details in der Readme.
Verwenden Sie MergedDictionaries
zum Stylen mit mehreren Dateien.
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
im Ordner 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
im Ordner 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>
Beispiel für die Verwendung von XAML:
<Label Text="Background" Style="{StaticResource BaseStyle}"/>
<Label Text="Background+Italic" Style="{StaticResource ChildStyle}"/>
Siehe auch Bessere Ressourcenorganisation in Xamarin.Forms
Bearbeiten:
Um eine Xaml ResourceDictionary
ohne Teilklasse (Code hinter der Klasse) zu verwenden (wie durch das Attribut x:Class
angegeben), entfernen Sie den Code hinter der Klasse .xaml.cs
und das Attribut x:Class
. Bitte beachten Sie, dass die Eigenschaft Build Action
Embedded resource
sein sollte.
Die Eigenschaften sollten in der Projektdatei beachtet werden:
<ItemGroup>
<EmbeddedResource Update="Styles\Child.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
<!--<Generator>MSBuild:Compile</Generator>-->
</EmbeddedResource>
<EmbeddedResource Update="Styles\Base.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
<!--<Generator>MSBuild:Compile</Generator>-->
</EmbeddedResource>
</ItemGroup>
Neue Fragen
xamarin
Xamarin ist eine Plattform bestehend aus Xamarin.iOS, Xamarin.Android, Xamarin.Mac und Xamarin Test Cloud. Sie können plattformübergreifende native Apps für iOS, Android und Mac schreiben und Ihre App über den gesamten Lebenszyklus verfolgen. Die Einführung von Xamarin.Forms unterstützt die native UI-Entwicklung für iOS, Android und Windows