2016-03-10 51 views
1

我以类似的方式定义调色板类的内置System.Windows.Media.Colors静态类。Xaml引用静态属性,如System.Windows.Media.Colors

理想情况下,我想以类似的方式参考Colors类。例如

<Rectangle Fill="Red"/> 

最简洁的版本,我至今是:

<Rectangle Fill="{x:Static Palette:PrimaryPalette.Red}"/> 

而且我PrimaryPalette类与返回类型的SolidColorBrush而不是颜色的属性。

所以我的问题是双重的

  1. 有没有引用一个自定义颜色集的更简洁的方法是什么?
  2. 框架中的内置颜色类是否特殊,或者是否有某种创建以相似方式操作的类的方法?

回答

0

如果冗长和易于使用的是你最关心的话,我会建议使用自定义的MarkupExtension:

public class CustomColor : MarkupExtension 
{ 
    [ConstructorArgument("Key")] 
    public object Key { get; set; } 

    public CustomColor() 
    { 
    } 

    public CustomColor(object key) 
    { 
     this.Key = key; 
    } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     try 
     { 
      var color = (Color)ColorConverter.ConvertFromString(this.Key.ToString()); 
      return new SolidColorBrush(color); 
     } 
     catch 
     { 
      return new SolidColorBrush(Colors.Transparent); 
     } 
    } 

} 

通过以下对this page的提示,你还可以添加命名空间以此扩展到在XAML处理器这反过来又可以让你用这样的:

<Rectangle Fill="{CustomColor Blue}" /> 

这是做事情,在这个特殊的例子中,我简单地解析密钥字符串和convertin只是其中一种方法将其转换成一种颜色,但您可以使用任何所需的键类型和/或转换代码来替换它。

+0

这太棒了,正是我在找的东西。感谢您的帮助 – Colin

+0

很高兴为您服务。我忘记提及一件非常重要的事情:如果您打算使用自定义扩展而不必声明名称空间,那么您需要将它放在它自己的类库项目中。不知道为什么,但其他人也遇到了它,似乎是在框架中的错误。 –

0

标记答案是正确的答案我只是认为我会分享我的使用情况,这与标记稍有不同,但仅限于我的具体需求。

在我来说,我想要的是一套新的颜色,以便能够通过名称进行选择,以便实现这个我使用的字典

public class PrimaryPalette : MarkupExtension 
{ 
    public static Dictionary<PrimaryPaletteColours, Color> Palette => 
     new Dictionary<PrimaryPaletteColours, Color> 
     { 
      { PrimaryPaletteColours.CustomMagenta, Color.FromArgb(0xFF, 0xDA, 0x42, 0xAA) }, 
      { PrimaryPaletteColours.CustomBlue,  Color.FromArgb(0xFF, 0x11, 0x42, 0xFF) }, 
      { PrimaryPaletteColours.CustomGreen,  Color.FromArgb(0xFF, 0x33, 0xDE, 0x60) }, 
      { PrimaryPaletteColours.CustomOrange,  Color.FromArgb(0xFF, 0xDA, 0x80, 0x22) }, 
      { PrimaryPaletteColours.CustomPurple,  Color.FromArgb(0xFF, 0xCC, 0x00, 0xFF) }, 
      { PrimaryPaletteColours.CustomRed,  Color.FromArgb(0xFF, 0xEE, 0x42, 0x00) }, 
      { PrimaryPaletteColours.CustomTurqoise, Color.FromArgb(0xFF, 0x10, 0xAB, 0xBC) }, 
      { PrimaryPaletteColours.CustomGold,  Color.FromArgb(0xFF, 0xDA, 0xA0, 0x22) } 
     }; 

    public PrimaryPalette() { } 

    public PrimaryPalette(PrimaryPaletteColours key) { Key = key; } 

    [ConstructorArgument("Key")] 
    public PrimaryPaletteColours Key { get; set; } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     try 
     { 
      return new SolidColorBrush(Palette[Key]); 
     } 
     catch 
     { 
      return new SolidColorBrush(Colors.Transparent); 
     } 
    } 
} 

public enum PrimaryPaletteColours 
{ 
    CustomMagenta, 
    CustomBlue, 
    CustomGreen, 
    CustomOrange, 
    CustomPurple, 
    CustomRed, 
    CustomTurqoise, 
    CustomGold 
} 

命名空间后调整马克建议我的用法是:

{PrimaryPalette CustomMagenta} 

此方法还为您提供智能感知和编译时验证以确保颜色名称正确。