Windows 10 UAP GridView ItemsPanel未正确包装

时间:2015-08-26 08:10:41

标签: c# gridview windows-10

我将应用程序从Win8.1移植到Win10(由于范围更改,它是UAP的完全重写),并遇到了问题。

我们正在尝试在GridView中按照创建日期(年和月)显示几百个项目。在W8.1上很简单,使用CollectionViewSource创建一个GridView,设置GroupingStyle,它会包装这些项目,以便我们可以垂直滚动。

然而,在W10上,由于某种原因,所有已定义的Panel都违反了这一点,并将项目水平包装,从而制作列表而不是实际的水平可滚动网格视图。这不是我想要的行为。

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

有没有办法在Win10中实现Panel的原始W8.1行为?

1 个答案:

答案 0 :(得分:1)

前几天遇到同样的问题,并且能够通过在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的宽度用于所有GroupItems ......我最终能够修复它。查看我的blog了解详情。