通过委托切换PanoramaItem可见性

时间:2011-09-17 04:51:54

标签: windows-phone-7

我在Windows Phone开发中遇到了一个特殊的问题。我有4个全景项目,每个项目包含一个webBrowser控件。在应用程序开始时,当remaninig处于折叠状态时,我只有第一个全景项可见。

根据第一个webBrowser中的交互,我们通知WP7应用程序(webBrowser.ScriptNotify事件)并决定要显示哪些panoramaitems。可见性在处理ScriptNotify事件的委托中设置。

我面临的问题是,虽然我将委托中的可见性设置为Visible,但它并未显示在Panorama中。我已尝试在委托中使用Dispatcher来更改可见性,但它没有帮助:

Deployment.Current.Dispatcher.BeginInvoke(() => { 
    discussions.Visibility = System.Windows.Visibility.Visible; 
});

有人可以建议我做错了什么吗?

4 个答案:

答案 0 :(得分:0)

首先,您不应在Panorama中使用WebBrowser控件。这是非常糟糕的表现。

其次,Panorama和PivotItem没有折叠状态。

第三,调度程序与此无关(除非你没有在UI线程上运行代码)。

所以你需要做的是动态地将PanoramaItems添加到Panorama控件中。这可以通过数据绑定(推荐)或直接从C#完成。

答案 1 :(得分:0)

我不知道性能,但我确定 PanoramaItem 有一个折叠 * visibility *状态我试图从代码中切换它,它就像如果初始状态可见,则为魅力。

但是如果全景加载时初始状态已折叠,则它不再起作用。我想这是因为如果它被折叠,那么它不会包含在全景中,所以当你将它设置为可见时它将不可见。

也许这是一个错误,或者我不知道,但它有点尴尬。

添加 PanoramaItem添加到Panorama可以正常工作。

答案 2 :(得分:0)

我很抱歉没有回答这个问题,但反过来说,执行问题:)。

我确实遇到了同样的问题,一个带有ItemsControl的PanoramaItem被存储到ViewModel的集合中。 PanoramaItem可见性属性被数据绑定到{Binding},并使用CollectionToVisibility转换器。在调试期间,在转换器代码中设置了断点,我设法看到返回值正常,但是当集合中有项目时,PanoramaItem不可见。

我的调查让我意识到,实际上当第一次到达Collection时,返回值为null,因为Collection数据来自对服务的异步调用,转换器返回值是Visibility.Collapsed,并且仅当填充Collection并引发PropertyChanged事件,第二次获取Collection属性触发数据绑定刷新,转换器的返回值现在是Visibility.Visible,这让我觉得PanoramaItem不包含在Panorama中在applytemplate期间控制树,因为可见性设置为折叠,之后UI永远不会再次加载PanoramaItem。

我做了一个测试来验证这个场景,在Collection属性的get中返回一个硬编码的项目列表,以便第一个获取项目,转换器在第一个get请求中返回Visible。一切都像魅力一样。我甚至可以将这些集合从项目中删除,然后它就会崩溃,反之亦然。

这一切都是纯粹的Xaml,没有代码。 这样做的目的是隐藏由于某种原因没有要显示内容的PanoramaItem。

答案 3 :(得分:0)

基本上,全景图保留了可见项目的内部列表。将项目设置为可见时,不会更新此列表。强制控件更新此列表的最简单方法是设置MainItem属性。因此,在设置全景项目的可见性后,只需添加以下行:

yourPanorama.DefaultItem = yourPanorama.DefaultItem;

(假设全景被称为yourPanorama