GridView和VariableSizedWrapGrid模板窗口存储应用程序

时间:2013-04-29 17:36:17

标签: c# xaml gridview windows-runtime windows-store-apps

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

smaller screen

bigger screen

我已将ItemsSource绑定到我的viewModel集合中,该集合包含12个项目。 有两个不同的问题: 首先,我如何让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);
            }
        }

感谢。

1 个答案:

答案 0 :(得分:0)

为了做到这一点,你要么必须编写自己的控件,要么你的viewmodel(应该存储你的itemssource)返回项目的子集。

如果您确实编写了自己的控件,则需要覆盖ArrangeOverride和MeasureOverride方法。然后,您将能够创建类似“MaximumColumns”的依赖项属性。然后,您的排列和测量方法可以根据是否有足够的空间来确定是否将子项添加到树中。我建议创建一个二维bool数组来跟踪哪些单元格被占用,然后有一个“Fit”函数,试图找到你正在添加的对象是否有空间。

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