Laden...

Auf Canvas hinzugefügtes Element hat keinen Parent

Erstellt von Briefkasten vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.390 Views
Briefkasten Themenstarter:in
446 Beiträge seit 2004
vor 12 Jahren
Auf Canvas hinzugefügtes Element hat keinen Parent

Hallo,

ich füge zu meinem Canvas mit

this.Canvas.Children.Add(new EdgeVisualization() { Edge = ed });

mein Control hinzu.

Das EdgeVisualization hat eine dp namens Edge. In der Callback Funktion will ich auf den Canvas über edgeVisualization.Parent zugreifen. Allerdings ist der NULL. Wie kann das sein? Da müsst doch das Canvas drinnen sein?! Hat jemand eine Idee woran das liegen könnte?

Schaut mal im IRC vorbei:
Server: https://libera.chat/ ##chsarp

799 Beiträge seit 2007
vor 12 Jahren

Wie kommst du darauf dass das anders sein muss? In der MSDN steht dazu nichts.

Setz das Property selbst - Problem gelöst.

As a man thinketh in his heart, so he is.

  • Jun Fan
    Es gibt nichts Gutes, außer man tut es.
  • Erich Kästner
    Krawutzi-Kaputzi
  • Kasperl
Briefkasten Themenstarter:in
446 Beiträge seit 2004
vor 12 Jahren

Wenn ich auf dem Canvas das Control x hinzufüge, dann wird im control x.Parent=Canvas sein.

Die Parent Eigenschaft kann man nicht setzen, da sie readonly ist (was auch Sinn macht)

Schaut mal im IRC vorbei:
Server: https://libera.chat/ ##chsarp

Briefkasten Themenstarter:in
446 Beiträge seit 2004
vor 12 Jahren
this.Canvas.Children.Add(new EdgeVisualization() { Edge = ed });  

Der Code sagt eigentlich alles... Man muss nur genau hinsehen, um den "Fehler" zu erkennen.

Es wird zu erst das EdgeVisualization Controll erstellt und somit als erstes die Callback Funktion aufgerufen, in dem der Canvas in der Property Parent gesucht wird.

Da zu diesem Zeitpunkt, das EdgeVisualization noch nicht dem Canvas hinzugefügt wurde, ist die Property Parent eben NULL.

Nunja... wie kann ich jetzt im EdgeVisualization Control rausfinden, wann der Parent!=null ist?

Einen Timer einbauen der ständig überprüft ob der Parent !=null ist, ist nicht gerade die schönste Lösung.

Hat jemand eine Idee?

Schaut mal im IRC vorbei:
Server: https://libera.chat/ ##chsarp

5.742 Beiträge seit 2007
vor 12 Jahren

Es wird zu erst das EdgeVisualization Controll erstellt und somit als erstes die Callback Funktion aufgerufen, in dem der Canvas in der Property Parent gesucht wird.

Welches Callback meinst du? Ich kann hier keins erkennen 🤔

J
641 Beiträge seit 2007
vor 12 Jahren

Mhmm...

Machs doch so:

var ev=new EdgeVisualization();
this.Canvas.Children.Add(ev);
ev.Edge = ed;

dann ist wenn Edge zugewiesen wird, Parent bekannt...

cSharp Projekte : https://github.com/jogibear9988

Briefkasten Themenstarter:in
446 Beiträge seit 2004
vor 12 Jahren

Mhmm...

Machs doch so:

var ev=new EdgeVisualization();  
this.Canvas.Children.Add(ev);  
ev.Edge = ed;  

dann ist wenn Edge zugewiesen wird, Parent bekannt...

Wenn jemand anderer das Control verwendet und nicht weiß, dass man genau diese Reihenfolge befolgen muss, funktioniert das Control nicht.

Oder angenommen, wenn ich nach einige Jahren das Control wieder verwende, und diese eine Sache vergessen habe, bin ich wieder am rum Debuggen, weil es nicht funktioniert. Was ich eigentlich sagen will ist, dass die Sache so nicht richtig gelöst wäre.

Welches Callback meinst du? Ich kann hier keins erkennen verwundert

Die CallBack Funktion wird im DP Edge gesetzt.

 public static readonly DependencyProperty EdgeProperty =
            DependencyProperty.Register("Edge", typeof(Get.Model.Graph.Edge), typeof(EdgeVisualization), new UIPropertyMetadata(null, OnEdgeChanged));

In der Callback Funktion habe ich ursprünglich nach dem Canvas gesucht.

SG

Schaut mal im IRC vorbei:
Server: https://libera.chat/ ##chsarp

5.742 Beiträge seit 2007
vor 12 Jahren

In der Callback Funktion habe ich ursprünglich nach dem Canvas gesucht.

Aha.
Dann führe diesen Vorgang doch einfach dann aus, wenn sich die Parent Property ändert; siehe Listening to DependencyProperty changes.

Oder probiere mal, den Code in OnVisualParentChanged zu schreiben.

Briefkasten Themenstarter:in
446 Beiträge seit 2004
vor 12 Jahren

Dann führe diesen Vorgang doch einfach dann aus, wenn sich die Parent Property ändert; siehe
>
.

Oder probiere mal, den Code in OnVisualParentChanged zu schreiben.

Hallo,

leider stellt die DP Parent keine Override Methode zu Verfügung. Evtl. weil sie readonly ist 😦.

Die überschriebene OnVisualParentChanged() Funktion liefert im oldParent Parameter immer nur den Wert NULL.

Schaut mal im IRC vorbei:
Server: https://libera.chat/ ##chsarp

5.742 Beiträge seit 2007
vor 12 Jahren

leider stellt die DP Parent keine Override Methode zu Verfügung. Evtl. weil sie readonly ist 😦.

Du sollst auch gar nichts überschreiben, sondern einen DependencyPropertyDescriptor verwenden.

Aber dass oldValue null ist, ist doch auch logisch, oder?

U
1.688 Beiträge seit 2007
vor 12 Jahren

Die Parent-Eigenschaft ist gesetzt, wenn das "Loaded"-Event ausgelöst wird. Aber das hätte Dir auch der erste Google-Treffer nach "parent usercontrol wpf" sagen können.