WPF: как правильно отобразить 2D-массив в нарисованном пользователем элементе управления - PullRequest
0 голосов
/ 01 мая 2011

Я хочу сделать нарисованный пользователем элемент управления с единственной целью отображения массива 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, но единственные статьи, которые я обнаружил, касались привязки коллекций к существующим элементам управления, а не к пользовательским элементам, нарисованным пользователем. Поэтому я запутался и застрял на этом.

Ответы [ 2 ]

0 голосов
/ 24 мая 2011

Я думаю образец может быть полезным.

0 голосов
/ 01 мая 2011

Вы, вероятно, можете создать собственную коллекцию для себя, которая работает как ваш 2D-массив, но вам также необходимо реализовать интерфейс INotifyCollectionChange, который не так сложен в реализации. Таким образом, WPF будет прослушивать изменения вашей коллекции и при необходимости обновлять элемент управления.

...