";元素已经是另一个元素的子元素&”;

本文关键字:元素 另一个 quot | 更新日期: 2023-09-27 18:29:58

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

我使用列表。每当我导航到一个网站时,它都应该这样做:

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

(容器=另一个StackPanel)

第一次,它是有效的。之后,我得到问题标题中显示的异常。我已经尝试过使用列表框,但我只得到了一个ArgumentException。我认为这些例外有相同的来源,但我不知道我做错了什么。请帮助

感谢

";元素已经是另一个元素的子元素&”;

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

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

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

尝试重写在离开页面时调用的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);
    }