2009-08-03 9 views
1

Ich kann meinen Kopf nicht umschlingen, wie dieseWPF angezeigt Eltern Kind Beziehung

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

zu erreichen Rendering Ich habe eine Liste, die Shape-Objekte hält, jetzt, was ich erreichen will ist jeweils in einem gerenderten Objekt mit Gitter.

Wenn das Objekt ein Quadrat ist es sollte ein verschachteltes Gitter sein, die Kreis-Elemente aus der CircleList Eigenschaft hält

ich mit einem Item und einem HierarchicalDataTemplate habe versucht, nicht daran zu arbeiten bekommen konnte, habe ich versucht, Verschachtelung ein ItemsControl in einem ItemsControl, ich bin ziemlich neu bei WPF, also bin ich hier herumgefummelt und nicht gewusst, was die "richtige" Lösung wäre. Ich habe es geschafft, das Obige in einem TreeView darzustellen, aber was ich zu erreichen versuche, ist ein Zeichenbrett, das Formen rendert.

UPDATE

Die "Drawingboard" Elemente enthalten soll, sollte jedes Element in einem Behälter gemacht werden.

Wenn das Objekt von Typ-Platz ist der Platz Behälter sollen einen verschachtelten Container haben die Kreis-Objekte aus dem CircleList Eigentum zu halten.

+0

Vielleicht bin ich nur ein wenig verwirrt durch einen Tippfehler. Es ist offensichtlich, dass Square von Shape abgeleitet ist, aber Sie haben danach {} Klammern ... sollten sie nicht da sein? –

+0

Nur leere Klammern für die Klasse, wo der Konstruktor und so sein sollte – thmsn

+0

Aber sind nicht die 3 Zeilen danach die Definition der Klasse? –

Antwort

1

Scott ist ziemlich nah dran, aber nicht ganz da; Wenn Sie den DataContext des Grids festlegen, werden die enthaltenen Circle-Objekte nicht gerendert. Sie benötigen ein eingebettetes Steuerelement, das seine eigenen Elemente darstellen kann, und anschließend die ItemsSource-Eigenschaft dieses Steuerelements an die CircleList binden.

Ich habe ein Beispiel mit Ihren ursprünglichen Klassen konstruiert, dass dies zeigt. Hier ist der 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; } 
} 

So können Sie sehen, ich habe einen einzigen Platz in meine Formen-Liste hinzugefügt, die einen Kreis mit einem Durchmesser von 25 Hinweis enthält, dass diese keine Unterstützung hinzufügt, um die Formen der Positionierung mit absolute Koordinaten; Ich nehme an, Sie haben bereits etwas dafür.

Nun ist die 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> 

Hier sind Ihre Datatemplates; Sie können sehen, dass der Kreis einfach mit einer Ellipse dargestellt wird. Das Quadrat hat dagegen ein eingebettetes ItemsControl, das seine enthaltenen Elemente rendert. Ich habe auch einen Rand um ihn gezogen, um die quadratische Form zu machen. Hier

ist das Ergebnis:

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

+0

+1 - Ich war ein wenig verwirrt von der ursprünglichen Frage, dass er sie in einem Raster angezeigt hat, und ich dachte, er hätte eine andere Datenvorlage zum Rendern eines "Gitters" aus einer Liste. Sie haben das mit einem ItemsControl gelöst. –

+0

schön, zumindest habe ich es jetzt rendern lassen: D jetzt habe ich was zum arbeiten :) – thmsn

0

Sie könnten versuchen, zwei Datatemplates, eine für einen Kreis (macht nur einen Kreis) und eine für einen Platz. Das Square DataTemplate sollte ein Grid rendern (geben Sie ihm einfach einen Rahmen, damit es wie ein Quadrat aussieht) und legen Sie dann das DataContext = "{Binding CircleList}" des verschachtelten Grids fest.

Ich bin nicht 100% sicher, wie Sie eine Liste von Formen in ein Raster konvertieren, aber klingt, als ob Sie das bereits gelöst haben, also werde ich das einfach weglassen. :)

+0

Ich bin irgendwie verwirrt, was ich für die spezifischen Datentypen definieren würde, hauptsächlich wenn ich wüsste, wie ich es machen soll , ich würde ein ItemsControl verwenden, ich möchte ein "Zeichenbrett" haben Dieses Zeichenbrett enthält eine Liste von Elementen, diese Elemente sollten in einer bestimmten Art und Weise gerendert werden. – thmsn

+0

@thmsn - Das "Zeichenbrett", das Sie beschreiben, ist vom Standpunkt der Funktionalität ein bisschen seltsam. Es wird nicht zulassen, dass Elemente miteinander überlappen. Verwenden Sie einfach ein Canvas-Objekt, werfen Sie alle Ihre Shapes dorthin und lassen Sie sie rendern. Dann müssen Sie sich keine Gedanken darüber machen, was "drin" ist. –

+0

der Grund, warum ich es verschachtelt werden soll, ist, weil die Position der Kindobjekte relativ zu der Elternposition sein muss :) sie sollten sich überlappen lassen, also wäre ein Canvas wahrscheinlich das Richtige, sie brauchen trotzdem einen nsted canvas:) – thmsn

Verwandte Themen