【发布时间】:2018-09-18 03:34:46
【问题描述】:
我刚刚开始学习 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 插件可以帮助解决这个问题,但我想念 MakeLighter 和 MakeDarker 的功能。
问题:
有没有办法在 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>
...或类似的东西。理想情况下,某种类型的内联语句允许在分配颜色的任何位置进行颜色修改。
欢迎任何开箱即用的想法。谢谢!!
编辑:
如果有人想要,这里是扩展方法代码:
using System.Windows.Media; // Do not use System.Drawing for WPF Color
public static class clsExtension_Color
{
public static Color MakeLighter(this Color thisColor, double lightnessPercent)
{
lightnessPercent = lightnessPercent.ForceBounds(0, 1);
return Blend(thisColor, Color.FromRgb(255,255,255), lightnessPercent);
}
public static Color MakeDarker(this Color thisColor, double darknessPercent)
{
darknessPercent = darknessPercent.ForceBounds(0, 1);
return Blend(thisColor, Color.FromRgb(0,0,0), darknessPercent);
}
public static Color Blend(this Color thisColor, Color blendToColor, double blendToPercent)
{
blendToPercent = (1 - blendToPercent).ForceBounds(0, 1);
byte r = (byte)((thisColor.R * blendToPercent) + blendToColor.R * (1 - blendToPercent));
byte g = (byte)((thisColor.G * blendToPercent) + blendToColor.G * (1 - blendToPercent));
byte b = (byte)((thisColor.B * blendToPercent) + blendToColor.B * (1 - blendToPercent));
return Color.FromArgb(255, r, g, b);
}
}
【问题讨论】:
标签: c# wpf xaml colors extension-methods