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