基本上,我如何在静态类或类似的类中创建自己的一组颜色,以便我可以执行以下操作:
存在什么:
<Setter ... Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
我想要什么:
<Setter ... Value="{DynamicResource {x:Static MyColors.Color1}}"/>
基本上,我如何在静态类或类似的类中创建自己的一组颜色,以便我可以执行以下操作:
存在什么:
<Setter ... Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
我想要什么:
<Setter ... Value="{DynamicResource {x:Static MyColors.Color1}}"/>
资源键可以是任何东西,因此您可以同时使用 aColor
作为键和值:
public static class MyColors
{
static MyColors()
{
App.Current.Resources.Add(MyHighlightColorKey, MyHighlightColorKey);
}
public static readonly Color MyHighlightColorKey = Color.FromArgb(255, 0, 88, 0);
}
静态构造函数使用自身作为应用程序资源的键来添加颜色。
(在内部SystemColors
用于SystemResourceKeys
每种定义的颜色或画笔,但是您无法访问该类(这是有道理的),或者ResourceKey
如果您对使用该值作为自己的键有疑问,您可以进行子类化)
你可以像这样使用它:
<TextBox>
<TextBox.Background>
<SolidColorBrush Color="{DynamicResource {x:Static local:MyColors.MyHighlightColorKey}}"/>
</TextBox.Background>
</TextBox>
如果您需要在本地级别覆盖密钥,您也可以这样做:
<Window.Resources>
<Color x:Key="{x:Static local:MyColors.MyHighlightColorKey}" A="255" R="255" G="0" B="0"/>
</Window.Resources>
编辑:如果你有很多颜色、画笔和诸如此类的东西,你也可以使用反射在构造函数中进行资源注册(我使用了字段,如果你使用属性来公开数据,你需要稍微调整一下):
static MyColors()
{
FieldInfo[] keyFieldInfoArray = typeof(MyColors).GetFields();
foreach (var keyFieldInfo in keyFieldInfoArray)
{
object value = keyFieldInfo.GetValue(null);
App.Current.Resources.Add(value, value);
}
}
以为我会加入另一种选择。您可以通过执行以下操作来使用静态资源...
public struct MyColors
{
public static Brush Color1
{
get { return Brushes.Red; } // or whatever you like
}
public static Brush Color2
{
get { return Brushes.Blue; }
}
}
然后在您的 XAML 中,使用:
"{x:Static local:MyColors.Color1}"
我刚刚花了 10 分钟试图让它与 DynamicResource 扩展一起工作,但我做不到。如果有人知道如何(或为什么),请告诉我们:)
你可以很容易地做到这一点。您必须定义以下类:
public class MyColors
{
public static string Color1{ get{return "Color1Key";}}
}
例如在你的App.xaml
你做:
<Application ...>
<Application.Resources>
<Color x:Key="Color1Key">#FF969696</Color>
</Application.Resources>
</Application>
因为静态字符串实际上只是用于强类型,所以我通常不创建这样的静态类,而只使用我定义的任何键,所以它变成:
<Setter ... Value="{DynamicResource Color1Key}"/>
(我相信你也可以使用强输入,<Color x:Key="{x:Static MyColors.Color1}">#FF969696</Color>
但我现在不确定......)
(还要注意使用x:Static
你必须指定 MyColors 所在的命名空间,这样它就变成了{x:Static local:MyColors.Color1}
)