[英]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的屬性。
所以我的問題有兩個
如果您最關心冗長和易於使用,那么我建議您使用自定義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.