WPF Отображение родительских и дочерних отношений - PullRequest
1 голос
/ 03 августа 2009

Я не могу обернуть голову, как выполнить рендеринг этого

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

У меня есть список, содержащий объекты Shape, и теперь я хочу, чтобы каждый объект отображался в сетке.

Если объект является квадратом, то должна быть вложенная сетка, содержащая элементы Circle из свойства CircleList

Я пробовал использовать ItemsControl и HierarchicalDataTemplate, не смог заставить его работать, я пытался вложить ItemsControl в ItemsControl, я довольно новичок в WPF, так что я вроде как что-то здесь не знаю «правильное» решение будет. Мне удалось отобразить вышеизложенное в TreeView, но я пытаюсь выполнить чертежную доску, которая отображает фигуры.

UPDATE

«Чертеж» должен содержать элементы, каждый элемент должен отображаться в контейнере.

Если объект имеет тип Square, у контейнера Square должен быть вложенный контейнер для хранения объектов Circle из свойства CircleList.

Ответы [ 2 ]

1 голос
/ 03 августа 2009

Скотт довольно близко, но не совсем там; установка DataContext Grid не будет отображать содержащиеся объекты 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; }
}

Итак, вы можете видеть, что я добавил один квадрат в свой список фигур, который содержит круг диаметром 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>

Вот ваши шаблоны данных; Вы можете видеть, что Круг отображается просто с помощью Эллипса. У Square, с другой стороны, есть встроенный ItemsControl, который отображает содержащиеся в нем элементы. Я также нарисовал границу вокруг нее, чтобы придать ей квадратную форму.

Вот результат:

альтернативный текст http://img212.imageshack.us/img212/8658/squarewithcirclecontent.png

0 голосов
/ 03 августа 2009

Вы можете попробовать использовать два DataTemplates, один для круга (просто отображает круг) и один для квадрата. Square DataTemplate должен визуализировать Grid (просто дать ему границу, чтобы он выглядел как квадрат), а затем установить DataContext вложенной Grid = "{Binding CircleList}".

Я не уверен на 100%, как вы преобразуете список фигур в сетку, но похоже, что вы уже решили эту проблему, поэтому я просто опущу это для простоты. :)

...