2011-05-01 42 views
0

我想为显示一个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,但我发现的唯一文章是关于将集合绑定到现有控件,而不是自定义用户绘制的集合。所以我感到困惑,并坚持在这一点上。

回答

0

您可能可以为自己创建一个像您的二维数组一样的自定义集合,但是您还需要实现INotifyCollectionChange接口,该接口不太难实现。这样WPF会监听你的收藏变化,并在必要时更新控件。

相关问题