-
Notifications
You must be signed in to change notification settings - Fork 11
/
ColorPickerViewBase.cs
91 lines (81 loc) · 3.28 KB
/
ColorPickerViewBase.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
using ColorPicker.BaseClasses.ColorPickerEventArgs;
using ColorPicker.Interfaces;
using System;
using Xamarin.Forms;
namespace ColorPicker.BaseClasses
{
public abstract class ColorPickerViewBase : Layout<View>, IColorPicker
{
public event EventHandler<ColorChangedEventArgs> SelectedColorChanged;
public static readonly BindableProperty SelectedColorProperty = BindableProperty.Create(
nameof(SelectedColor),
typeof(Color),
typeof(IColorPicker),
Color.FromHsla(0, 0, 0.5),
propertyChanged: new BindableProperty.BindingPropertyChangedDelegate(HandleSelectedColorSet));
static void HandleSelectedColorSet(BindableObject bindable, object oldValue, object newValue)
{
if (oldValue != newValue)
{
((ColorPickerViewBase)bindable).ChangeSelectedColor((Color)newValue);
if (((ColorPickerViewBase)bindable).ConnectedColorPicker != null)
{
((ColorPickerViewBase)bindable).ConnectedColorPicker.SelectedColor = (Color)newValue;
}
((ColorPickerViewBase)bindable).RaiseSelectedColorChanged((Color)oldValue, (Color)newValue);
}
}
public Color SelectedColor
{
get
{
return (Color)GetValue(SelectedColorProperty);
}
set
{
SetValue(SelectedColorProperty, value);
}
}
public static readonly BindableProperty ConnectedColorPickerProperty = BindableProperty.Create(
nameof(ConnectedColorPicker),
typeof(IColorPicker),
typeof(IColorPicker),
null,
propertyChanged: new BindableProperty.BindingPropertyChangedDelegate(HandleConnectedColorPickerSet));
static void HandleConnectedColorPickerSet(BindableObject bindable, object oldValue, object newValue)
{
if (oldValue != null)
{
((IColorPicker)oldValue).PropertyChanged -= ((ColorPickerViewBase)bindable).BindedIColorPicker_PropertyChanged;
}
if (newValue != null)
{
((IColorPicker)newValue).PropertyChanged += ((ColorPickerViewBase)bindable).BindedIColorPicker_PropertyChanged;
((IColorPicker)newValue).SelectedColor = ((ColorPickerViewBase)bindable).SelectedColor;
}
}
public IColorPicker ConnectedColorPicker
{
get
{
return (IColorPicker)GetValue(ConnectedColorPickerProperty);
}
set
{
SetValue(ConnectedColorPickerProperty, value);
}
}
protected abstract void ChangeSelectedColor(Color color);
private void BindedIColorPicker_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName == nameof(SelectedColor))
{
SelectedColor = ((IColorPicker)sender).SelectedColor;
}
}
protected virtual void RaiseSelectedColorChanged(Color oldColor, Color newColor)
{
SelectedColorChanged?.Invoke(this, new ColorChangedEventArgs(oldColor, newColor));
}
}
}