xaml基于另一种颜色定义颜色

ctehm74n  于 2023-05-21  发布在  其他
关注(0)|答案(2)|浏览(153)

我正在学习WinRT,我为我的程序定义了一个自定义主题,包括覆盖一些默认颜色
目前,我在我的App.xaml中做了类似的事情

<Application>
    <Application.Resource>
        <ResourceDictionary>
            ...
            <Color x:Key="PrimaryColor">#FF0055A3</Color>
            <Color x:Key="PrimaryColorHighlighShade">#FF1263B0</Color>
            <Color x:Key="PrimaryColorClickShade">#FF2674BD</Color>
            ...
            <SolidColorBrush x:Key="SliderTrackDecreaseBackgroundThemeBrush" Color="{StaticResoruce PrimaryColor}" />
            <SolidColorBrush x:Key="SliderTrackDecreasePointerOverBackgroundThemeBrush" Color="{StaticResoruce PrimaryColorHighlighShade}" />
            <SolidColorBrush x:Key="SliderTrackDecreasePressedBackgroundThemeBrush" Color="{StaticResoruce PrimaryColorClickShade}" />
            ...
        </ResourceDictionary>
    </Application.Resource>

要获得高光阴影和ClickShade,我打开Photoshop,后藤HSB滑块,并将S向下移动和B向上移动,但我想知道我是否可以在XAML中做到这一点,所以我所要做的就是改变PrimaryColor和其他颜色,并相应地进行调整。

rdlzhqv9

rdlzhqv91#

您可以绑定到一个静态资源(参见Is it possible to supply a type converter for a static resource in WPF?),并使用一个值转换器根据您提供的颜色构造一个新的颜色。

编辑:

下面是一些代码来解释:
值转换器代码(为了简单起见,我总是只添加红色,你可以根据自己的喜好进行更复杂的计算):

class ColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is Color)
        {
            var theColor = Color.Add((Color)value, Color.FromArgb(255,255,0,0));
            return theColor;
        }
        else
        {
            return null;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

我的App.Xaml看起来像这样:

<Application x:Class="SO_15979100.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:local="clr-namespace:SO_15979100"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <Color x:Key="PrimaryColor">#FF0055A3</Color>
        <local:ColorConverter x:Key="MyConverter" />
        <SolidColorBrush x:Key="PrimaryColorBrush" Color="{StaticResource PrimaryColor}" />
        <SolidColorBrush x:Key="ConvertedPrimaryColorBrush" Color="{Binding Source={StaticResource PrimaryColor}, Converter={StaticResource MyConverter}}" />
    </Application.Resources>
</Application>

请注意,我已经包含了一个本地名称空间,以便随时可以使用转换器。
我的主窗口是这样定义的:

<Window x:Class="SO_15979100.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
    
        <Rectangle Grid.Column="0" Fill="{StaticResource PrimaryColorBrush}" />
        <Rectangle Grid.Column="1" Fill="{StaticResource ConvertedPrimaryColorBrush}" />
    </Grid>
</Window>

左边的长方形是你的颜色,右边的是粉红色。

suzh9iv8

suzh9iv82#

您不需要使用Photoshop来更改色彩空间。Visual Studio 2012和Expression Blend都有RGB、HSB、HLS和CYMK色彩空间工具。

  • 在资源字典中,选择SolidColorBrush。
  • 在属性“网格”中,单击颜色项。

  • 在下拉列表中,选择“编辑资源”。

  • 诀窍是单击“资源”对话框中的R、G或B字母(带下划线的字母)。这将导致在VisualStudio编辑器中出现一个菜单。选择您的新色彩空间。

  • 选择另一个颜色空间(在您的示例中为HSB)。然后使用该对话框更改“饱和度”或“亮度”值。

  • 最后,单击确定按钮,颜色值在资源字典中修改。

相关问题