我将应用程序从Win8.1移植到Win10(由于范围更改,它是UAP的完全重写),并遇到了问题。
我们正在尝试在GridView中按照创建日期(年和月)显示几百个项目。在W8.1上很简单,使用CollectionViewSource创建一个GridView,设置GroupingStyle,它会包装这些项目,以便我们可以垂直滚动。
然而,在W10上,由于某种原因,所有已定义的Panel都违反了这一点,并将项目水平包装,从而制作列表而不是实际的水平可滚动网格视图。这不是我想要的行为。
我尝试使用VariableSizedWrapGrid,它可以做到这一点,但只是静态的。它需要一个MaximumRowsOrColumns值,如果我设置,我可以在给定高度实现包装。由于我的项目是固定高度(VSWG ItemsHeight和ItemsWidth设置为90,我的项目是1行3列),如果窗口高度小于容纳项目所需的量,则会导致垂直滚动网格视图。我希望这些项目能够自动重新排列,因此不会发生垂直滚动。
有没有办法在Win10中实现Panel的原始W8.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了解详情。