2011-05-01 2 views
0

Color [,] 배열을 표시 할 목적으로 만 사용자가 컨트롤을 만들고 싶습니다. 컨트롤 자체는 해당 색상의 NxM 사각형의 사각형을 그려야합니다.WPF : 사용자가 그린 컨트롤에 2D 배열을 표시하는 올바른 방법은 무엇입니까

나는 FrameworkElement에서 상속하기 위해 노력하고있어 및 방법의 OnRender 오버라이드 (override) :

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

2D 배열처럼 작동하는 사용자 정의 컬렉션을 만들 수도 있지만 INotifyCollectionChange 인터페이스를 구현해야합니다.이 인터페이스는 구현하기가 어렵지 않습니다. 그렇게하면 WPF는 컬렉션 변경 사항을 청취하고 필요한 경우 컨트롤을 업데이트합니다.

0

저는 the sample이 유용 할 수 있다고 생각합니다.