如何实现自适应布局,其中项目在网格中调整大小以适应您添加的项目?
How to achieve an adaptive layout where items resize in a grid to fit as you add items?
我正在尝试完成一个布局,其中当我将项目添加到集合中时,项目在网格中显示得更小,这样:
有 1 个项目是全屏
2是全屏
对于 3 个,每个项目占屏幕的 1/3
第 4 个它添加一行并在 7 10 等元素处再次执行
因此,如果有 6 个元素,结果与 maxcolumn = 3 的 wrapgrid 相同,但小于 3 的项目仍然占据所有大小(这是为了显示图片以供选择,所以如果图片较少,我希望它们更大,1 或 2 张图片的情况在我的情况下很常见。
编辑:我试图实现的一个很好的例子是 WPF 的 UniformGrid,它的布局会随着您添加项目而调整。
有多种方法可以实现这种效果。下面是使用 ViewBox 和 GridView 的解决方案。
在XAML中(您可以使用绑定的 IconUri 将矩形更改为图像):
<Viewbox x:Name="box">
<GridView x:Name="test" Margin="0,0,0,0" MaxHeight="800" MaxWidth="800" Grid.Column="1" >
<GridView.ItemTemplate>
<DataTemplate>
<StackPanel Margin="20">
<TextBlock Text="{Binding Name}" FontWeight="Bold"
Style="{StaticResource BaseTextBlockStyle}"/>
<Rectangle Width="100" Height="30" Fill="Red" />
<TextBlock Text="{Binding IconUri}" TextWrapping="NoWrap"
Style="{StaticResource BodyTextBlockStyle}" />
</StackPanel>
</DataTemplate>
</GridView.ItemTemplate>
<GridView.ItemsPanel>
<ItemsPanelTemplate>
<ItemsWrapGrid MaximumRowsOrColumns="3" Orientation="Horizontal"/>
</ItemsPanelTemplate>
</GridView.ItemsPanel>
<GridView.GroupStyle>
<GroupStyle HidesIfEmpty="True">
<GroupStyle.HeaderTemplate>
<DataTemplate>
<Grid Background="LightGray" Margin="0">
<TextBlock Text='{Binding Name}'
Foreground="Black" Margin="30"
Style="{StaticResource HeaderTextBlockStyle}"/>
</Grid>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</GridView.GroupStyle>
</GridView>
</Viewbox>
反恐精英中:
cvsProjects = new List<Project>();
Project item0 = new Project() { Name = "pic1", IconUri = "Images/p1.jpg"};
Project item1 = new Project() { Name = "pic2", IconUri = "Images/p2.jpg" };
Project item2 = new Project() { Name = "pic3", IconUri = "Images/p3.jpg" };
Project item3 = new Project() { Name = "pic4", IconUri = "Images/p4.jpg" };
Project item4 = new Project() { Name = "pic5", IconUri = "Images/p5.jpg" };
Project item5 = new Project() { Name = "pic6", IconUri = "Images/p6.jpg" };
cvsProjects.Add(item0);
cvsProjects.Add(item1);
cvsProjects.Add(item2);
cvsProjects.Add(item3);
cvsProjects.Add(item4);
cvsProjects.Add(item5);
test.ItemsSource = cvsProjects;
我正在尝试完成一个布局,其中当我将项目添加到集合中时,项目在网格中显示得更小,这样:
有 1 个项目是全屏 2是全屏 对于 3 个,每个项目占屏幕的 1/3 第 4 个它添加一行并在 7 10 等元素处再次执行
因此,如果有 6 个元素,结果与 maxcolumn = 3 的 wrapgrid 相同,但小于 3 的项目仍然占据所有大小(这是为了显示图片以供选择,所以如果图片较少,我希望它们更大,1 或 2 张图片的情况在我的情况下很常见。
编辑:我试图实现的一个很好的例子是 WPF 的 UniformGrid,它的布局会随着您添加项目而调整。
有多种方法可以实现这种效果。下面是使用 ViewBox 和 GridView 的解决方案。
在XAML中(您可以使用绑定的 IconUri 将矩形更改为图像):
<Viewbox x:Name="box">
<GridView x:Name="test" Margin="0,0,0,0" MaxHeight="800" MaxWidth="800" Grid.Column="1" >
<GridView.ItemTemplate>
<DataTemplate>
<StackPanel Margin="20">
<TextBlock Text="{Binding Name}" FontWeight="Bold"
Style="{StaticResource BaseTextBlockStyle}"/>
<Rectangle Width="100" Height="30" Fill="Red" />
<TextBlock Text="{Binding IconUri}" TextWrapping="NoWrap"
Style="{StaticResource BodyTextBlockStyle}" />
</StackPanel>
</DataTemplate>
</GridView.ItemTemplate>
<GridView.ItemsPanel>
<ItemsPanelTemplate>
<ItemsWrapGrid MaximumRowsOrColumns="3" Orientation="Horizontal"/>
</ItemsPanelTemplate>
</GridView.ItemsPanel>
<GridView.GroupStyle>
<GroupStyle HidesIfEmpty="True">
<GroupStyle.HeaderTemplate>
<DataTemplate>
<Grid Background="LightGray" Margin="0">
<TextBlock Text='{Binding Name}'
Foreground="Black" Margin="30"
Style="{StaticResource HeaderTextBlockStyle}"/>
</Grid>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</GridView.GroupStyle>
</GridView>
</Viewbox>
反恐精英中:
cvsProjects = new List<Project>();
Project item0 = new Project() { Name = "pic1", IconUri = "Images/p1.jpg"};
Project item1 = new Project() { Name = "pic2", IconUri = "Images/p2.jpg" };
Project item2 = new Project() { Name = "pic3", IconUri = "Images/p3.jpg" };
Project item3 = new Project() { Name = "pic4", IconUri = "Images/p4.jpg" };
Project item4 = new Project() { Name = "pic5", IconUri = "Images/p5.jpg" };
Project item5 = new Project() { Name = "pic6", IconUri = "Images/p6.jpg" };
cvsProjects.Add(item0);
cvsProjects.Add(item1);
cvsProjects.Add(item2);
cvsProjects.Add(item3);
cvsProjects.Add(item4);
cvsProjects.Add(item5);
test.ItemsSource = cvsProjects;