更新: 我通过支持渠道从MS收到答复,当ItemPanelTemplate是VariableSizeWrapGrid时,目前无法支持触摸重新排序 - 因为它缺少实现所需的某些接口。
作为前言(并消除任何误解),我确实使用鼠标所需的功能。我只需要通过触摸手势实现相同的功能。
要求: 1.在水平可滚动容器中显示一组项目,每个项目可以是半高或全高。应该可以通过在新位置拖放来重新排列它们。 2.为用户提供取消选择先前所选项目的方法(与使用鼠标右键单击的效果相同)。
我目前的代码:
XAML(为清晰起见略微简化)
<ScrollViewer HorizontalAlignment="Stretch"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Hidden">
<StackPanel Orientation="Horizontal" Height="600"
ScrollViewer.VerticalScrollMode="Disabled">
<controls:MyGridView ScrollViewer.VerticalScrollMode="Disabled"
ItemsSource="{Binding Items}"
SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
SelectionMode="Single"
IsSwipeEnabled="True"
CanDragItems="True"
CanReorderItems="True"
AllowDrop="True"
IsItemClickEnabled="False"
Height="600">
<GridView.ItemTemplate>
<DataTemplate>
<Grid>
<ContentControl Content="{Binding}"
ContentTemplateSelector="{StaticResource ItemTemplateSelector}"/>
</Grid>
</DataTemplate>
</GridView.ItemTemplate>
<GridView.ItemsPanel>
<ItemsPanelTemplate>
<VariableSizedWrapGrid ItemHeight="300"
ItemWidth="300"
Orientation="Vertical"/>
</ItemsPanelTemplate>
</GridView.ItemsPanel>
<GridView.ItemContainerStyle>
<Style TargetType="GridViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="VerticalContentAlignment" Value="Stretch"/>
</Style>
</GridView.ItemContainerStyle>
</controls:DashletsGridView>
</StackPanel>
</ScrollViewer>
MyGridView类是GridViewEx的扩展,它是this sample的一部分。 它对基类的唯一补充是:
protected override void PrepareContainerForItemOverride(Windows.UI.Xaml.DependencyObject element, object item)
{
try
{
Item d = item as Item;
if (d != null)
{
element.SetValue(VariableSizedWrapGrid.RowSpanProperty, d.Size == PossibleSizes.Half ? 1 : 2);
}
}
catch
{
element.SetValue(VariableSizedWrapGrid.RowSpanProperty, 2);
}
finally
{
base.PrepareContainerForItemOverride(element, item);
}
}
我尝试了各种各样的布局控件组合(例如消除外部ScrollViewer或StackPanel,或用网格替换它),但没有一个支持正确的水平滚动或项目大小调整。将GridView.ItemsPanel从VariableSizedWrapGrid切换到WrapGrid也无济于事。
请注意标志的组合: IsSwipeEnabled =“True”CanDragItems =“True”CanReorderItems =“True”AllowDrop =“True”IsItemClickEnabled =“False”。 这就是使用鼠标d&amp; d,但触摸d&amp; d或取消选择仍然没有运气。
答案 0 :(得分:0)
除非GridView
绑定到ItemsSource
且ObservableCollection
,CanReorderItems
和CanDragItems
设置为AllowDrop
,否则您无法对true
重新排序CollectionViewSource
。使用gridview
启用collectionviewsource
中的重新排序需要 。实际上,gridview
通常用于对<Grid Background="Black">
<Grid.DataContext>
<local:MyModel/>
</Grid.DataContext>
<GridView CanReorderItems="True" CanDragItems="True" AllowDrop="True"
ItemsSource="{Binding Items}">
</GridView>
</Grid>
进行分组,并且在对数据进行分组时无法进行重新排序。
无论如何,你的XAML看起来像这样:
enumerable
虽然任何ItemsSource
都可以绑定到GridView
的{{1}},但只有ObservableCollection
才能重新排序。是的,您可以使用实现重新排序的自定义类型,但是为什么ObservableCollection
为您执行此操作会导致其混乱?
这是我的回答here的摘录。
不要气馁。它比它看起来容易。
祝你好运!