You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自动计算并显示叠加背景的最终颜色(取色器效果)

实现自动计算叠加半透明层后的Elevation颜色并实时更新

核心颜色叠加计算逻辑

半透明白色叠加在深色背景上的最终颜色,可通过以下规则计算:

  • 将十六进制Alpha值转为0~1的透明度:透明度 = Alpha值 / 255(例如#0D对应的透明度为13/255≈0.0509)
  • 最终RGB通道值:最终值 = 背景RGB值*(1-透明度) + 255*透明度(白色的RGB通道值均为255)
  • 将计算后的RGB值转回十六进制,组合成最终颜色代码。

方法一:自定义MarkupExtension实现ResourceDictionary内自动计算

创建自定义MarkupExtension,直接在资源字典中根据背景色和透明度生成Elevation颜色,支持背景色变更时实时更新:

using System;
using System.Windows;
using System.Windows.Markup;
using System.Windows.Media;

[MarkupExtensionReturnType(typeof(SolidColorBrush))]
public class ElevationColorExtension : MarkupExtension
{
    public DynamicResourceReference BackgroundBrushReference { get; set; }
    public byte Alpha { get; set; }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        var brush = BackgroundBrushReference.ProvideValue(serviceProvider) as SolidColorBrush;
        if (brush == null) return Brushes.Black;

        var opacity = Alpha / 255.0;
        var bgColor = brush.Color;

        byte r = (byte)Math.Round(bgColor.R * (1 - opacity) + 255 * opacity);
        byte g = (byte)Math.Round(bgColor.G * (1 - opacity) + 255 * opacity);
        byte b = (byte)Math.Round(bgColor.B * (1 - opacity) + 255 * opacity);

        var resultColor = Color.FromRgb(r, g, b);
        return new SolidColorBrush(resultColor) { DynamicResourceReference = BackgroundBrushReference };
    }
}

在ResourceDictionary中使用该扩展:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:YourNamespace">
    <SolidColorBrush x:Key="Primary" Color="#008080"/>
    <SolidColorBrush x:Key="PrimaryVariant" Color="#4DCECF"/>
    <SolidColorBrush x:Key="Secondary" Color="#B894F6"/>
    <SolidColorBrush x:Key="SecondaryVariant" Color="#9A66F4"/>

    <SolidColorBrush x:Key="Background" Color="#131313"/>
    <!-- 根据不同Alpha值生成对应Elevation颜色 -->
    <local:ElevationColorExtension x:Key="Elevation1" 
                                   BackgroundBrushReference="{DynamicResource Background}" 
                                   Alpha="0x0D"/>
    <local:ElevationColorExtension x:Key="Elevation2" 
                                   BackgroundBrushReference="{DynamicResource Background}" 
                                   Alpha="0x1A"/>
    <local:ElevationColorExtension x:Key="Elevation3" 
                                   BackgroundBrushReference="{DynamicResource Background}" 
                                   Alpha="0x29"/>
    <local:ElevationColorExtension x:Key="Elevation4" 
                                   BackgroundBrushReference="{DynamicResource Background}" 
                                   Alpha="0x38"/>

    <SolidColorBrush x:Key="OnPrimary" Color="Black"/>
    <SolidColorBrush x:Key="OnSecondary" Color="Black"/>
    <SolidColorBrush x:Key="OnBackground" Color="White"/>
</ResourceDictionary>

方法二:用IValueConverter在界面实时显示颜色代码

创建转换器,将背景色和Alpha值转换为对应的十六进制颜色代码:

using System;
using System.Globalization;
using System.Windows.Data;
using System.Windows.Media;

public class ElevationColorCodeConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values.Length != 2 || values[0] is not SolidColorBrush bgBrush || values[1] is not byte alpha)
            return "#000000";

        var opacity = alpha / 255.0;
        var bgColor = bgBrush.Color;

        byte r = (byte)Math.Round(bgColor.R * (1 - opacity) + 255 * opacity);
        byte g = (byte)Math.Round(bgColor.G * (1 - opacity) + 255 * opacity);
        byte b = (byte)Math.Round(bgColor.B * (1 - opacity) + 255 * opacity);

        return $"#{r:X2}{g:X2}{b:X2}";
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

在界面中绑定并显示颜色代码:

<Window.Resources>
    <local:ElevationColorCodeConverter x:Key="ElevationColorCodeConverter"/>
</Window.Resources>

<Grid Grid.Row="1" Grid.Column="2">
    <Border Background="{DynamicResource Background}"/>
    <Border Background="{DynamicResource Elevation1}"
            Style="{StaticResource ElevationStyle}">
        <TextBlock Style="{StaticResource TextBlockStyle}">
            <MultiBinding Converter="{StaticResource ElevationColorCodeConverter}">
                <Binding Source="{DynamicResource Background}"/>
                <Binding Source="0x0D"/> <!-- 对应Elevation1的Alpha值 -->
            </MultiBinding>
        </TextBlock>
    </Border>
</Grid>

关键说明

  • 因使用DynamicResource,当Background颜色变更时,自定义扩展和转换器会自动重新计算,实现实时更新。
  • Alpha值可按需调整,对应不同层级的Elevation透明度(如0x0D对应5%、0x1A对应10%)。

内容的提问来源于stack exchange,提问作者Blake

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 06:10:30