2

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

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

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

(容器 = 另一个 StackPanel)

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

谢谢

4

3 回答 3

10

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

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

于 2012-04-04T21:18:49.460 回答
2

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

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

例如,您可以这样做:

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
    base.OnNavigatedFrom(e);
    container.Children.Clear();
}
于 2013-09-03T07:16:29.043 回答
0

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

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
    {
        container.Children.Clear();
        base.OnNavigatingFrom(e);
    }
于 2015-04-01T19:08:09.070 回答