C# 如何在WPF XAML中创建颜色修改选项?-类似于扩展方法的东西

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

我刚刚开始学习WPF和XAML,对在XAML中操作属性的方法很好奇。我仍在努力学习一些基础知识,如转换器和绑定等。我可以用原生C做的一件非常好的事情是创建扩展方法来简化某些任务。我想知道是否可以为XAML创建类似的东西

具体地说

使用C#扩展方法,我创建了两个函数来修改颜色——“MakeLighter”和“MakeDarker”。这些被证明是非常方便的,可以很容易地调整颜色的阴影。例如,我可以写:

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>