自定义画布的问题

本文关键字:问题 自定义 | 更新日期: 2023-09-27 18:25:13

我试图编写自己的自定义画布,并想画一个由小矩形组成的小迷宫。我的问题是,我在屏幕上只得到4个小点,而不是4个矩形(当用2X2字段尝试时)。这里有一些代码:

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);

我使用自己的类"Rect",因为我需要一些额外的属性,这些属性是我从显示的代码中删除的,并且我不能从Rectangle继承。

自定义画布的问题

我不完全确定你想要的最终结果是什么样子,所以我可能无法建议你想要的确切解决方案。

也就是说,在屏幕上获得小点而不是矩形的原因是,画布正在指定坐标处渲染Rect对象的innerRectangle,但您从未初始化设置该innerRectangle的尺寸。

你看到的点是那些没有宽度/高度的矩形,它们渲染了Black笔划(点)。

如果你尝试以下方法,你可以看到发生了什么:

    public System.Windows.Shapes.Rectangle innerRectangle = new System.Windows.Shapes.Rectangle() { Width = 10, Height = 10 };