2010-05-06 119 views
13

我正在寻找WPF的颜色对话框? 有没有内置的? 我应该建立自己的? 还是赢得32个互操作? 如果是这样,怎么样?是否有WPF的颜色对话框?

+10

真的... WPF ...和没有颜色选择器...什么... – serhio 2010-09-29 12:16:29

+1

检查[扩展WPF到olkit](http://wpftoolkit.codeplex.com/),它是WPF控件的集合。 – jwillmer 2012-04-18 08:27:10

+0

[Extended WPF Toolkit](http://wpftoolkit.codeplex.com/)中有一个[ColorPicker Control](http://wpftoolkit.codeplex.com/wikipage?title=ColorPicker),它可以放在对话。 – SpeedCoder5 2014-03-06 20:13:14

回答

3

继承人使用附加属性,一个简单的颜色选择器应该有人来寻找示例代码

public static class BrushExtender 
{ 
    public readonly static DependencyProperty BrushProperty = DependencyProperty.RegisterAttached("Brush", typeof(Brush), typeof(BrushExtender), new PropertyMetadata(Brushes.Black,DoBrushChanged)); 

    public readonly static DependencyProperty RedChannelProperty = DependencyProperty.RegisterAttached("RedChannel", typeof(int), typeof(BrushExtender), new PropertyMetadata(DoColorChangedRed)); 

    public readonly static DependencyProperty GreenChannelProperty = DependencyProperty.RegisterAttached("GreenChannel", typeof(int), typeof(BrushExtender), new PropertyMetadata(DoColorChangedGreen)); 

    public readonly static DependencyProperty BlueChannelProperty = DependencyProperty.RegisterAttached("BlueChannel", typeof(int), typeof(BrushExtender), new PropertyMetadata(DoColorChangedBlue)); 

    public readonly static DependencyProperty AlphaChannelProperty = DependencyProperty.RegisterAttached("AlphaChannel", typeof(int), typeof(BrushExtender), new PropertyMetadata(DoColorChangedAlpha)); 

    public readonly static DependencyProperty ColourValueProperty = DependencyProperty.RegisterAttached("ColourValue", typeof(string), typeof(BrushExtender), new PropertyMetadata(DoValueChanged)); 

    public static void SetRedChannel(DependencyObject o, int value) 
    { 
     o.SetValue(RedChannelProperty, value); 
    } 

    public static void SetGreenChannel(DependencyObject o, int value) 
    { 
     o.SetValue(GreenChannelProperty, value); 
    } 

    public static void SetBlueChannel(DependencyObject o, int value) 
    { 
     o.SetValue(BlueChannelProperty, value); 
    } 

    public static void SetAlphaChannel(DependencyObject o, int value) 
    { 
     o.SetValue(AlphaChannelProperty, value); 
    } 

    public static void SetBrush(DependencyObject o, SolidColorBrush brush) 
    { 
     o.SetValue(BrushProperty, brush); 
    } 

    public static void SetColourValue(DependencyObject o, string value) 
    { 
     o.SetValue(ColourValueProperty, value); 
    } 

    private static void DoColorChangedRed(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var color = ((SolidColorBrush)d.GetValue(BrushProperty)).Color; 
     DoColorChange(d, (int)e.NewValue, c => c.R,() => Color.FromArgb(color.A, ((byte)(int)e.NewValue), color.G , color.B)); 
    } 

    private static void DoColorChangedGreen(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var color = ((SolidColorBrush)d.GetValue(BrushProperty)).Color; 
     DoColorChange(d, (int)e.NewValue, c => c.G,() => Color.FromArgb(color.A, color.R, ((byte)(int)e.NewValue), color.B)); 
    } 

    private static void DoColorChangedBlue(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var color = ((SolidColorBrush)d.GetValue(BrushProperty)).Color; 
     DoColorChange(d, (int)e.NewValue, c => c.B,() => Color.FromArgb(color.A, color.R, color.G, (byte)(int)e.NewValue)); 
    } 

    private static void DoColorChangedAlpha(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var color = ((SolidColorBrush)d.GetValue(BrushProperty)).Color; 
     DoColorChange(d, (int)e.NewValue, c => c.A,() => Color.FromArgb((byte)(int)e.NewValue, color.R, color.G, color.B)); 
    } 

    private static void DoColorChange(DependencyObject d, int newValue, Func<Color, int> colorCompare, Func<Color> getColor) 
    { 
     var color = ((SolidColorBrush)d.GetValue(BrushProperty)).Color; 
     if (colorCompare(color) == newValue) 
      return; 
     var newBrush = new SolidColorBrush(getColor()); 
     d.SetValue(BrushProperty, newBrush); 
     d.SetValue(ColourValueProperty, newBrush.Color.ToString()); 
    } 

    private static void DoValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var color = ((SolidColorBrush)d.GetValue(BrushProperty)).Color; 
     if (color.ToString() == (string)e.NewValue) 
      return; 
     Color? newColour = null; 
     try 
     { 
      newColour = (Color) ColorConverter.ConvertFromString((string) e.NewValue); 
     } 
     catch{} 
     if (newColour == null) 
      return; 
     var newBrush = new SolidColorBrush(newColour.Value); 
     d.SetValue(BrushProperty, newBrush); 
    } 


    private static void DoBrushChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     if (e.NewValue == e.OldValue) 
      return; 
     var colour = ((SolidColorBrush)e.NewValue).Color; 
     d.SetValue(RedChannelProperty,(int)colour.R); 
     d.SetValue(GreenChannelProperty,(int)colour.G); 
     d.SetValue(BlueChannelProperty,(int)colour.B); 
     d.SetValue(AlphaChannelProperty,(int)colour.A); 
     d.SetValue(ColourValueProperty,colour.ToString()); 
    } 
} 

