不确定为什么要为标签分配 Page 对象,但您可以尝试使用 data binding 将 Page 对象绑定到您的 NavigationViewItem。
Page.xaml:
<Grid>
<NavigationView Name="Nav" ItemInvoked="Nav_ItemInvoked">
<NavigationView.MenuItems>
<NavigationViewItem Icon="Home" Content="Home" Tag="{x:Bind PageCollection[0]}"/>
</NavigationView.MenuItems>
</NavigationView>
</Grid>
后面的代码:
public MainPage()
{
this.InitializeComponent();
PageCollection = new ObservableCollection<Page>();
//Add page instances
BlankPage1 blankPage1 = new BlankPage1();
PageCollection.Add(blankPage1);
}
public ObservableCollection<Page> PageCollection { get; set; }
private void Nav_ItemInvoked(NavigationView sender, NavigationViewItemInvokedEventArgs args)
{
var item = sender.MenuItems[0] as NavigationViewItem;
Debug.WriteLine(item.Tag.GetType());
}
---更新---
如果要将标签设置为Type,可以将类型放入集合中,然后将Type项绑定到标签。所以后面的代码应该是这样的:
public MainPage()
{
this.InitializeComponent();
PageCollection = new ObservableCollection<Type>();
//Add page type so that you can bind and navigate to the tag page.
PageCollection.Add(typeof(BlankPage1));
}
public ObservableCollection<Type> PageCollection { get; set; }
private void Nav_ItemInvoked(NavigationView sender, NavigationViewItemInvokedEventArgs args)
{
var item = sender.MenuItems[0] as NavigationViewItem;
Debug.WriteLine(item.Tag.GetType());
Frame.Navigate((Type)item.Tag);
}
---更新2---
如果你不想在后面的代码中使用数据绑定,我可以考虑在你的页面中使用资源添加一个对象,然后你可以使用你的标签来引用它。
<Page.Resources>
<local:BlankPage1 x:Key="Page1" />
</Page.Resources>
<NavigationView ItemInvoked="Nav_ItemInvoked">
<NavigationView.MenuItems>
<NavigationViewItem Icon="Home" Content="Home" Tag="{StaticResource Page1}" />
</NavigationView.MenuItems>
</NavigationView>
然后就可以通过标签导航到页面了,
Frame.Navigate(navItem.Tag.GetType());