【问题标题】:How can I set custom colors values in a Xaml Value field?如何在 Xaml 值字段中设置自定义颜色值?
【发布时间】:2010-11-11 20:19:22
【问题描述】:

所以我有一些这样的 XAML:

<Trigger Property="ItemsControl.AlternationIndex" Value="2">
    <Setter Property="Background" Value="Red"></Setter>
</Trigger>

如何将颜色Red 设置为250 200 150 之类的颜色?我尝试了Color 250 200 150250 200 150,但不起作用。有什么想法吗?

【问题讨论】:

    标签: c# .net wpf xaml


    【解决方案1】:

    使用 HTML 风格的颜色。

        <Trigger Property="ItemsControl.AlternationIndex" Value="2">
            <Setter Property="Background" Value="#FF0000"></Setter>
        </Trigger>
    

    或者,如果你想要 alpha 透明度:

        <Trigger Property="ItemsControl.AlternationIndex" Value="2">
            <Setter Property="Background" Value="#80FF0000"></Setter>
        </Trigger>
    

    或使用您的示例颜色 250,200,150:

        <Trigger Property="ItemsControl.AlternationIndex" Value="2">
            <Setter Property="Background" Value="#FAC896"></Setter>
        </Trigger>
    

    【讨论】:

    • 谢谢,您知道如何在 VS 中轻松地将颜色从 RGB 转换为 HTML 吗?我的意思是我认为是 RGB 和 HSV,而不是 HTML:O
    • 当我说“HTML 颜色”时,指的是说明符的格式,而不是颜色空间。格式为 #RRGGBB#AARRGGBB,其中 R、G 和 B 为十六进制,而不是十进制。
    • 谢谢,这很好,但我不知道该怎么做。就像当我看到 255 217 220 时,我会想到浅红色,反之亦然,甚至在 HSV 中,我也能很快想象出我脑海中的颜色。但是在我的脑海中用十六进制做这个,从来没有做过,似乎我需要一个计算器,对吧?
    • Windows Calculator 可以为您完成:使用科学视图,输入您的数字,然后将其从“Dec”切换为“Hex”。
    • 谢谢,我想我会被十六进制颜色卡住。
    【解决方案2】:

    对不起,我错了。使用它的方法是使用从 0 到 1 的浮点值。

    <Trigger Property="ItemsControl.AlternationIndex" Value="2"> 
        <Setter Property="Background" Value="sc#1.0,0.7,1.0,0.5"></Setter> 
    </Trigger>
    

    要使用 ARGB 值,我们必须使用它,但不那么直接

    <Trigger Property="ItemsControl.AlternationIndex" Value="2"> 
        <Setter Property="Background">
            <Setter.Value>
                <SolidColorBrush>
                    <SolidColorBrush.Color>
                        <Color A="255" R="250" G="200" B="150"/>
                    </SolidColorBrush.Color>
                </SolidColorBrush>
            </Setter.Value>
        </Setter> 
    </Trigger> 
    

    更新
    您也可以使用自定义MarkupExtension

    <Trigger Property="ItemsControl.AlternationIndex" Value="2"> 
        <Setter Property="Background" Value="{markup:BrushFromArgb 255, 250, 200, 150}"/>
    </Trigger>
    

    BrushFromArgbExtension

    public class BrushFromArgbExtension : MarkupExtension
    {
        public BrushFromArgbExtension() { }
        public BrushFromArgbExtension(byte a, byte r, byte g, byte b)
        {
            A = a;
            R = r;
            G = g;
            B = b;
        }
    
        public byte A { get; set; }
        public byte R { get; set; }
        public byte G { get; set; }
        public byte B { get; set; }
    
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return new SolidColorBrush(Color.FromArgb(A, R, G, B));
        }
    }
    

    类似的MarkupExtension也可以用于Color

    <SolidColorBrush Color="{markup:FromArgb 255, 255, 200, 150}"/>
    

    FromArgbExtension

    public class FromArgbExtension : MarkupExtension
    {
        public FromArgbExtension() { }
        public FromArgbExtension(byte a, byte r, byte g, byte b)
        {
            A = a;
            R = r;
            G = g;
            B = b;
        }
    
        public byte A { get; set; }
        public byte R { get; set; }
        public byte G { get; set; }
        public byte B { get; set; }
    
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return Color.FromArgb(A, R, G, B);
        }
    }
    

    【讨论】:

    • 这就是黄金。你知道sc是什么意思吗?您还知道在程序性能方面这是否比使用 HTML 颜色更慢或更快?我记得一个朋友告诉我 WPF 使用 HTML 颜色是因为它们解析速度更快。
    • 好问题,scRGB 代表什么?任何人? :) 我不相信解析中有任何实时差异,但我不能确定。但是,除非这对您来说是一个真正的瓶颈,否则这听起来像是过早的优化:)
    • 您在 scRGB 颜色空间中指定颜色:en.wikipedia.org/wiki/ScRGB
    • 是的,我查看了该页面,但找不到明确的“s”代表和“c”代表。但也许这不是一开始的问题。我可能读错了
    • @FredrikHedblad 这位先生太棒了!为长期存在的问题提供了出色的解决方案。谢谢!
    【解决方案3】:

    您可以将 XAML 控件元素上的“背景”属性直接设置为十六进制值。

    <Button Background="#292929">
    

    如果您愿意,也可以在开头添加 alpha。

    <Button Background="#55292929">
    

    了解更多here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      相关资源
      最近更新 更多