关于DrawingVisual的问题。
我尝试在WPF中使用DrawingVisual绘制内容。根据微软的示例代码,写了第一版的代码。它工作正常。
但是DrawingVisual类是继承自ContainerVisual的,它有一个Children属性用于存储Visual,于是我想用DrawingVisual对象来存储visual集合,就写了第二个版本的代码。但是它只有在改变窗体大小的时候才会显示绘制的内容。这是为什么?
(这是版本1的代码)
(这是版本2的代码)
关于DrawingVisual的问题。
我尝试在WPF中使用DrawingVisual绘制内容。根据微软的示例代码,写了第一版的代码。它工作正常。
但是DrawingVisual类是继承自ContainerVisual的,它有一个Children属性用于存储Visual,于是我想用DrawingVisual对象来存储visual集合,就写了第二个版本的代码。但是它只有在改变窗体大小的时候才会显示绘制的内容。这是为什么?
(这是版本1的代码)
(这是版本2的代码)
在WPF中,当你使用DrawingVisual时,它是为了提供一个轻量级的可视元素,以便可以直接通过代码进行图形绘制。在你的第一版本代码中,你使用了一个VisualCollection来管理你的DrawingVisual对象。这是正确的做法。
但是,在你的第二个版本代码中,你试图直接访问DrawingVisual的Children属性。这里的问题是,尽管DrawingVisual确实从ContainerVisual继承并具有Children属性,但在DrawingVisual的上下文中,这个属性并不像你预期的那样工作。
DrawingVisual的Children属性主要是为ContainerVisual的子类所设计的,而不是为DrawingVisual自身所设计的。因此,直接访问DrawingVisual的Children属性不会像你预期的那样工作。
为了解决你的问题,你应该继续使用VisualCollection来管理你的DrawingVisual对象。如果你希望组合多个DrawingVisual对象,你可以在同一个VisualCollection中添加多个DrawingVisual。
VisualCollection vcollection;
DrawingVisual dv1 = new();
DrawingVisual dv2 = new();
// 在VisualCollection中添加DrawingVisual
vcollection.Add(dv1);
vcollection.Add(dv2);
然后,你可以通过遍历VisualCollection来获取和操作每个DrawingVisual。
总之,直接访问DrawingVisual的Children属性不会工作,因为它不是为DrawingVisual所设计的。你应该继续使用VisualCollection来管理你的DrawingVisual对象。