如何为UWP应用程序在XAML中将Tag属性(类型为System.Object)设置为Page类型?
特别是我要在XAML中声明一个NavigationViewItem,我想将其Tag设置为页面类型,例如
<NavigationViewItem Icon="Home" Content="Home" Tag=views:HomePage />
在C#中,我将编写类似navItem.Tag = typeof(HomePage)
这样的代码。
请注意,我不是在尝试将Tag设置为页面的实例,而是将页面的类型设置为。
如果我引用views:HomeView
部分,它将被存储为字符串。我之前声明了视图命名空间:
xmlns:views="using:MyApp.Views"
如何在XAML中为typeof(Page)的属性分配值?谢谢。
答案 0 :(得分:0)
不确定为什么要为Tag分配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
,可以将类型放入集合中,然后将“类型”项绑定到标签。因此,后面的代码如下所示:
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());
答案 1 :(得分:0)
从NavigationViewItem派生一个类,添加Type类型的Tag属性,然后使用new关键字隐藏type对象的继承Tag属性。
public class NavigationViewItemEx : NavigationViewItem
{
public new Type Tag { get; set; }
}
您需要限定XAML中的类型。位于页面顶部的其他命名空间
xmlns:local="using:App1"
然后在页面内容本身中使用以下内容:
<NavigationView SelectionChanged="NavigationView_OnSelectionChanged">
<NavigationView.MenuItems>
<local:NavigationViewItemEx Icon="Home" Content="Home" TargetPageType="local:MainPage" />
...
</NavigationView>
照常处理OnSelectionChanged事件,但是将SelectedItem强制转换为新类,而不是NavigationViewItem。
private void NavigationView_OnSelectionChanged(NavigationView sender, NavigationViewSelectionChangedEventArgs args)
{
NavigationViewItemEx selectedItem = args.SelectedItem as NavigationViewItemEx;
Type targetPageType = selectedItem?.Tag;
//null checking, etc. here
yourFrame.Navigate(targetPageType);
...
这回答了问题,但是有些人对隐藏继承的属性感到不舒服,因此使用其他属性(例如TargetPageType
)代替Tag可能更可口。