如何根据点击第一页的网格在导航页面(第2页)上加载UI

时间:2014-10-07 05:55:10

标签: c# xaml windows-store-apps winrt-xaml

我正在开发一个Windows应用商店8.1应用,我在MainPage.xaml.cs中使用List在MainPage.xaml中添加了网格

MainPage.xaml中

<GridView Margin="20" x:Name="main" SelectionMode="None" IsItemClickEnabled="True" ItemClick="main_ItemClick">
    <GridView.ItemTemplate>
        <DataTemplate>
            <Grid Background="Red" Width="250" Height="200">
                <Grid.RowDefinitions>
                    <RowDefinition Height="150"/>
                    <RowDefinition Height="2*"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
                <Image Grid.Row="0" Stretch="UniformToFill" Source="{Binding ImageLocation}"/>
                <TextBlock Text="{Binding Title}" Grid.Row="1" FontSize="28" />
                <TextBlock Text="{Binding SubTitle}" Grid.Row="2" FontSize="16" />

            </Grid>
        </DataTemplate>
    </GridView.ItemTemplate>
</GridView>

MainPage.xaml.cs中

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    List<data> myList = new List<data>();
    myList.Add(new data()
        {
            ImageLocation = @"Assets/network.png",
            iName = "NetWork",
            SubTitle ="Network",
            Title = "Network"
        });
    myList.Add(new data()
    {
        ImageLocation = @"Assets/fb.png",
        iName = "Facebook",
        SubTitle = "Facebook",
        Title = "Facebook"
    });


    main.ItemsSource = myList;
}

private void main_ItemClick(object sender, ItemClickEventArgs e)
{
    Frame.Navigate(typeof(ListView));
}

我希望当有人点击任何网格时,ListView页面中的TextBlock会显示在MainPage中单击了哪个网格。

1 个答案:

答案 0 :(得分:1)

如果不在代码中向您展示,这将是一个挑战,但是这里......

希望到目前为止您已经创建了两个页面。保存GridView的MainPage.xaml。还有一个DetailsPage.xaml,它将具有显示一个项目的布局。

在MainPage.xaml的代码隐藏中,就像你在示例代码中一样,你处理了GridView的ItemCLick,但是你想要点击项目的Id,而不是项目本身。原因是你要传递一个字符串,而不是一个复杂的对象。

在你的处理程序中,事件args(e)有一个名为ClickedItem的属性,它将是你绑定的项目。让我们假装它是你绑定的UserObject。在您的处理程序中执行以下操作:

var user = e.ClickedItem as UserObject;
this.Frame.Navigate(typeof(DetailPage), user.Id.ToString());

那么,这里发生了什么?几乎与之前相同的代码。除非您导航到第二页的类型而不是其他任何内容。您还传入(Navigate方法中的第二个参数)您要显示的确切记录。

然后在您的DetailPage.xaml代码隐藏中,您需要覆盖OnNavigatedTo方法。此方法是Navigation框架指向页面时调用的方法。它有一个NavigationPararmeter传递给它,你可以用来提取你传递的密钥。

我认为它实际上是你要使用的args.Parameter。您可以将其解析为整数,并使用它来获取应用程序内存中的单个记录。

var id = int.Parse(args.Parameter);
var user = YourFactory.GetUser(id);
  

我偏离这个的原因是你如何做到这一点&#34;我认为这是它的工作原理&#34;是因为虽然基本框架是这样运行的,但大多数开发人员并不像这样使用它。大多数开发人员都实现了类似Prism.StoreApps的东西,它不仅引入了轻量级MVVM框架,还引入了复杂的NavigationService,可以将参数直接注入到自动关联的视图模型中。

但基于你问题的简单性,尽量不要注意最后一点。我使用内置框架解释了基本工作流程。它工作正常,它将完成工作。当您准备编写更高级的实现时,您可以调查Prism.StoreApps

  

更多信息:http://msdn.microsoft.com/en-us/library/windows/apps/xx130655.aspx

祝你好运!