UWP - 获得第一个 child 的 Gridview

UWP - get first child of Gridview

<GridView x:Name="MainGridStations" ItemsSource="{x:Bind Stations}" IsItemClickEnabled="True" ItemClick="GridView_ItemClick">
            <GridView.ItemTemplate>
                <DataTemplate x:DataType="local:Station">
                    <Grid x:Name="WantToSelectByCode">
                        <Grid Background="White" HorizontalAlignment="Center" Width="300" Height="200" VerticalAlignment="Center">
                              <Grid Background="#e4f0fc" Height="65" VerticalAlignment="Bottom" Opacity="0.8">
                                <TextBlock x:Name="StationName" Text="{Binding Name}" FontWeight="Bold" Foreground="#2c9a8b" HorizontalAlignment="Center" />
                            </Grid>
                        </Grid>
                    </Grid>
                </DataTemplate>
            </GridView.ItemTemplate>
</GridView>

我正在尝试通过动态填充的 gridview 的索引 select child,但我尝试过的总是 returns null。

例如第一个child:

var container = MainGridStations.ContainerFromIndex(0);

var presenter = VisualTreeHelper.GetChild(container, 0) as GridViewItem;

我做错了什么?

您可以直接从ItemsControl.ContainerFromIndex(Int32)方法中获取对应的GridViewItem,无需再使用VisualTreeHelper获取。

var container = MainGridStations.ContainerFromIndex(0);
GridViewItem gridViewItem= container as GridViewItem;
gridViewItem.Background = new SolidColorBrush(Colors.Red);

container就是从索引中得到的对应GridViewItem

注意:由于你的内部Grid有一个Background="White" 属性的配置,你可以删掉我上面代码改成gridViewItem.Background的代码看看效果更明显。

---更新---

您必须在项目加载后获取 GridViewItem。您可以在 GridView_ItemClick 事件处理程序或页面的已加载事件处理程序中尝试代码。另外注意我上面的说明,为了效果更明显,请把你上面xaml代码中的Background="White"去掉。

private void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    var container = MainGridStations.ContainerFromIndex(0);
    GridViewItem gridViewItem = container as GridViewItem;
    gridViewItem.Background = new SolidColorBrush(Colors.Green);
}

//get the item here
private void GridView_ItemClick(object sender, ItemClickEventArgs e)
{
    var container = MainGridStations.ContainerFromIndex(0);
    GridViewItem gridViewItem= container as GridViewItem;
    gridViewItem.Background = new SolidColorBrush(Colors.Red);
    //var presenter = VisualTreeHelper.GetChild(container, 0) as GridViewItem;
}