“元素已经是另一个元素的孩子。”
起初,这个例外对我来说并没有多大意义。 为什么我不能多次复制这个对象? 但那不是重点:
我用一个清单。 每当我导航到一个网站时,它应该这样做:
(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); }