2010-05-06 34 views
13

Tôi đang tìm kiếm một hộp thoại màu cho WPF? Có thiết bị tích hợp sẵn không? Tôi có nên tự xây dựng không? Hoặc làm Win 32 interop? Nếu có, làm thế nào?Có hộp thoại màu cho WPF không?

+10

thực sự ... WPF ... và không có bộ chọn màu nào ... – serhio

+1

Kiểm tra [Mở rộng WPF thành olkit] (http://wpftoolkit.codeplex.com/), đó là một bộ sưu tập các điều khiển WPF. – jwillmer

+0

Có [Kiểm soát ColorPicker] (http://wpftoolkit.codeplex.com/wikipage?title=ColorPicker) trong [Bộ công cụ mở rộng WPF] (http://wpftoolkit.codeplex.com/) có thể được đặt trên hộp thoại. – SpeedCoder5

Trả lời

3

Heres một bảng chọn màu sắc đơn giản sử dụng tài sản gắn liền, nên bất cứ ai được tìm kiếm mã ví dụ

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()); 
    } 
} 

và ở đây nó đang được sử dụng

<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

Tôi đã viết một WPF màu đơn giản công cụ chọn hỗ trợ các tính năng sau đây trong khi quay lại

  • 3 loại khác nhau của màu swatch
  • Thanh trượt Opacity
  • Điều khiển chuột mover để lựa chọn màu
  • Sets màu hiện hành về mở
  • nút thoại Chuẩn

Dưới đây là bài viết trong trường hợp bạn cần nó: http://www.codeproject.com/Articles/33001/WPF-A-Simple-Color-Picker-With-Preview

+0

Điều đó trông rất đẹp. Tôi sẽ sử dụng nó nếu tôi chỉ có thể hiển thị bánh xe màu và không phải tất cả các điều khiển khác. – Steven

Các vấn đề liên quan