2016-08-31 2 views
0

Ich habe eine Anzahl von UserControl (ein Raster mit wenigen Labels) generiert und hinzugefügt Canvas in Laufzeit. Ich habe Drag-and-Drop für jedes UserControl und Knotenlinie (oder Verbindungslinie) zwischen UserControls implementiert.Clear UserControl mit Abhängigkeit Eigenschaft in Canvas

Als ich das Usercontrol mit myCanvas.Children.Clear löschen() erhielt ich den folgenden Fehler in Methode Node_LayoutUpdated():

enter image description here

Das ist mein Usercontrol ist:

public partial class Foo : UserControl 
{ 
    public static readonly DependencyProperty AnchorPointProperty = 
      DependencyProperty.Register(
      "AnchorPoint", typeof(Point), typeof(Foo), 
       new FrameworkPropertyMetadata(new Point(0, 0), 
       FrameworkPropertyMetadataOptions.AffectsMeasure)); 

    public Point AnchorPoint 
    { 
     get { return (Point)GetValue(AnchorPointProperty); } 
     set { SetValue(AnchorPointProperty, value); } 
    } 

    private Canvas mCanvas; 

    public Foo(Canvas canvas, bool isInput) 
    { 
     InitializeComponent(); 
     mCanvas = canvas; 
     this.LayoutUpdated += Node_LayoutUpdated; 
    } 

    void Node_LayoutUpdated(object sender, EventArgs e) 
    { 
     Size size = RenderSize; 
     Point ofs = new Point(size.Width/2, size.Height/2); 
     AnchorPoint = TransformToVisual(this.mCanvas).Transform(ofs); 
    } 
} 

Soll ich die DependencyProperty vor dem Entfernen des UserControl entfernen, und wie? Kann jemand bitte erklären, was diese Fehlermeldung verursacht und warum?

Antwort

1

Ihr Problem ist die letzte Zeile Ihres Codes. Das Ereignis LayoutUpdated wird direkt nach dem Entfernen (Löschen) der untergeordneten Elemente des Canvas-Bereichs aufgerufen. TransformToVisual funktioniert nicht, wenn das Control bereits von VisualTree getrennt ist. Das Abonnieren von übergeordneten Layout-Ereignissen ist normalerweise weder erforderlich noch eine gute Idee. Eine schnelle Abhilfe wäre es, die Kontrolle vor dem Clear abzutrennen.

Fügen Sie diesen Code auf Ihre Usercontrol:

public void Detach() 
{  
    this.LayoutUpdated -= Node_LayoutUpdated; 
} 

Und dies zu Ihrem Mainwindow:

foreach(WhateverYourControlTypeIs control in myCanvas.Children) 
{ 
    control.Detach(); 
} 
myCanvas.Children.Clear(); 
+0

Da die Funktion in dem Usercontrol wohnen Node_LayoutUpdated, ich habe es in MainWindows nicht lösen kann, und ich " Der Name Node_LayoutUpdated existiert nicht im aktuellen Kontext ". Wie entferne ich es dann? – KMC

+0

@KMC Nun, der einfachste Weg wäre, den Code in eine öffentliche Methode Ihres UserControls zu bringen (z. B. die IDisposable-Schnittstelle in Ihr UserControl zu implementieren, den Detach-Code dort einzufügen) und ihn manuell aufzurufen, bevor Sie ihn entfernen. Sie können auch die Ausnahme abfangen und das Ereignis lösen, wenn eine "InvalidOperationException" auftritt. Anstatt "mCanvas" in Ihrem Konstruktor zu setzen, könnten Sie [den VisualTreeHelper verwenden, um das übergeordnete Element des Steuerelements zu finden] (http://stackoverflow.com/questions/636383/how-can-i-find-wpf-controls-by-name) oder Typ) auf Anfrage. –

+0

Entschuldigung, aber ich folge dir nicht. Worum geht es, Node_LayoutUpdated öffentlich zu machen? Das wäre in MainWindows immer noch nicht erreichbar - was meinst du damit, es manuell aufzurufen? – KMC

Verwandte Themen