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
}
}