【问题标题】:Navigating to a Page in VS2015 Windows 10 UWP using a Parameter使用参数导航到 VS2015 Windows 10 UWP 中的页面
【发布时间】:2016-04-10 06:36:02
【问题描述】:

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

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

但这是不可能的……因为这里的“链接”就像一个类型一样使用。 有没有办法投射它并使其工作?

【问题讨论】:

    标签: c# navigation visual-studio-2015 windows-10-universal


    【解决方案1】:

    首先,当您使用ItemClick event 时,“发送者”不是您的Menu 类,而是GridView 控件本身。所以你的代码var link = (sender as Menu).Link; 应该得到一个空引用异常。

    在这里我可以提供两种方法来完成这项工作,但这两种方法都使用SelectionChanged event,如下所示:

    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类中只定义一个属性,但是使用一个Converter来显示每个页面的名称。

    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) });
    }
    

    【讨论】:

      猜你喜欢
      • 2017-02-13
      • 2015-10-28
      • 2023-03-30
      • 1970-01-01
      • 2017-05-19
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 2018-08-01
      相关资源
      最近更新 更多