如何在XAML for UWP应用程序中将Tag属性设置为typeof(Page)?

时间:2018-07-29 19:19:45

标签: uwp-xaml

如何为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)的属性分配值?谢谢。

2 个答案:

答案 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可能更可口。