我无法理解如何完成渲染
public class Shape{}
public class Circle: Shape{}
public class Square: Shape
{
public List<Circle> CircleList{ get; private set; }
}
我有一个包含Shape对象的List,现在我要完成的是让每个对象在网格中呈现。
如果对象是Square,则应该有一个嵌套网格,用于保存CircleList属性中的Circle项目
我尝试过使用ItemsControl和HierarchicalDataTemplate,无法让它工作,我尝试在ItemsControl中嵌套ItemsControl,我对WPF很新,所以我有点在这里摸索不知道是什么“适当的”解决方案。我确实设法在TreeView中渲染上面的内容,但我想要完成的是一个渲染形状的绘图板。
更新
“绘图板”应包含项目,每个项目应在容器中呈现。
如果对象是Square Square,则Square容器应该有一个嵌套容器来保存CircleList属性中的Circle对象。
答案 0 :(得分:1)
我使用原始类构建了一个示例来演示这个。这是代码隐藏:
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
Square square = new Square();
square.CircleList = new List<Circle>() { new Circle(25) };
_shapes.Add(square);
}
private List<Shape> _shapes = new List<Shape>();
public List<Shape> Shapes
{
get { return _shapes; }
}
}
public abstract class Shape { }
public class Circle : Shape
{
public double Diameter { get; private set; }
public Circle(double diameter)
{
Diameter = diameter;
}
}
public class Square : Shape
{
public List<Circle> CircleList { get; set; }
}
所以你可以看到我在我的Shapes列表中添加了一个Square,其中包含一个直径为25的圆。请注意,这并没有为使用绝对坐标定位形状添加任何支持;我假设你已经有了适合的东西。
现在是XAML:
<Window x:Class="TestWpfApplication.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestWpfApplication"
Title="Window1"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Window.Resources>
<DataTemplate DataType="{x:Type local:Circle}">
<Ellipse Stroke="Black"
Width="{Binding Diameter}"
Height="{Binding Diameter}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:Square}">
<Border BorderThickness="1" BorderBrush="Black">
<ItemsControl ItemsSource="{Binding CircleList}"/>
</Border>
</DataTemplate>
</Window.Resources>
<ListBox ItemsSource="{Binding Shapes}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<Canvas/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
以下是您的DataTemplates;你可以看到圆圈只是用椭圆渲染。另一方面,Square有一个嵌入的ItemsControl,用于呈现其包含的项目。我还在它周围画了一个边框来制作方形。
结果如下:
alt text http://img212.imageshack.us/img212/8658/squarewithcirclecontent.png
答案 1 :(得分:0)
你可以尝试使用两个DataTemplates,一个用于Circle(只是渲染一个Circle),一个用于Square。 Square DataTemplate应该渲染一个Grid(只是给它一个边框使它看起来像一个正方形),然后设置嵌套Grid的DataContext =“{Binding CircleList}”。
我不是百分百确定你是如何将形状列表转换为网格的,但听起来你已经解决了这个问题,所以为了简单起见,我会省略它。 :)