xaml根据另一种颜色定义颜色

时间:2013-04-12 18:58:56

标签: xaml colors windows-runtime winrt-xaml

我正在学习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 Slider,然后将S Down和B向上移动,但我想知道我是否可以在XAML中执行此操作,以便所有我必须做的什么改变了PrimaryColor,以及相应调整的其他颜色。

2 个答案:

答案 0 :(得分:6)

您可以绑定到静态资源(请参阅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>

左边的矩形是你的颜色,右边的那个是粉红色。

答案 1 :(得分:0)

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

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

enter image description here

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

enter image description here

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

enter image description here

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

enter image description here

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