是否可以在Xamarin.Forms中将一种颜色资源指向另一种颜色资源?

use*_*er1 6 c# xamarin xamarin.forms

我正在构建一个Xamarin Forms应用程序,目前正在草拟我的应用程序Resources,主要是我的颜色。

例如,我有以下内容:

  <Color x:Key="Slate">#404040</Color>
  <Color x:Key="Blue">#458623</Color>

  <Color x:Key="SelectedItemColour">#458623</Color>
Run Code Online (Sandbox Code Playgroud)

如您所见,我SelectedItemColour与相同Blue

我尝试了以下方法,但是没有用:

  <Color x:Key="Slate">#404040</Color>
  <Color x:Key="Blue">#458623</Color>

  <Color x:Key="SelectedItemColour" Color="{StaticResource Blue}"/>
Run Code Online (Sandbox Code Playgroud)

我知道WPF你能不能按照这里所说的答案

是否可以在Xamarin.Forms中将a Colour Resource指向另一个Colour Resource

Arc*_*nox 5

这可能是一个老问题,但我今天正试图为一个项目完成同样的事情,并且想要一个比这里提出的更优雅的解决方案。似乎没有办法纯粹使用 XAML 来完成它,但这是我最终使用的解决方案。

首先,我定义了一个名为的实用程序类ColorReference

public class ColorReference : INotifyPropertyChanged
{
    private Color color = Color.Black;

    public Color Color
    {
        get => this.color;
        set
        {
            this.color = value;
            this.OnPropertyChanged();
        }
    }

    #region INotifyPropertyChanged

    public event PropertyChangedEventHandler PropertyChanged;

    [ NotifyPropertyChangedInvocator ]
    protected virtual void OnPropertyChanged([ CallerMemberName ] string propertyName = null)
    {
        this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    #endregion

    public static implicit operator Color(ColorReference colorReference) => colorReference.Color;
}
Run Code Online (Sandbox Code Playgroud)

我并不是 100% 肯定该INotifyPropertyChanged实现是必要的,但我认为它不会有什么坏处(可能允许在运行时更改颜色;我还没有对此进行测试)。

要使用它,只需将其用作以下资源ResourceDictionary

<Color x:Key="FirstColor">#51688f</Color>
...
<utility:ColorReference x:Key="SomeOtherColorName" Color="{StaticResource FirstColor}" />
Run Code Online (Sandbox Code Playgroud)

在我的用例中,我使用它来使用主题中定义的颜色来设计 Telerik 控件的样式,这样如果我创建一个新主题,我不需要在各处复制相同的颜色值。明显的缺点是,对于除 之外的任何类型Color,都需要定义一个新类,但我怀疑我需要太多类型来像这样使用别名。希望这可以帮助其他人将来尝试做我正在做的同样的事情。


Pau*_*aul 3

您可以x:Static与静态类一起使用,以便按名称直接引用这些颜色。这样做的好处是可以将颜色集中到一个类中并最大限度地减少 XAML 的数量。

namespace ResourceColors
{
    public static class Colors
    {
        public static Color Slate = Color.FromHex("#404040");
    }
}
Run Code Online (Sandbox Code Playgroud)


<?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:local="clr-namespace:ResourceColors;assembly=ResourceColors" x:Class="ResourceColors.PageOne">
    <ContentPage.Resources>
        <ResourceDictionary>
            <Color x:Key="Blue">#458623</Color>
        </ResourceDictionary>
    </ContentPage.Resources>
    <ContentPage.Content>
        <StackLayout HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand">
            <Label Text="Test" TextColor="{x:Static local:Colors.Slate}" />
        </StackLayout>
    </ContentPage.Content>
</ContentPage>
Run Code Online (Sandbox Code Playgroud)