,在这里它被用来

<Window x:Class="ChannelColourBrush.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:c="clr-namespace:ChannelColourBrush" Title="Window1" Height="300" Width="300"> 
<Grid> 
    <Grid.ColumnDefinitions> 
    <ColumnDefinition Width="Auto" /> 
    <ColumnDefinition Width="Auto" /> 
    <ColumnDefinition Width="Auto" /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
    <RowDefinition Height="Auto" /> 
    <RowDefinition Height="Auto" /> 
    <RowDefinition Height="Auto" /> 
    <RowDefinition Height="Auto" /> 
    <RowDefinition Height="Auto" /> 
    <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 

    <TextBlock Text="Red" /> 
    <TextBlock Text="Green" Grid.Row="1" /> 
    <TextBlock Text="Blue" Grid.Row="2" /> 
    <TextBlock Text="Alpha" Grid.Row="3" /> 

    <Slider Name="redSlider" Grid.Column="1" Minimum="0" Maximum="255" Width="200" Height="20" Grid.ColumnSpan="2" Value="{Binding ElementName=rect, Path=(c:BrushExtender.RedChannel), Mode=TwoWay}" /> 
    <Slider Name="greenSlider" Grid.Column="1" Grid.Row="1" Minimum="0" Maximum="255" Width="200" Height="20" Grid.ColumnSpan="2" Value="{Binding ElementName=rect, Path=(c:BrushExtender.GreenChannel), Mode=TwoWay}" /> 
    <Slider Name="blueSlider" Grid.Column="1" Grid.Row="2" Minimum="0" Maximum="255" Width="200" Height="20" Grid.ColumnSpan="2" Value="{Binding ElementName=rect, Path=(c:BrushExtender.BlueChannel), Mode=TwoWay}" /> 
    <Slider Name="alphaSlider" Grid.Column="1" Grid.Row="3" Minimum="0" Maximum="255" Width="200" Height="20" Grid.ColumnSpan="2" Value="{Binding ElementName=rect, Path=(c:BrushExtender.AlphaChannel), Mode=TwoWay}" /> 

    <Rectangle Fill="SandyBrown" Name="rect" Width="200" Height="50" Grid.Row="4" Grid.ColumnSpan="3" Margin="0,20,0,10" 
    c:BrushExtender.Brush="{Binding RelativeSource={RelativeSource Self}, Path=Fill, Mode=TwoWay}"/> 
    <TextBlock Text="Colour Value" Margin="5,0,5,0" Grid.Row="5" HorizontalAlignment="Center" /> 
    <TextBox Text="{Binding ElementName=rect, Path=(c:BrushExtender.ColourValue), Mode=TwoWay}" Margin="0,0,0,0" Grid.Row="5" Grid.Column="1" Width="100" HorizontalAlignment="Center" /> 
    <Button Content="Update" IsEnabled="{Binding ElementName=grid, Path=SelectedItem.SomeValue}"/> 
</Grid> 

4

我写了一个简单的WPF颜色选择器支持以下功能一会儿回

  • 3种不同类型的色样
  • 不透明度滑块的
  • 为开放
  • 标准对话按钮

这里选择颜色

  • 设置到当前颜色鼠标动机控制是在壳体的文章你需要它:http://www.codeproject.com/Articles/33001/WPF-A-Simple-Color-Picker-With-Preview

  • +0

    这看起来非常好。如果我只能显示色轮而不是所有其他控件,我都会使用它。 – Steven 2013-09-06 23:37:41