Laden...

DataItems frei positionieren ? (WPF)

Erstellt von benedictbaur vor 16 Jahren Letzter Beitrag vor 16 Jahren 3.309 Views
B
benedictbaur Themenstarter:in
10 Beiträge seit 2004
vor 16 Jahren
DataItems frei positionieren ? (WPF)

Hallo,

ich suche eine Lösung für folgendes Problem:

Ich möchte die Elemente, die eine Datarenderingcontrol mittels eine Datatemplates aus einer Datasource gerendert hat, nicht in Zeilen oder Spalten sondern frei positionieren.

Mit der Klasse ItemsControl bzw. Itemslist kann ich ja zB Ellipsen oä für jede Datenzeile zeichnen, allerdings werden die Objekte der verschiedenen Datenzeilen in getrennte Panels und untereinander gezeichnet.
Kann man nicht die ItemsControl dazu bringen, alle Objekte in ein einziges Panel (oder Canvas etc) zu zeichnen ?

Oder existiert vielleicht eine Control, die so etwas leistet ? (Googlesuche in die Richtung war leider erfolglos, vielleicht fehlt mir auch der genaue Begriff.)

Vielen Dank im Vorraus

(.NET 3.0/3.5, WPF)

2.760 Beiträge seit 2006
vor 16 Jahren

In einem Canvas kannst du eigentlich alles (FrameworkElement) frei positionieren
und zwar über die Depency Properties.


StackPanel sp = new StackPanel();
sp.Width = 120;
sp.Height = 80;
myCanvas.Children.Add(sp);
sp.SetValue(Canvas.LeftProperty, (double)30);
sp.SetValue(Canvas.TopProperty, (double)100);

myCanvas kannst du im XAML oder im code definieren.
Oder habe ich dich falsch verstanden?

B
benedictbaur Themenstarter:in
10 Beiträge seit 2004
vor 16 Jahren

Das ist ja nicht mein Problem 🙁

Die Elemente, die ich positioniere sind ja keine statischen Elemente, die ich im XAML-Code definiere, sondern es werden für jeden Datensatz auf Basis eines Templates diese Elemente gerendert.
Ich brauche sozusagen eine Canvas mit Datasource und Datatemplate. Der Datacontext einer Canvas bringt hier nicht weiter, da man damit ja lediglich bereits vorhandene Elemente der Canvas an eine Zeile der Datasource binden kann.

Vielleicht noch mal zur Veranschaulichung:
Die Datensätze haben die Form (id,x,y,value,...) wobei (x,y) als Koordinaten der R^2 interpretiert werden sollen. Die Daten sollen nun so gerendert werden, dass für jeden Datensatz zB eine Ellipse an der Position (x,y) zur Canvas (oder Panel ...) hinzugefügt wird.
Eine Itemscontrol erzeugt dann für jeden Datensatz ein eigenes Panel in der Zeile, genau dies möchte ich nicht. Alle Elemente sollen zusammen auf einem einzigen Panel erscheinen.

Ich habe schon selbst in diese Richtung Implementierungen vorgenommen, diese sind aber komplett auf eigener Basis und bauen auf keinerlei Komponenten auf. Während der Benutzung tauchen dann immer wieder neue Ideen und Probleme auf, die mich wieder einen großen Aufwand kosten, sie umzusetzen.

Ich möchte nicht nur einfach Zeichenobjekte wie Linie, Ellipse oä zeichnen, sondern möglichst alle visuellen .NET-Komponenten nutzen. Gerade dies ist ja faktisch mit dem Benutzen von Datatemplates möglich.

2.760 Beiträge seit 2006
vor 16 Jahren

Wenn du dein DataTemplate mit einem Canvas
ausstattest, dann kannst du doch da auch noch ein StackPanel oder irgendwas
anderes reinpacken


<DataTemplate x:Key="ProductDataTemplate">
   <Canvas>
      <StackPanel Canvas.Left="-300" Canvas.Top="30">
          Meine Daten
      </StackPanel>
   </Canvas>
</DataTemplate>

Dann sollte "Meine Daten" von der Listbox und der Position des Items aus gesehen -300 X haben und 30 Y

Ist ungetestet, aber solange du beim Canvas das clipping nicht aktivierst sollte das glaube Ich functionieren.

B
benedictbaur Themenstarter:in
10 Beiträge seit 2004
vor 16 Jahren

Vielen Dank, so funktioniert es 🙂