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

时间:2012-04-04 21:08:18

标签: c# windows-phone-7 stackpanel

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

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

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

(container =另一个StackPanel)

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

感谢

3 个答案:

答案 0 :(得分:10)

错误非常明确:WPF / SL控件一次只能属于1个父控件。

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

答案 1 :(得分:1)

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

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

例如,你可以这样做:

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

答案 2 :(得分:0)

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

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