Windows 10 UAP gridviewitemspanel没有正确包装

本文关键字:包装 UAP gridviewitemspanel Windows | 更新日期: 2023-09-27 18:10:02

我正在将一个应用程序从Win8.1移植到Win10(由于范围的变化,它是对UAP的完全重写),并且遇到了一个问题。

我们试图在GridView中显示几百个项目,按其创建日期(年和月)分组。在W8.1上,这很容易,创建一个GridView与CollectionViewSource,设置GroupingStyle,它会包装项目,这样我们就可以垂直滚动。

然而,在W10上,由于某种原因,所有已定义的面板都无视这一点,并将项目水平包裹,从而生成列表而不是实际的水平可滚动的网格。这不是我想要的行为。

我尝试了VariableSizedWrapGrid,它可以做到这一点,但只能静态地。它需要一个MaximumRowsOrColumns值,如果我设置了这个值,我就可以在给定的高度上实现换行。由于我的项目是固定高度的(VSWG ItemsHeight和ItemsWidth设置为90,我的项目是1行3列),如果窗口高度小于容纳项目所需的数量,这将导致垂直滚动网格视图。我希望这些项目能自动重新排列,这样就不会出现垂直滚动了。

是否有办法在Win10中实现原来的W8.1的面板行为?

Windows 10 UAP gridviewitemspanel没有正确包装

前几天也有同样的问题,并且能够通过捕捉GridView上的SizeChanged事件并给予底层VariableSizedWrapGrid一个等于GridView的ActualHeight的最大高度来修复它。

基本上就像:

private void GridView_SizeChanged(object sender, SizeChangedEventArgs e)
{
  var innerVariableSizedWrapGrid = ControlHelper.FindChild<VariableSizedWrapGrid>(((GridView)AssociatedObject));
  if (innerVariableSizedWrapGrid != null)
    innerVariableSizedWrapGrid.MaxHeight = ((GridView)AssociatedObject).ActualHeight;
}

(ControlHelper是一个VisualTree帮助类,用于查找孩子/父母。很多例子都可以在网上找到,如果你想要我的版本就问我)

我的GridView是这样的:(我省略了它的样式和Itemsource)

<GridView 
  ScrollViewer.HorizontalScrollBarVisibility="Auto"
  ScrollViewer.HorizontalScrollMode="Enabled"
  ScrollViewer.VerticalScrollMode="Disabled"
  SizeChanged="GridView_SizeChanged">
  <GridView.ItemsPanel>
    <ItemsPanelTemplate>
      <VariableSizedWrapGrid Orientation="Horizontal" />
    </ItemsPanelTemplate>
  </GridView.ItemsPanel>
</GridView>

请注意,在W10中,VariableSizedWrapGrid的默认方向从垂直更改为水平(用于桌面应用程序)。ScrollViewer的属性。这将确保你不能垂直滚动。

哦,顺便说一句,我看到你也在使用分组,我遇到了一些问题。似乎第一个GroupItem的宽度用于所有GroupItem…我最终修好了它。