0

我正在编写一个 Windows 商店应用程序,主页是分组项目的 GridView。我已经设法获取了GridView不同瓦片的模板,但问题如下:

小屏幕

更大的屏幕

我已将 ItemsSource 绑定到包含 12 个项目的 viewModel 集合。有两个不同的问题:首先,我怎样才能使 GridView 始终不显示最后一个或两个项目,这样尽管有“房间”,但总有一个或两个缺失的瓷砖,如图所示有界集合中的更多项目。

其次,我将 ItemTemplateSelector 用于基于索引的项目的不同模板。我的设计是在最后一项中我需要选择一个没有图像的模板(例如)。如何获取 GridView 中的最后一个可见项目?

这是我创建不同瓷砖尺寸的代码:

 protected override void PrepareContainerForItemOverride(Windows.UI.Xaml.DependencyObject element, object item)
        {
            try
            {
                IIndexable viewModel = item as IIndexable;
                element.SetValue(Windows.UI.Xaml.Controls.VariableSizedWrapGrid.ColumnSpanProperty, viewModel.Index == 0 ? 2 : 1);
                element.SetValue(Windows.UI.Xaml.Controls.VariableSizedWrapGrid.RowSpanProperty, viewModel.Index == 0 ? 2 : 1);
            }
            catch
            {
                element.SetValue(Windows.UI.Xaml.Controls.VariableSizedWrapGrid.ColumnSpanProperty, 1);
                element.SetValue(Windows.UI.Xaml.Controls.VariableSizedWrapGrid.RowSpanProperty, 1);
            }
            finally
            {
                base.PrepareContainerForItemOverride(element, item);
            }
        }

谢谢。

4

1 回答 1

0

为了做到这一点,您要么必须编写自己的控件,要么可以让您的视图模型(应该存储您的 itemssource)返回项目的子集。

如果您确实编写了自己的控件,则需要覆盖 ArrangeOverride 和 MeasureOverride 方法。然后,您将能够创建诸如“MaximumColumns”之类的依赖属性。然后,您的 Arrange 和 Measure 方法可以根据是否有足够的空间来确定是否将孩子添加到树中。我建议创建一个二维布尔数组来跟踪哪些单元格被占用,然后使用“Fit”函数来尝试查找是否有空间容纳您要添加的对象。

要返回项目的子集,您可以让您的视图模型计算每个项目将占用多少空间并返回适当项目的新集合,或者您可以将其硬限制为给定值。

于 2013-05-07T23:01:19.530 回答