在用户绘制的控件中显示2D数组的正确方法是什么?

本文关键字:方法 数组 是什么 显示 绘制 用户 控件 2D | 更新日期: 2023-09-27 17:53:57

我想创建一个用户绘制的控件,其唯一目的是显示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,但我发现的唯一文章是关于将集合绑定到现有控件,而不是自定义用户绘制的。所以我很困惑,在这一点上卡住了

在用户绘制的控件中显示2D数组的正确方法是什么?

您可能可以为自己创建一个自定义集合,就像您的2D数组一样,但您还需要实现INotifyCollectionChange接口,这并不难实现。这样,WPF就会监听您的集合更改,并在必要时更新控件。

我认为这个示例可能有用。