C# 如何在WPF XAML中创建颜色修改选项?-类似于扩展方法的东西
我刚刚开始学习WPF和XAML,对在XAML中操作属性的方法很好奇。我仍在努力学习一些基础知识,如转换器和绑定等。我可以用原生C做的一件非常好的事情是创建扩展方法来简化某些任务。我想知道是否可以为XAML创建类似的东西 具体地说 使用C#扩展方法,我创建了两个函数来修改颜色——“MakeLighter”和“MakeDarker”。这些被证明是非常方便的,可以很容易地调整颜色的阴影。例如,我可以写:C# 如何在WPF XAML中创建颜色修改选项?-类似于扩展方法的东西,c#,wpf,xaml,colors,extension-methods,C#,Wpf,Xaml,Colors,Extension Methods,我刚刚开始学习WPF和XAML,对在XAML中操作属性的方法很好奇。我仍在努力学习一些基础知识,如转换器和绑定等。我可以用原生C做的一件非常好的事情是创建扩展方法来简化某些任务。我想知道是否可以为XAML创建类似的东西 具体地说 使用C#扩展方法,我创建了两个函数来修改颜色——“MakeLighter”和“MakeDarker”。这些被证明是非常方便的,可以很容易地调整颜色的阴影。例如,我可以写: var myBackgroundColor = Color.AntiqueWhite.MakeLi
var myBackgroundColor = Color.AntiqueWhite.MakeLighter(0.10); // Makes color 10% lighter.
var myForegroundColor = Color.DarkSlateBlue.MakeDarker(0.15); // Makes color 15% darker.
这使得调整颜色阴影变得非常简单,因为您可以根据需要将其调得更亮或更暗。格雷夫妇特别喜欢与他们一起工作:
var shadow1 = Color.Gray.MakeDarker(0.20);
var shadow2 = Color.Gray.MakeDarker(0.24);
var shadow3 = Color.Gray.MakeDarker(0.28);
在XAML中,我发现使用颜色有点烦人。我知道有很多颜色选择器选项和VS插件可以帮助实现这一点,但我错过了使颜色更亮和更暗的功能
问题:
有没有办法在XAML中创建类似的MakeLighter和MakeDarker颜色操纵器?可能是有值转换器或类型转换器的东西我不知道有什么可能
后面可能有C#代码,它不需要是纯XAML,但它应该类似于扩展方法,因为它可以在使用颜色的任何地方使用
例如,理想情况下,我希望能够做到以下几点:
<LinearGradientBrush x:Key="WindowClientAreaColor" StartPoint="1,1" EndPoint="0,0">
<GradientStop Color="{MyColor Base=#FF414758 MakeLighter=0.03}" Offset="0" />
<GradientStop Color="{MyColor Base=#FF555E75 MakeDarker=0.07}" Offset="1.0" />
</LinearGradientBrush>
这里是方便的地方。就像我们有实例的扩展方法一样,xaml也有标记扩展
创建标记扩展,如下所示
public class ShadedColorExtension : MarkupExtension
{
public Color BaseColor { get; set; }
public double Lighter { get; set; }
public double Darker { get; set; }
public override object ProvideValue(IServiceProvider serviceProvider)
{
if (Lighter > 0d)
{
return BaseColor.MakeLighter(Lighter);
}
if (Darker > 0d)
{
return BaseColor.MakeDarker(Darker);
}
return BaseColor;
}
}
当属性需要值时,将调用ProvideValue方法。您可以根据需要修改ProvideValue
方法
然后在xaml中使用它,如下所示
<LinearGradientBrush x:Key="WindowClientAreaColor" StartPoint="1,1" EndPoint="0,0">
<GradientStop Color="{yourNamespace:ShadedColor BaseColor=Red, Lighter=0.03}" Offset="0" />
<GradientStop Color="{yourNamespace:ShadedColor BaseColor=#FF555E75, Darker=0.07}" Offset="1.0" />
</LinearGradientBrush>
您会注意到上面的xaml语法与伪代码完全相同,只是需要在属性之间提供逗号(,)。这很完美。我在搜索时怎么会错过这个我的谷歌浏览器一定很弱。谢谢小问题:当我尝试运行此程序时,出现了一个异常:“ArgumentException:“Color[A=255,R=79,G=87,B=108]”不是属性“Color”的有效值。“-我尝试将ProviderValue的输出格式化为#FF4F576C格式的字符串,但也无法接受。有什么想法吗?@user1689175当您遇到此异常时,您的xaml看起来如何?你从哪里得到这个例外?我在放置之前已经测试了我的代码,并确认它正常工作。请确保使用类型
System.Windows.Media.Color
,而不是System.Drawing.Color
。我这样说是因为Color.White
在media Color类中不可用。
<LinearGradientBrush x:Key="WindowClientAreaColor" StartPoint="1,1" EndPoint="0,0">
<GradientStop Color="{yourNamespace:ShadedColor BaseColor=Red, Lighter=0.03}" Offset="0" />
<GradientStop Color="{yourNamespace:ShadedColor BaseColor=#FF555E75, Darker=0.07}" Offset="1.0" />
</LinearGradientBrush>