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
spottedmahn 12 Aug. 2020 im 18:30

2 Antworten

Beste Antwort
  1. 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.
  2. 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.

1
spottedmahn 14 Aug. 2020 im 03:23

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>
0
spottedmahn 18 Aug. 2020 im 14:23