0

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 を見ていましたが、見つけた唯一の記事は、コレクションを既存のコントロールにバインドすることに関するものであり、カスタムのユーザー描画のものではありませんでした。そのため、この時点で混乱して行き詰まりました。

4

2 に答える 2

0

おそらく、2D 配列のように機能する独自のカスタム コレクションを作成できますが、INotifyCollectionChange インターフェイスも実装する必要があります。実装はそれほど難しくありません。そうすれば、WPF はコレクションの変更をリッスンし、必要に応じてコントロールを更新します。

于 2011-05-01T12:27:11.020 に答える
0

サンプルが参考になるかと思います。

于 2011-05-24T05:13:41.410 に答える