我想获得各种色调 - 这可以在UWP中完成吗?

时间:2016-06-30 09:46:29

标签: c# uwp

在我的应用中,我想展示用户定义颜色的各种色调。我找不到UWP方法来做到这一点。可能吗?我用C#编程。

3 个答案:

答案 0 :(得分:0)

您可以使用LinearGradientBrush或RadialGradientBrush。您只需添加两个GradientStop来显示范围。使用渐变画笔设置要绘制的某个元素的背景。

<Page
x:Class="CarServiceLogger.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:CarServiceLogger"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<!--{ThemeResource ApplicationPageBackgroundThemeBrush}-->
<Grid >
    <Grid.Background>
        <LinearGradientBrush StartPoint="0,0" EndPoint="1,0">
            <GradientStop Offset="0" Color="#FF0000"   />
            <GradientStop Offset="1" Color="#000000" />
        </LinearGradientBrush>
    </Grid.Background>

</Grid>
</Page>

答案 1 :(得分:0)

这是一个关于阴影的棘手问题。阴影应该至少从一种颜色到另一种颜色。最简单的色调是从选定的颜色到黑色。您可以将其实现为将{alpha}频道(透明度)从255更改为0,并在下方显示黑色(背景)。请参阅蓝色阴影:https://en.wikipedia.org/wiki/Tints_and_shades#/media/File:Kleurenovergang_van_zwart_naar_blauw.png

答案 2 :(得分:0)

这不是UWP平台支持的标准,但是使用数学很容易;)我已经创建了一个辅助类来实现这一点。还有一个用于定义HSV结构的额外类。 诀窍是获得颜色的色调,饱和度和亮度(或值),然后修改亮度(值)。

在下面的课程中,调用GetColors方法获取该颜色的阴影列表。

public class ColorHelper
{
    public static List<Windows.UI.Color> GetColors(Windows.UI.Color baseColor, int max)
    {
        // fill color shades list
        List<Windows.UI.Color> colorShades = new List<Windows.UI.Color>();
        HSVColor hsv = ColorHelper.RGBtoHSV(baseColor);
        hsv.V = 255; // alway use highest brightness to determine collection of shades
        double v = hsv.V / max;
        for (int i = 0; i < max; i++)
        {
            hsv.V = v * i;
            if (hsv.V > 255) hsv.V = 255;
            colorShades.Add(ColorHelper.HSVtoRGB(hsv));
        }
        return colorShades;
    }

    public static HSVColor RGBtoHSV(Windows.UI.Color rgb)
    {
        double max, min, chroma;
        HSVColor hsv = new HSVColor();

        min = Math.Min(Math.Min(rgb.R, rgb.G), rgb.B);
        max = Math.Max(Math.Max(rgb.R, rgb.G), rgb.B);
        chroma = max - min;

        if (chroma != 0)
        {
            if (rgb.R == max)
            {
                hsv.H = (rgb.G - rgb.B) / chroma;
                if (hsv.H < 0.0) hsv.H += 6.0;
            }
            else if (rgb.G == max)
            {
                hsv.H = ((rgb.B - rgb.R) / chroma) + 2.0;
            }
            else
            {
                hsv.H = ((rgb.R - rgb.G) / chroma) + 4.0;
            }
            hsv.H *= 60.0;
            hsv.S = chroma / max;
        }

        hsv.V = max;
        hsv.A = rgb.A;

        return hsv;
    }

    public static Windows.UI.Color HSVtoRGB(HSVColor hsv)
    {
        double min, chroma, hdash, x;
        Windows.UI.Color rgb = new Windows.UI.Color();

        chroma = hsv.S * hsv.V;
        hdash = hsv.H / 60.0;
        x = chroma * (1.0 - Math.Abs((hdash % 2.0) - 1.0));

        if (hdash < 1.0)
        {
            rgb.R = (byte)chroma;
            rgb.G = (byte)x;
        }
        else if (hdash < 2.0)
        {
            rgb.R = (byte)x;
            rgb.G = (byte)chroma;
        }
        else if (hdash < 3.0)
        {
            rgb.G = (byte)chroma;
            rgb.B = (byte)x;
        }
        else if (hdash < 4.0)
        {
            rgb.G = (byte)x;
            rgb.B = (byte)chroma;
        }
        else if (hdash < 5.0)
        {
            rgb.R = (byte)x;
            rgb.B = (byte)chroma;
        }
        else if (hdash < 6.0)
        {
            rgb.R = (byte)chroma;
            rgb.B = (byte)x;
        }

        min = hsv.V - chroma;

        rgb.R += (byte)min;
        rgb.G += (byte)min;
        rgb.B += (byte)min;
        rgb.A = (byte)hsv.A;

        return rgb;
    }
}

public class HSVColor
{
    public double H { get; set; }
    public double S { get; set; }
    public double V { get; set; }
    public double A { get; set; }

    public HSVColor()
    {
        H = S = V = A = 1.0;
    }
}