2016-04-10 26 views
5

Utilizzo Visual Studio 2015 con l'aggiornamento 1. Ho creato una nuova applicazione UWP per Windows 10 con 2 pagine vuote. La prima pagina ha un GridView con un evento itemClick. L'oggetto che sto collegando al GridViewItem ha un campo stringa "Link" contenente il nome della Pagina a cui mi rivolgerò, facendo clic su questo GridViewItem.Navigazione verso una pagina in VS2015 Windows 10 UWP utilizzando un parametro

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

Ma questo non è possibile ... dal "collegamento" qui è usato come un tipo. C'è un modo per lanciarlo e farlo funzionare?

risposta

1

Prima di tutto, quando si utilizza ItemClick event, il "mittente" non è la vostra classe Menu, è il controllo GridView stesso. Quindi il tuo codice var link = (sender as Menu).Link; dovrebbe ottenere un'eccezione di riferimento null.

Qui posso fornitore di due modi per fare questo lavoro, ma tutti questi due modi utilizzano l'SelectionChanged event in questo modo:

private void gridView_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    var link = (gridView.SelectedItem as Menu).Link; 
    Frame.Navigate(link); 
} 

primo, definire due proprietà nella tua classe Menu in questo modo:

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

e utilizzare il GridView come questo:

<GridView x:Name="gridView" ItemsSource="{x:Bind menu}" SelectionChanged="gridView_SelectionChanged"> 
    <GridView.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Name}" FontSize="25" /> 
     </DataTemplate> 
    </GridView.ItemTemplate> 
</GridView> 

il codice sottostante per aggiungere dati alla 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 }); 
} 

secondo, si può semplicemente definire una proprietà nella classe Menu, ma utilizzare un convertitore per visualizzare il nome di ogni pagina.

Menu classe:

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

il TypeToStringConverter convertitore:

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

Ed è possibile utilizzare questo convertitore e il GridView in XAML come questo:

<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> 

codice dietro a aggiungi dati a 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) }); 
}