Position eines Controls an ein anderes Control binden

  • WPF

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von newcat.

    Position eines Controls an ein anderes Control binden

    Hallo,

    ich bastel mir gerade einen NodeEditor in WPF. Dabei habe ich mich am Blender Node Editor orientiert. Meine Nodes sehen im Moment so aus:
    vb-paradise.de/index.php/Attac…ea6d8ad7033a9545f997248a2

    Das Viemodel ist vereinfacht so aufgebaut:

    C#-Quellcode

    1. class MainViewModel : INotifyPropertyChanged
    2. {
    3. public ObservableCollection<NodeBase> Nodes { get; set; }
    4. }
    5. class NodeBase : INotifyPropertyChanged
    6. {
    7. public ObservableCollection<NodeInterface> Inputs { get; set; }
    8. public ObservableCollection<NodeInterface> Outputs { get; set; }
    9. }
    10. class NodeInterface : INotifyPropertyChanged
    11. {
    12. public string Name { get; set; }
    13. //weitere Member, für die UI aber uninteressant
    14. }


    Die Nodes werden dann von einem ItemsControl gerendert; jede Node hat zwei ListViews, die an die Inputs und Outputs Listen gebunden sind, mit einem eigenen ItemContainerTemplate, das die Ellipse und einen Text enthält.
    Jetzt möchte ich eine Verbindung zwischen zwei Ellipsen, beispielsweise durch eine Linie, darstellen. Da die Ellipsen aber von der ListView erstellt werden, habe ich keinen direkten Zugriff auf sie und kann auch nicht mit ElementName o. ä. in Bindings arbeiten.
    Was wäre der geschickteste Weg, um so eine Verbindung zu realisieren?
    Twitch Viewer Display Chat-, Zuschauer- und Statistiktool für Streamer
    Mir fehlt in deim Viewmodel eine Positions-Angabe der Nodes.
    Wie willst du eine Linie von A nach B ziehen, wenn du deren Position nicht kennst?

    In der Graphen-Theorie spricht man übrigens von Knoten und Kanten, wobei "Kante" eine Entität ist, die jeweils 2 Knoten verbindet. Das wäre dann ein relationales Datenmodell, und da wäre ein direkter Zugriff auf die Kanten (Linien) recht unproblematisch.

    Ich hab übrigens auch mal was ähnliches gebastelt, also Linien zwischen Punkten - gugge die SampleSolution von: Linien, Figuren, Formen
    Ist sehr andere Problemstellung, aber vlt. gibts dennoch einige Elemente, die auch bei deim Prob hilfreich sein könnten.
    Vielen Dank für die Links @SKeks.

    Ich habe das ganze jetzt mit dem VisualTreeHelper gemacht, sodass ich die Ellipsen im Tree finden und dann mit TransformToVisual() die Koordinaten relativ zum MainPanel bestimmen kann.
    Zwar hatte ich gehofft, dass ganze mehr MVVM-mäßig machen zu können, aber dazu gabs im Internet erst recht nichts.

    ErfinderDesRades schrieb:

    Mir fehlt in deim Viewmodel eine Positions-Angabe der Nodes.
    Wie willst du eine Linie von A nach B ziehen, wenn du deren Position nicht kennst?


    Ich habe gesehen, dass das Bild im OP nicht mehr funktioniert; deshalb hier nochmal, dann wird wahrscheinlich einiges klarer:


    Meine Nodes sind so gesehen keine Knoten sondern eine Verbindung mehrerer Knoten zu einem "Überknoten". Deshalb vermutlich die Verwirrung. Die Position des Überknotens kenne ich, aber die Ellipsen, an die ich die Linien binden möchte, werden von einer ListView erstellt, somit kenn ich weder deren Position, noch habe ich direkten Zugriff auf das Ellipsen-Control; das einzige, was ich kenne, ist das zugehörige ViewModel.
    Twitch Viewer Display Chat-, Zuschauer- und Statistiktool für Streamer