Domanda

Non riesco a capire come realizzare il rendering

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

Ho un Elenco che contiene oggetti Shape, ora quello che voglio realizzare è il rendering di ogni oggetto in una griglia.

Se l'oggetto è un quadrato, dovrebbe esserci una griglia nidificata che contiene elementi Circle dalla proprietà CircleList

Ho provato con un ItemsControl e un HierarchicalDataTemplate, non sono riuscito a farlo funzionare, ho provato a nidificare un ItemsControl all'interno di un ItemsControl, sono abbastanza nuovo in WPF, quindi sono un po 'qui che non so cosa " corretto " la soluzione sarebbe. Sono riuscito a rendere quanto sopra in un TreeView, ma quello che sto cercando di realizzare è un tavolo da disegno che rende le forme.

Aggiorna

Il tavolo da disegno " deve contenere elementi, ogni elemento deve essere visualizzato in un contenitore.

Se l'oggetto è di tipo Square, il contenitore Square dovrebbe avere un contenitore nidificato per contenere gli oggetti Circle dalla proprietà CircleList.

È stato utile?

Soluzione

Scott è abbastanza vicino ma non abbastanza lì; l'impostazione del DataContext della griglia non renderà gli oggetti Circle contenuti. Ciò di cui hai bisogno è un controllo incorporato che può eseguire il rendering dei propri elementi e quindi associare la proprietà ItemsSource di quel controllo a CircleList.

Ho costruito un esempio usando le tue classi originali che lo dimostrano. Ecco il code-behind:

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; }
}

Quindi puoi vedere che ho aggiunto un singolo quadrato alla mia lista Forme, che contiene un cerchio di diametro 25. Nota che questo non aggiunge alcun supporto per posizionare le forme usando coordinate assolute; Presumo che tu abbia già messo in atto qualcosa per questo.

Ora 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>

Ecco i tuoi modelli di dati; puoi vedere che il Cerchio è reso semplicemente con un'ellisse. Square, d'altra parte, ha un ItemsControl incorporato che rende gli elementi contenuti. Ho anche disegnato un bordo attorno ad esso per creare la forma quadrata.

Ecco il risultato:

alt text http://img212.imageshack.us/img212/8658/squarewithcirclecontent .png

Altri suggerimenti

Potresti provare a usare due DataTemplates, uno per un Cerchio (rende solo un Cerchio) e uno per un Quadrato. Square DataTemplate dovrebbe eseguire il rendering di una griglia (basta dargli un bordo per farlo sembrare un quadrato) e quindi impostare DataContext = " {Binding CircleList} della griglia nidificata " ;.

Non sono sicuro al 100% di come stai convertendo un elenco di forme in una griglia, ma sembra che tu l'abbia già risolto, quindi lo ometterò per semplicità. :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top