Я хочу сделать нарисованный пользователем элемент управления с единственной целью отображения массива Color [,]. Сам элемент управления должен рисовать NxM сетку прямоугольников соответствующих цветов.
Я пытаюсь наследовать от FrameworkElement и переопределить метод OnRender:
public class CustomControl1 : FrameworkElement
{
static CustomControl1()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));
}
public Color[,] ColorCollection
{
get { return (Color[,])GetValue(ColorGridProperty); }
set { SetValue(ColorGridProperty, value); }
}
public static readonly DependencyProperty ColorGridProperty =
DependencyProperty.Register("ColorCollection", typeof(Color[,]), typeof(CustomControl1),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender));
protected override void OnRender(DrawingContext drawingContext)
{
if (ColorCollection != null)
{
int dimx = this.ColorCollection.GetLength(0);
int dimy = this.ColorCollection.GetLength(1);
double w = this.ActualWidth / dimx;
double h = this.ActualWidth / dimy;
for (int x = 0; x < dimx; x++)
{
for (int y = 0; y < dimy; y++)
{
SolidColorBrush brush = new SolidColorBrush(ColorCollection[x, y]);
drawingContext.DrawRectangle(brush, null, new Rect(x * w, 0, w, this.ActualHeight));
}
}
}
}
}
Проблема в том, что мой элемент управления не перерисовывается, когда я изменяю элементы в базовом массиве. Он отлично работает, когда я назначаю новый массив или изменяю размер элемента управления.
Очевидно, мне нужен другой класс, который каким-то образом уведомляет управление о внутренних изменениях в коллекции. Я просматривал INotifyCollectionChange и ObservableCollection, но единственные статьи, которые я обнаружил, касались привязки коллекций к существующим элементам управления, а не к пользовательским элементам, нарисованным пользователем. Поэтому я запутался и застрял на этом.