在VS2015 Windows 10 UWP中使用参数导航到页面

5

我正在使用带有更新1的Visual Studio 2015。我创建了一个新的UWP Windows 10应用程序,并且有2个空白页面。 第一页有一个GridView,其中包括一个itemClick事件。我将对象绑定到GridViewItem,该对象具有包含单击此GridViewItem时要导航到的页面名称的字符串字段“Link”。

private void GridView_ItemClick(object sender, ItemClickEventArgs e)
    {
        var link = (sender as Menu).Link;
        Frame.Navigate(typeof(link));
    }

但这是不可能的...因为这里的“link”被用作一种类型。有没有办法进行强制转换,使其工作?
1个回答

1
首先,当您使用 ItemClick 事件 时,"sender" 不是您的 Menu 类,而是 GridView 控件本身。因此,您的代码 var link = (sender as Menu).Link; 应该会得到一个空引用异常。
这里我可以提供两种方法来完成此工作,但这两种方法都使用 SelectionChanged 事件,如下所示:
private void gridView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var link = (gridView.SelectedItem as Menu).Link;
    Frame.Navigate(link);
}

首先,在您的Menu类中定义两个属性,如下所示:

public class Menu
{
    public Type Link { get; set; }
    public string Name { get; set; }
}

使用 GridView 的方式如下:
<GridView x:Name="gridView" ItemsSource="{x:Bind menu}" SelectionChanged="gridView_SelectionChanged">
    <GridView.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name}" FontSize="25" />
        </DataTemplate>
    </GridView.ItemTemplate>
</GridView>

GridView 添加数据的代码:

private ObservableCollection<Menu> menu = new ObservableCollection<Menu>();

public MainPage()
{
    this.InitializeComponent();
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    menu.Clear();
    menu.Add(new Menu { Link = typeof(Link1), Name = typeof(Link1).Name });
    menu.Add(new Menu { Link = typeof(Link2), Name = typeof(Link2).Name });
    menu.Add(new Menu { Link = typeof(Link3), Name = typeof(Link3).Name });
}

第二个问题,您可以在Menu类中定义一个属性,但使用转换器来显示每个页面的名称。 Menu类:
public class Menu
{
    public Type Link { get; set; }
}

转换器 TypeToStringConverter:

public class TypeToStringConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value == null)
            return "Error";
        var link = (value as Menu).Link;
        return link.Name;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

您可以像这样在XAML中使用此转换器和GridView:

<Page.Resources>
    <local:TypeToStringConverter x:Key="cvt" />
</Page.Resources>

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <GridView x:Name="gridView" ItemsSource="{x:Bind menu}" SelectionChanged="gridView_SelectionChanged">
        <GridView.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Converter={StaticResource cvt} }" FontSize="25" />
            </DataTemplate>
        </GridView.ItemTemplate>
    </GridView>
</Grid>

GridView 添加数据的后台代码:

private ObservableCollection<Menu> menu = new ObservableCollection<Menu>();

public MainPage()
{
    this.InitializeComponent();
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    menu.Clear();
    menu.Add(new Menu { Link = typeof(Link1) });
    menu.Add(new Menu { Link = typeof(Link2) });
    menu.Add(new Menu { Link = typeof(Link3) });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接