2016-03-10 53 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} 

此方法還爲您提供智能感知和編譯時驗證以確保顏色名稱正確。