/// <summary> /// Raised when the <see cref="Color"/> property is modified. /// </summary> private void OnColorChanged() { bool isInitializing = !templateApplied && initializingProperty == null; if (isInitializing) { initializingProperty = ColorProperty; } if (!interlock) { InternalColor = ColorHSV.FromColor(Color); var colorRGBA = InternalColor.ToColor(); interlock = true; SetCurrentValue(RedProperty, (byte)(Math.Round(colorRGBA.R * 255.0f))); SetCurrentValue(GreenProperty, (byte)(Math.Round(colorRGBA.G * 255.0f))); SetCurrentValue(BlueProperty, (byte)(Math.Round(colorRGBA.B * 255.0f))); SetCurrentValue(AlphaProperty, (byte)(Math.Round(colorRGBA.A * 255.0f))); SetCurrentValue(HueProperty, InternalColor.H); SetCurrentValue(SaturationProperty, InternalColor.S * 100.0f); SetCurrentValue(BrightnessProperty, InternalColor.V * 100.0f); interlock = false; } if (!suspendBindingUpdates) { RenderColorPickerSurface(); } else if (colorPreviewRenderSurface != null) { colorPreviewRenderSurface.Fill = new SolidColorBrush(Color.ToSystemColor()); } UpdateBinding(ColorProperty); if (isInitializing) { initializingProperty = null; } }
/// <summary> /// Update the color surface brush according to the current <see cref="Hue"/> value. /// </summary> private void RenderColorPickerSurface() { if (colorPreviewRenderSurface != null) { colorPreviewRenderSurface.Fill = new SolidColorBrush(Color.ToSystemColor()); } if (colorPickerRenderSurface != null) { // Ensure the color picker is loaded if (!double.IsNaN(colorPickerRenderSurface.Width) && !double.IsNaN(colorPickerRenderSurface.Height)) { var width = (int)colorPickerRenderSurface.Width; var height = (int)colorPickerRenderSurface.Height; PixelFormat pf = PixelFormats.Bgr32; int rawStride = (width * pf.BitsPerPixel + 7) / 8; var rawImage = new byte[rawStride * height]; for (int j = 0; j < height; ++j) { float y = j / (float)(height - 1); for (int i = 0; i < width; ++i) { float x = i / (float)(width - 1); var color4 = new ColorHSV(Hue, x, y, 1.0f).ToColor(); var color = new Color(color4); rawImage[(i + j * width) * 4 + 0] = color.B; rawImage[(i + j * width) * 4 + 1] = color.G; rawImage[(i + j * width) * 4 + 2] = color.R; } } colorPickerRenderSurface.Fill = new DrawingBrush(new ImageDrawing(BitmapSource.Create(width, height, 96, 96, pf, null, rawImage, rawStride), new Rect(0.0f, 0.0f, width, height))); } } }
/// <inheritdoc/> public override object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var brush = value as SolidColorBrush; if (brush != null) { value = brush.Color; } if (value is Color) { var color = (Color)value; if (targetType == typeof(System.Windows.Media.Color)) { return(color.ToSystemColor()); } if (targetType == typeof(Color)) { return(color); } if (targetType == typeof(Color3)) { return(color.ToColor3()); } if (targetType == typeof(Color4)) { return(color.ToColor4()); } if (targetType.IsAssignableFrom(typeof(SolidColorBrush))) { return(new SolidColorBrush(color.ToSystemColor())); } if (targetType == typeof(string)) { return(ColorExtensions.RgbaToString(color.ToRgba())); } } if (value is Color3) { var color = (Color3)value; if (targetType == typeof(System.Windows.Media.Color)) { return(color.ToSystemColor()); } if (targetType == typeof(Color)) { return((Color)color); } if (targetType == typeof(Color3)) { return(color); } if (targetType == typeof(Color4)) { return(color.ToColor4()); } if (targetType.IsAssignableFrom(typeof(SolidColorBrush))) { return(new SolidColorBrush(color.ToSystemColor())); } if (targetType == typeof(string)) { return(ColorExtensions.RgbToString(color.ToRgb())); } } if (value is Color4) { var color = (Color4)value; if (targetType == typeof(System.Windows.Media.Color)) { return(color.ToSystemColor()); } if (targetType == typeof(Color)) { return((Color)color); } if (targetType == typeof(Color3)) { return(color.ToColor3()); } if (targetType == typeof(Color4)) { return(color); } if (targetType.IsAssignableFrom(typeof(SolidColorBrush))) { return(new SolidColorBrush(color.ToSystemColor())); } if (targetType == typeof(string)) { return(ColorExtensions.RgbaToString(color.ToRgba())); } } if (value is System.Windows.Media.Color) { var wpfColor = (System.Windows.Media.Color)value; if (targetType.IsAssignableFrom(typeof(SolidColorBrush))) { return(new SolidColorBrush(wpfColor)); } var color = new Color(wpfColor.R, wpfColor.G, wpfColor.B, wpfColor.A); if (targetType == typeof(System.Windows.Media.Color)) { return(color); } if (targetType == typeof(Color)) { return(color); } if (targetType == typeof(Color3)) { return(color.ToColor3()); } if (targetType == typeof(Color4)) { return(color.ToColor4()); } if (targetType == typeof(string)) { return(ColorExtensions.RgbaToString(color.ToRgba())); } } var stringColor = value as string; if (stringColor != null) { var intValue = ColorExtensions.StringToRgba(stringColor); if (targetType == typeof(Color)) { return(Color.FromRgba(intValue)); } if (targetType == typeof(Color3)) { return(new Color3(intValue)); } if (targetType == typeof(Color4)) { return(new Color4(intValue)); } if (targetType == typeof(System.Windows.Media.Color)) { return(System.Windows.Media.Color.FromArgb( (byte)((intValue >> 24) & 255), (byte)(intValue & 255), (byte)((intValue >> 8) & 255), (byte)((intValue >> 16) & 255))); } if (targetType.IsAssignableFrom(typeof(SolidColorBrush))) { return(new SolidColorBrush(System.Windows.Media.Color.FromArgb( (byte)((intValue >> 24) & 255), (byte)(intValue & 255), (byte)((intValue >> 8) & 255), (byte)((intValue >> 16) & 255)))); } if (targetType == typeof(string)) { return(stringColor); } } #if DEBUG if (value == null || value == DependencyProperty.UnsetValue) { return(DependencyProperty.UnsetValue); } throw new NotSupportedException("Requested conversion is not supported."); #else return(DependencyProperty.UnsetValue); #endif }