2012-04-04 6 views
1

Zuerst macht diese Ausnahme für mich keinen Sinn. Warum sollte ich dieses Objekt nicht mehrfach duplizieren können? aber das ist nicht der Punkt:"Element ist bereits das Kind eines anderen Elements."

ich benutze eine Liste. Immer, wenn ich auf eine Website navigieren, sollte es dies tun:

(App.Current as App).recent.ForEach(x => container.Children.Add(x)); 

(Container = eine andere Stackpanel)

das erste Mal, es funktioniert. danach bekomme ich die Ausnahme im Fragetitel angezeigt. Ich habe bereits versucht, eine Listbox zu benutzen, aber ich habe gerade eine ArgumentException bekommen. Ich denke, dass diese Ausnahmen die gleiche Quelle haben, aber ich weiß nicht, was ich falsch mache. bitte helfen

dank

Antwort

10

Der Fehler ist ganz klar: Ein WPF/SL Steuerung nur 1 Elternteil Steuerung zu einer Zeit gehört.

Sie müssen entweder die Steuerelemente von ihrem Eltern entfernen, wenn Sie sich von einer Seite entfernen, oder Sie müssen in diesem ForEach neue Steuerelemente erstellen (möglicherweise klonen).

+0

außer Kraft zu setzen ist nicht die Seite erstellt völlig neu, wenn es die Navigation? Ich werde versuchen, die Liste zu kopieren. – roqstr

+0

Die Zielseite wird erstellt, aber die alte Seite wird nicht sofort gelöscht. Ihre Ausnahme beweist das. –

+0

peinlich, aber ich bekomme es nicht ich versuche, die Liste so zu klonen: Liste Cache = neue Liste ((App.Current als App) .recent); aber ich bekomme immer noch diese Ausnahme – roqstr

1

Wenn Sie zu einer Seite navigieren, wird die alte Instanz nicht sofort entfernt. Wenn Sie also Ihre Steuerelemente der neuen Seite hinzufügen, werden sie möglicherweise weiterhin auf der alten Seite verwendet, wenn sie nicht zerstört wird.

Versuchen Sie, die Methoden OnNavigatedFrom(NavigationEventArgs e) und OnNavigatingFrom(NavigatingCancelEventArgs e) zu überschreiben, die aufgerufen werden, wenn Sie eine Seite verlassen, sodass Sie Ihr StackPanel leeren.

Zum Beispiel könnten Sie tun:

protected override void OnNavigatedFrom(NavigationEventArgs e) 
{ 
    base.OnNavigatedFrom(e); 
    container.Children.Clear(); 
} 
0

Sie müssen die Kinder der Behälter entfernen, wenn Sie von der Seite navigieren. Aber nicht, wenn die Navigation aufgrund eines Aussetzens erfolgt. Um zu vermeiden, die Kinder deutlich, wenn die Navigation ist darauf zurückzuführen, ein suspendiert es besser ist, OnNavigatingFrom statt OnNavigatedFrom

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) 
    { 
     container.Children.Clear(); 
     base.OnNavigatingFrom(e); 
    } 
Verwandte Themen