我想为显示一个Color [,]数组的唯一目的制作一个用户绘制的控件。控件本身应绘制相应颜色的矩形的NxM网格。WPF:什么是在用户绘制的控件中显示二维数组的正确方法
我试图从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,但我发现的唯一文章是关于将集合绑定到现有控件,而不是自定义用户绘制的集合。所以我感到困惑,并坚持在这一点上。