How to create a color canvas for color picker (wpf)

后端 未结 1 684
醉酒成梦
醉酒成梦 2020-12-11 10:39

I want to create a custom color picker like in Visual Studio or Blend or here (http://www.codeproject.com/Articles/779105/Color-Canvas-and-Color-Picker-WPF-Toolkit). And I h

相关标签:
1条回答
  • 2020-12-11 11:45

    The hue bar can be created with a regular LinearGradientBrush. The Level/Saturation panel can be done with a LinearGradientBrush of the appropriate color along the X axis and another as an opacity mask along the Y, with the whole thing drawn against a black background.

    <Window.Resources>
    
        <!-- Change this to any pure hue i.e. no more than 2 rgb components set and at least 1 set to FF -->
        <Color x:Key="CurrentColor">#00FF00</Color>
    
        <LinearGradientBrush x:Key="HueBrush" StartPoint="0,0" EndPoint="0,1">
            <LinearGradientBrush.GradientStops>
                <GradientStop Color="#FF0000" Offset="0" />
                <GradientStop Color="#FFFF00" Offset="0.167" />
                <GradientStop Color="#00FF00" Offset="0.333" />
                <GradientStop Color="#00FFFF" Offset="0.5" />
                <GradientStop Color="#0000FF" Offset="0.667" />
                <GradientStop Color="#FF00FF" Offset="0.833" />
                <GradientStop Color="#FF0000" Offset="1" />
            </LinearGradientBrush.GradientStops>
        </LinearGradientBrush>
    
        <VisualBrush x:Key="LevelSaturationBrush" TileMode="None">
            <VisualBrush.Visual>
                <Canvas Background="Black" Width="1" Height="1" SnapsToDevicePixels="True">
                    <Rectangle Width="1" Height="1" SnapsToDevicePixels="True">
                        <Rectangle.Fill>
                            <LinearGradientBrush StartPoint="0,0" EndPoint="1,0">
                                <LinearGradientBrush.GradientStops>
                                    <GradientStop Color="White" Offset="0" />
                                    <GradientStop Color="{DynamicResource CurrentColor}" Offset="1" />
                                </LinearGradientBrush.GradientStops>
                            </LinearGradientBrush>
                        </Rectangle.Fill>
                        <Rectangle.OpacityMask>
                            <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                                <LinearGradientBrush.GradientStops>
                                    <GradientStop Color="#FFFFFFFF" Offset="0"/>
                                    <GradientStop Color="#00FFFFFF" Offset="1"/>
                                </LinearGradientBrush.GradientStops>
                            </LinearGradientBrush>
                        </Rectangle.OpacityMask>
                    </Rectangle>
                </Canvas>
            </VisualBrush.Visual>
        </VisualBrush>
    
    </Window.Resources>
    
    <StackPanel Orientation="Horizontal">
        <Rectangle Fill="{StaticResource LevelSaturationBrush}" Width="200" Height="200" Margin="10" Stroke="Black" StrokeThickness="1" SnapsToDevicePixels="True" />
        <Rectangle Fill="{StaticResource HueBrush}" Width="20" Height="200" Margin="10" Stroke="Black" StrokeThickness="1" SnapsToDevicePixels="True" />
    </StackPanel>
    

    Result:

    0 讨论(0)
提交回复
热议问题