2012-04-04 3 views
1

처음에는이 예외가 실제로 나에게 이해가되지 않습니다. 왜이 객체를 여러 번 복제 할 수 없습니까? 하지만 요점은 아닙니다 :"요소는 이미 다른 요소의 하위 요소입니다."

나는 목록을 사용합니다. 내가 사이트를 탐색 할 때마다,이 작업을 수행해야합니다

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

(컨테이너 = 다른 StackPanel에)

처음으로, 그것을 작동합니다. 이후, 나는 예외를 질문 표에 표시한다. 이미 목록 상자를 사용하여 시도했지만 ArgumentException 있어요. 나는이 예외가 동일한 출처를 가지고 있다고 생각하지만, 내가 뭘 잘못하고 있는지 모른다.

감사

답변

10

도와주세요 오류는 매우 분명하다, • WPF/SL 컨트롤은 한 번에 한 부모 컨트롤에 속할 수 있습니다.

페이지에서 벗어나거나이 ForEach에서 새 컨트롤 (가능하면 복제)을 만들어야 할 때 부모로부터 컨트롤을 제거해야합니다.

+0

의 오버라이드 (override)하는 것이 좋습니다 일시 중단에 의한 때 분명 아이들을 방지하려면? 목록을 복사하려고합니다. – roqstr

+0

대상 페이지가 만들어 지지만 이전 페이지는 즉시 삭제되지 않습니다. 귀하의 예외는 그것을 증명합니다. –

+0

당혹 스럽지만 나는 그것을 얻지 못한다. 나는 다음과 같은 목록을 복제하려고한다 : 목록 캐시 = 새 목록 ((App.Current as App) .recent); 하지만 여전히이 예외가 발생합니다 – roqstr

1

페이지로 이동하면 이전 인스턴스가 즉시 제거되지 않으므로 새 페이지에 컨트롤을 추가 할 때 컨트롤이 파괴되지 않으면 이전 페이지에서도 계속 사용되어 예외가 발생합니다.

StackPanel을 비울 수 있도록 페이지를 떠날 때 호출되는 OnNavigatedFrom(NavigationEventArgs e) 및 메서드를 재정 의하여보십시오.

예를 들어, 당신은 할 수 :

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

당신은 당신이 페이지를 탐색 할 때 컨테이너의 아이를 제거해야합니다. 그러나 내비게이션이 일시 중지로 인한 것이 아닌 경우. 탐색이 그것에 탐색 할 때 완전히 새로운 생성 된 페이지가 아닌이 OnNavigatingFrom 대신 OnNavigatedFrom

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) 
    { 
     container.Children.Clear(); 
     base.OnNavigatingFrom(e); 
    } 
관련 문제