“元素已经是另一个元素的孩子。”

起初,这个例外对我来说并没有多大意义。 为什么我不能多次复制这个对象? 但那不是重点:

我用一个清单。 每当我导航到一个网站时,它应该这样做:

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

(container =另一个StackPanel)

第一次,它的工作原理。 之后,我得到了问题标题中显示的exception。 我已经尝试使用列表框,但我刚收到ArgumentException。 我认为这些例外具有相同的来源,但我不知道我做错了什么。 请帮忙

谢谢

错误很明显:WPF / SL控件一次只能属于1个父控件。

因此,当您离开页面时,您必须从父项中删除控件,或者您必须在此ForEach中创建(可能克隆)新控件。

当您导航到某个页面时,旧实例不会立即被删除,因此当您将控件添加到新页面时,如果它未被销毁,它们仍可能在旧页面中使用,从而导致exception。

尝试覆盖离开页面时调用的OnNavigatedFrom(NavigationEventArgs e)OnNavigatingFrom(NavigatingCancelEventArgs e)方法,以便清空StackPanel。

例如,你可以这样做:

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

从页面导航时,您必须删除容器的子项。 但是,如果导航是由于暂停导致。 为了避免孩子在导航暂停时清除,最好覆盖OnNavigatingFrom而不是OnNavigatedFrom

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