2013-07-27 4 views
1

Я попытался написать свой собственный холст и хотел нарисовать маленький лабиринт, состоящий из маленьких прямоугольников. Моя проблема в том, что я просто получаю 4 маленьких точки на экране, а не 4 Rectangles (при попытке использовать поле 2 X 2). Вот код:Проблемы с пользовательским холстом

public class LabyrinthCanvas : System.Windows.Controls.Canvas 
{ 
    public static readonly int RectRadius = 60; 

    public ObservableCollection<ObservableCollection<Rect>> Rectangles; 

    public LabyrinthCanvas() 
    { 
     Rectangles = new ObservableCollection<ObservableCollection<Rect>>(); 
    } 

    public void AddRectangles(int Height, int Width) 
    { 
     for (int iHeight = 0; iHeight < Height; iHeight++) 
     { 
      ObservableCollection<Rect> newRects = new ObservableCollection<Rect>(); 
      newRects.CollectionChanged += RectanglesChanged; 
      Rectangles.Add(newRects); 

      for (int iWidth = 0; iWidth < Width; iWidth++) 
      { 
       Rect rect = new Rect(iHeight * RectRadius, iWidth * RectRadius); 
       Rectangles[iHeight].Add(rect); 
      } 
     } 
    } 

    public void RectanglesChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
     if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add) 
     { 

      foreach (object rect in e.NewItems) 
      { 
       if (rect is Rect) 
       { 
        this.Children.Add(((Rect)rect).innerRectangle); 
        System.Windows.Controls.Canvas.SetTop(((Rect)rect).innerRectangle, ((Rect)rect).YPos); 
        System.Windows.Controls.Canvas.SetLeft(((Rect)rect).innerRectangle, ((Rect)rect).XPos); 
       } 
      } 
     } 
     else if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove) 
     { 
      foreach (Rect rect in e.OldItems) 
      { 
       this.Children.Remove(rect.innerRectangle); 
      } 
     } 
    } 
} 

public class Rect : INotifyPropertyChanged 
{ 
    public Rect(int YPos, int XPos) 
    { 
     innerRectangle.Stroke = System.Windows.Media.Brushes.Black; 
     innerRectangle.Fill = System.Windows.Media.Brushes.Blue; 
     this.YPos = YPos; 
     this.XPos = XPos; 
    } 

    public System.Windows.Shapes.Rectangle innerRectangle = new System.Windows.Shapes.Rectangle(); 

    public int YPos; 
    public int XPos; 
} 

Я думаю, главное в том, что:

this.Children.Add(((Rect)rect).innerRectangle); 
        System.Windows.Controls.Canvas.SetTop(((Rect)rect).innerRectangle, ((Rect)rect).YPos); 
        System.Windows.Controls.Canvas.SetLeft(((Rect)rect).innerRectangle, ((Rect)rect).XPos); 

Im используя собственный класс «Rect», потому что мне нужно некоторые дополнительные свойства, которые я удалены из показанного кода и Я не могу унаследовать от Rectangle.

ответ

1

Я не совсем уверен, что вы хотите, чтобы ваш конечный результат выглядел так, поэтому я, вероятно, не смогу предложить точное решение, которое вам нужно.

Это говорит о том, что причина, по которой вы получаете небольшие точки на экране, а не прямоугольники, заключается в том, что холст отображает innerRectangle вашего объекта Rect в указанных координатах, но вы никогда не инициализируете установку размеров от innerRectangle.

Точки, которые вы видите, это те прямоугольники ширины и высоты, которые имеют отображаемый штрих Black (точка).

Вы можете увидеть, что происходит, если вы пытаетесь что-то вдоль этих линий:

public System.Windows.Shapes.Rectangle innerRectangle = new System.Windows.Shapes.Rectangle() { Width = 10, Height = 10 }; 
Смежные вопросы