yal*_*tta 5 c# navigation visual-studio-2015 windows-10-universal
我正在使用Visual Studio 2015和Update 1.我创建了一个带有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));
}
Run Code Online (Sandbox Code Playgroud)
但这是不可能的......因为这里的"链接"就像一个类型一样使用.有没有办法施展它,并让它工作?
首先,当您使用ItemClick 事件时,“发送者”不是您的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);
}
Run Code Online (Sandbox Code Playgroud)
首先,在Menu类中定义两个属性,如下所示:
public class Menu
{
public Type Link { get; set; }
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并使用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>
Run Code Online (Sandbox Code Playgroud)
添加数据的后面的代码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 });
}
Run Code Online (Sandbox Code Playgroud)
第二个,您可以只在Menu类中定义一个属性,但使用转换器来显示每个页面的名称。
Menu班级:
public class Menu
{
public Type Link { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
转换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();
}
}
Run Code Online (Sandbox Code Playgroud)
您可以像这样使用此转换器和GridViewXAML 中的:
<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>
Run Code Online (Sandbox Code Playgroud)
添加数据的后面的代码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) });
}
Run Code Online (Sandbox Code Playgroud)