using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Media; namespace Dominion.NET_WPF.Controls { /// /// SmallColorPicker user control /// This code is open source published with the Code Project Open License (CPOL). /// public partial class ucSmallColorPicker : UserControl { #region Dependency properties public Color SelectedColor { get { return (Color)GetValue(SelectedColorProperty); } set { SetValue(SelectedColorProperty, value); } } public static readonly DependencyProperty SelectedColorProperty = DependencyProperty.Register("SelectedColor", typeof(Color), typeof(ucSmallColorPicker), new FrameworkPropertyMetadata(OnSelectedColorChanged)); public IEnumerable AvailableColors => Picker.Items.OfType(); private bool ListContains(Color newColor) { return Picker.Items.OfType().Any(c => c == newColor); } private static void OnSelectedColorChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) { var cp = obj as ucSmallColorPicker; Debug.Assert(cp != null); var newColor = (Color)args.NewValue; var oldColor = (Color)args.OldValue; if (newColor == oldColor) return; // When the SelectedColor changes, set the selected value of the combo box if (cp.Picker.SelectedValue == null || (Color)cp.Picker.SelectedValue != newColor) { // Add the color if not found if (!cp.ListContains(newColor)) { cp.AddColor(newColor); } } cp.OnColorChanged(oldColor, newColor); } #endregion #region Events public static readonly RoutedEvent ColorChangedEvent = EventManager.RegisterRoutedEvent("ColorChanged", RoutingStrategy.Bubble, typeof(RoutedPropertyChangedEventHandler), typeof(ucSmallColorPicker)); public event RoutedPropertyChangedEventHandler ColorChanged { add { AddHandler(ColorChangedEvent, value); } remove { RemoveHandler(ColorChangedEvent, value); } } protected virtual void OnColorChanged(Color oldValue, Color newValue) { var args = new RoutedPropertyChangedEventArgs(oldValue, newValue) {RoutedEvent = ColorChangedEvent}; RaiseEvent(args); } #endregion public static Brush CheckerBrush { get; } = CreateCheckerBrush(); public ucSmallColorPicker() { InitializeComponent(); } public void Clear() { Picker.Items.Clear(); } /// /// Add a color to the ColorPicker list /// /// public void AddColor(Color c) { Picker.Items.Add(c); } public static Brush CreateCheckerBrush() { // from http://msdn.microsoft.com/en-us/library/aa970904.aspx var checkerBrush = new DrawingBrush(); var backgroundSquare = new GeometryDrawing( Brushes.White, null, new RectangleGeometry(new Rect(0, 0, 8, 8))); var aGeometryGroup = new GeometryGroup(); aGeometryGroup.Children.Add(new RectangleGeometry(new Rect(0, 0, 4, 4))); aGeometryGroup.Children.Add(new RectangleGeometry(new Rect(4, 4, 4, 4))); var checkers = new GeometryDrawing(Brushes.Black, null, aGeometryGroup); var checkersDrawingGroup = new DrawingGroup(); checkersDrawingGroup.Children.Add(backgroundSquare); checkersDrawingGroup.Children.Add(checkers); checkerBrush.Drawing = checkersDrawingGroup; checkerBrush.Viewport = new Rect(0, 0, 0.5, 0.5); checkerBrush.TileMode = TileMode.Tile; return checkerBrush; } } [ValueConversion(typeof(Color), typeof(Brush))] public class ColorToBrushConverter : IValueConverter { #region IValueConverter Members public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (targetType != typeof(Brush)) return null; if (!(value is Color)) return null; var scb = new SolidColorBrush((Color)value); return scb; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } #endregion } }