1

我无法理解如何完成渲染

public class Shape{}
public class Circle: Shape{}
public class Square: Shape
{
    public List<Circle> CircleList{ get; private set; }
}

我有一个包含 Shape 对象的列表,现在我想要完成的是将每个对象呈现在网格中。

如果对象是 Square,则应该有一个嵌套网格,其中包含 CircleList 属性中的 Circle 项

我尝试过使用 ItemsControl 和 HierarchicalDataTemplate,但无法使其正常工作,我尝试将 ItemsControl 嵌套在 ItemsControl 中,我对 WPF 很陌生,所以我在这里有点摸索,不知道什么是“正确的”解决方案是。我确实设法在 TreeView 中渲染了上面的内容,但我想要完成的是一个渲染形状的绘图板。

更新

“绘图板”应该包含项目,每个项目都应该在一个容器中呈现。

如果对象是 Square 类型,Square 容器应该有一个嵌套容器来保存来自 CircleList 属性的 Circle 对象。

4

2 回答 2

1

斯科特非常接近,但并不完全在那里;设置 Grid 的 DataContext 不会呈现包含的 Circle 对象。您需要的是一个嵌入式控件,它可以呈现自己的项目,然后将该控件的 ItemsSource 属性绑定到 CircleList。

我已经使用您的原始类构建了一个示例来演示这一点。下面是代码隐藏:

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>

这是您的数据模板;您可以看到 Circle 是用 Ellipse 简单呈现的。另一方面,Square 有一个嵌入的 ItemsControl,用于呈现其包含的项目。我还在它周围画了一个边框来制作方形。

结果如下:

替代文字 http://img212.imageshack.us/img212/8658/squarewithcirclecontent.png

于 2009-08-03T17:55:28.817 回答
0

您可以尝试使用两个 DataTemplate,一个用于 Circle(仅渲染一个 Circle),一个用于 Square。Square DataTemplate 应该呈现一个 Grid(只需给它一个边框以使其看起来像一个正方形),然后设置嵌套 Grid 的 DataContext="{Binding CircleList}"。

我不是 100% 确定您如何将形状列表转换为网格,但听起来您已经解决了这个问题,所以为了简单起见,我将省略它。:)

于 2009-08-03T15:41:55.873 回答