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
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.
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
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
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 🤔
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
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
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.
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
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?
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.