【问题标题】:wp7 contentpresenter - setting content to the same pagewp7 contentpresenter - 将内容设置到同一页面
【发布时间】:2011-01-20 18:12:38
【问题描述】:

我使用带有ContentPresenter(名为PageContent)的页面(名为containerpage),并在页面的OnNavigatedTo() 事件处理程序中将其内容设置为PhoneApplicationPage 实例(contentpage)。我还有一个带有“显示表单”按钮的主页。当我单击该按钮时,程序导航到 containerpage,它将其 contentpresenter 的内容设置为 contentpage。我的问题是:如果我单击“显示表单”,然后按后退按钮并再次单击“显示表单”,我会得到带有文本的 ArgumentException

“参数不正确”

上线

this.PageContent.Content = contentpage; 

在容器页面的OnNavigatedTo() 事件处理程序中。我想这是因为我已经为这个内容页设置了另一个 ContentPresenter 的内容(因为导航会创建一个新页面),但是如果这是问题所在,我该如何从以前的 ContentPresenter 的内容中取消分配我的内容页?

【问题讨论】:

  • 如果您在此处发布您的 XAML 和代码隐藏代码会更好。并发布完整的异常详细信息。
  • 您有一个页面,其中包含另一个页面的内容?(PhoneApplicationPAge->contentpresenter->PhoneApplicationPage?)这看起来相当混乱,可能无法像您预期的那样工作......

标签: c# windows-phone-7 navigation contentpresenter


【解决方案1】:

正如 decyclone 所提到的,如果有详细的代码,您的问题会更加清晰。也就是说,您可以在您的容器页面上实现OnNavigatedFrom() 并将Content 设置为null

如果应用程序在容器页面上被删除,您可能需要考虑如何保持这种设计。

【讨论】:

  • 这里是 ContentPage(包含 ContentPresenter 的页面)的代码:
  • 受保护的覆盖无效 OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedFrom(e); this.PageContent = null; this.DataContext = null; this.Content = null; }
  • 受保护的覆盖无效 OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedTo(e);字符串内容ID; if (NavigationContext.QueryString.TryGetValue("contentID", out contentID)) { if (PhoneApplicationService.Current.State["content" + contentID] != null) { try { Page page = PhoneApplicationService.Current.State["content" + contentID] 作为页面; this.PageContent.Content = 页面; } catch (ArgumentException ex) { } UpdateLayout(); } } }
  • 不管我怎么做,我都用StackPanel实例而不是page作为ContentPresenter.Content(ContentPresenter instance = this.PageContent)试过了,argumentexception是一样的“参数不正确”。第二次导航到 ContentPage 时(导航 uri 为:“/ContentPage.xaml?contentID=1”)。 PhoneApplicationService.Current.State[] 持有准备好的 PhoneApplicationPage 实例。
【解决方案2】:

说实话,我很惊讶将一个页面的 Content 属性设置为另一个页面的实例甚至可以工作!我真的建议不要将其作为长期解决方案。如果第一页的内容基于某些条件是动态的,则使用不同的UserControls。

如果UserControl 的数据在对ShowForm 的调用之间不是持久的,那么您可以每次只创建一个新实例,然后您就不会遇到重新设置的问题。

如果您能详细说明您的应用场景以及您想要实现的目标,那么我们或许能够提供更好的答案。

【讨论】:

  • 我将一个页面的ContentPresenter控件的Content设置到另一个页面,但是不管我这里设置什么,一个页面,stackpanel,usercontrol,异常都是一样的。 containerpage 没有改变,只有内容。我正在使用它,因为以编程方式制作页面然后将它们设置为 PhoneApplicationFrame 的源不起作用(由于缺少使用 NavigationService,应用程序栏未显示)。因此,我尝试使用 ContentPresenter 创建一个空白页面,然后导航到它并更改其内容。
  • 您不使用常规页面动画是否有特殊原因?如果您有尝试将这些页面加载到当前页面的 Content 属性中的逻辑,那么您肯定可以只使用 this.NavigationService.Navigate(target); 其中target 是目标?
  • 不,因为我的页面是动态设置的,所以我不能使用 .xaml 代码,只能使用 PhoneApplicationPage 实例,并且 Navigate() 不接受它作为参数。
  • 显然您的方法不起作用,我真的并不感到惊讶,因为导航框架不打算以这种方式使用。也许如果您可以更详细地解释您的应用程序并解释您想要实现的目标,那么我们也许可以为您提供一个很好的解决方案。
猜你喜欢
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
相关资源
最近更新 更多