我正在开发一个Silverlight wp7应用。我不确定如何做导航。
我有几个PhoneApplicationPage
个类,其中包含多个UserControl
个。看起来我可以使用NavigationService
从PhoneApplicationPage
类导航,但不能导航UserControl
类。那更好吗?一般模式是不是直接从UserControl
导航,而是从PhoneApplicationPage
处理它?</ p>
目前,我有一系列内容分为几个部分。每个部分在PivotItem
中都有自己的PivotControl
。每个部分的内容都在ListBox
中。我将ListBox
包裹在UserControl
中以提供更多功能/管理内容。但是,看起来我无法直接从这个类导航。
我可以删除包装器,直接将功能放在数据透视页面中。但是如果我想在我的应用程序的其他地方重复内容列表呢?
或者,当NavigationService
由UserControl
构建时,我将PhoneApplicationPage
传递给{{1}}。
答案 0 :(得分:2)
在WPF中,这很简单:您可以在NavigationService
上调用静态方法来获得答案:NavigationService.GetNavigationService(this)
。
不幸的是,这似乎在WP7中不可用。
相反,我想出了这个黑客......它像罪一样丑陋......希望有更好的东西。可能,至少,你可以想出一些更漂亮的东西。至少做一些空检查......var service = ((Application.Current as App).RootFrame.Content as Page).NavigationService;
答案 1 :(得分:2)
在WP7中,RootVisual始终为PhoneApplicationFrame
,由于NavigationService
和Frame
(或PhoneApplicationFrame
)几乎所有方法/属性(故意)共享,因此可以做到这一点:
(Application.Current.RootVisual as PhoneApplicationFrame).Navigate(...whatever...);
答案 2 :(得分:0)
我为此制作了一个自定义UserControl:
public class UserControlWithNavigation :UserControl
{
public event EventHandler NavigateToPageEvent;
public void NavigateToPage(Uri uri)
{
var e = new NavigationEventArgs(null, uri);
if (NavigateToPageEvent != null)
NavigateToPageEvent(this, e);
}
}
XAML使用自定义UserControl
类:
<common:UserControlWithNavigation
xmlns:common="clr-namespace:NameSpace;assembly=AssemblyName"
并在我的页面
MyUserControl.NavigateToPageEvent += (s, e) =>
{
NavigationService.Navigate(((NavigationEventArgs)e).Uri);
};
如您所见,您必须为UserControl
提供一个名称(上例中为MyUserControl
)
答案 3 :(得分:0)
我在http://www.geoffhudik.com/tech/2010/10/10/another-wp7-navigation-approach-with-mvvm.html处使用MVVM Light进行了导航示例。它可以使用一些重构,有些人更喜欢将一些导航辅助函数放在除基页之外的另一个类中。这很容易做到,但它可能会提供一些想法。