WPF显示父子关系

时间:2009-08-03 15:29:22

标签: wpf parent-child

我无法理解如何完成渲染

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对象。

2 个答案:

答案 0 :(得分: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>

以下是您的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}”。

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