如何编写在GridView(XAML-Win8)组中流动项目的代码,如下图所示?
我目前有一个自定义TemplateSelector
,为第一个项目选择不同的(更大)模板,但是此处指定的流程为:
<GroupStyle.Panel>
<ItemsPanelTemplate>
<q42:WrapPanel Orientation="Horizontal" Width="440" Margin="0,0,80,0"/>
<!-- also tried VariableSizedWrapGrid -->
</ItemsPanelTemplate>
</GroupStyle.Panel>
类似地包装项目1到3,但是然后将项目4放在项目6的位置,而不填写项目4和5。
问题变成;如何编写与css类似的代码:
.item { display: inline-block; }
.item1 { float: left; }
,这会让物品像我想要的那样流动吗?
答案 0 :(得分:8)
Andreas Hammar将我与一个有效的解决方案联系起来:
using System.Collections.Generic;
using Application1.Data;
using Windows.Foundation;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace Application1
{
public class MyGridView : GridView
{
int _rowVal;
int _colVal;
readonly List<Size> _sequence;
public MyGridView()
{
_sequence = new List<Size>
{
LayoutSizes.PrimaryItem,
LayoutSizes.SecondarySmallItem,
LayoutSizes.SecondarySmallItem,
LayoutSizes.OtherSmallItem,
LayoutSizes.OtherSmallItem, // 5
LayoutSizes.OtherSmallItem,
LayoutSizes.SecondaryTallItem, // 7
LayoutSizes.OtherSmallItem,
LayoutSizes.SecondarySmallItem, // 9
LayoutSizes.OtherSmallItem,
LayoutSizes.SecondarySmallItem, // 11
LayoutSizes.SecondarySmallItem,
LayoutSizes.OtherSmallItem,
LayoutSizes.OtherSmallItem
};
}
protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
{
base.PrepareContainerForItemOverride(element, item);
var dataItem = item as SampleDataItem;
var index = -1;
if (dataItem != null)
{
index = dataItem.Group.Items.IndexOf(dataItem);
}
if (index >= 0 && index < _sequence.Count)
{
_colVal = (int) _sequence[index].Width;
_rowVal = (int) _sequence[index].Height;
}
else
{
_colVal = (int) LayoutSizes.OtherSmallItem.Width;
_rowVal = (int) LayoutSizes.OtherSmallItem.Height;
}
VariableSizedWrapGrid.SetRowSpan(element as UIElement, _rowVal);
VariableSizedWrapGrid.SetColumnSpan(element as UIElement, _colVal);
}
}
public static class LayoutSizes
{
public static Size PrimaryItem = new Size(6, 2);
public static Size SecondarySmallItem = new Size(3, 1);
public static Size SecondaryTallItem = new Size(2, 2);
public static Size OtherSmallItem = new Size(2, 1);
}
}
<local:MyGridView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</local:MyGridView.ItemsPanel>
<local:MyGridView.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<Grid Margin="1,0,0,6">
<Button
AutomationProperties.Name="Group Title"
Content="{Binding Title}"
Click="Header_Click"
Style="{StaticResource TextButtonStyle}"/>
</Grid>
</DataTemplate>
</GroupStyle.HeaderTemplate>
<GroupStyle.Panel>
<ItemsPanelTemplate>
<VariableSizedWrapGrid ItemWidth="80" ItemHeight="160" Orientation="Vertical" Margin="0,0,80,0" MaximumRowsOrColumns="3"/>
</ItemsPanelTemplate>
</GroupStyle.Panel>
</GroupStyle>
</local:MyGridView.GroupStyle>
</local:MyGridView>
答案 1 :(得分:1)
我认为可以通过VSWG来完成。 我已经到了一半,但没有时间来完成它......
首先,您需要设置附加的prop VariableSizedWrapGrid.RowSpan和ColSpan - 并且必须通过继承VSWG在项容器上设置: http://blogs.u2u.be/diederik/post/2012/03/07/Databinding-to-the-VariableSizedWrapGrid-in-Windows-8-Metro.aspx
在你的情况下,第一项为2x2,其余为1x1。
单元格大小的测量是在第一个元素上完成的,除非您明确指定ItemHeight等。所以你必须以某种方式完成这个:) http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/569e048a-9f5e-4fb3-870a-380de5906e80 WG支持单个尺寸的商品,所有商品都以相同的尺寸显示。 VSWG允许可变大小的项目,但允许的项目大小是基本单元大小的整数倍。 WG和VSWG在布局单元中工作。布局单元格的大小由ItemHeight和ItemWidth属性确定。如果未设置这些属性,则将第一项的大小用作单元大小,并且对于WG,以该大小测量后续项。对于VSWG,项目是基于RowSpan和ColumnSpan属性在单元格大小的整数乘法中测量的。 您似乎必须设置VSWG的高度和宽度,以便在不希望该项目位于列表中的第一个时容纳最大项目的大小。 - &GT;这是我无法解决的问题。
最后是水平方向。
祝你好运!