我正在学习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,以及相应调整的其他颜色。
答案 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色彩空间工具。