簡體   English   中英

Xaml參考靜態屬性,例如System.Windows.Media.Colors

[英]Xaml reference static properties like System.Windows.Media.Colors

我正在以類似於內置System.Windows.Media.Colors靜態類的方式定義自定義調色板類。

理想情況下,我想以與Colors類類似的方式引用它。 例如

<Rectangle Fill="Red"/>

到目前為止,我最簡潔的版本是:

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

我的PrimaryPalette類還具有返回類型為SolidColorBrush而不是Color的屬性。

所以我的問題有兩個

  1. 有沒有更簡潔的引用自定義顏色集的方法?
  2. 內置的Colors類在框架內是特殊的還是有某種方法可以創建以類似方式運行的類?

如果您最關心冗長和易於使用,那么我建議您使用自定義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);
        }
    }

}

通過遵循此頁面上的提示,您還可以將此擴展名的名稱空間添加到XAML處理器,從而允許您像這樣使用它:

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

這只是一種處理方式,在這個特定示例中,我只是解析鍵字符串並將其轉換為顏色,但是您可以將其替換為所需的任何鍵類型和/或轉換代碼。

Marks的答案是正確的答案,我只是想與他人分享我的用法,這與Marks略有不同,但這僅是出於我的特定需求。

就我而言,我希望能夠通過名稱選擇一組新顏色,因此為了實現這一目標,我使用了詞典

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
}

在名稱空間調整后,Mark建議我的用法是:

{PrimaryPalette CustomMagenta}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM