Windows 8 拖放;在Windows 8应用商店应用程序(C#)中使用触摸手势拖放可变大小的WrapGrid项目
更新: 我通过支持渠道收到MS的回复,即当ItemPanelTemplate是VariableSizeWrapGrid时,目前不可能支持触摸重新排序,因为它缺少实现触摸重新排序所需的一些接口。 作为前言(并消除任何误解),我确实具备使用鼠标所需的功能。我所需要的就是通过触摸手势实现相同的功能 要求: 1.在可水平滚动的容器中显示一组项目,每个项目可以是半高或全高。应该可以通过在新位置拖放来重新排列它们。 2.为用户提供一种取消选择以前选择的项目的方法(与使用鼠标右键单击的效果相同) 我当前的代码: XAML(为清晰起见略微简化) 我尝试过各种各样的布局控件组合(例如取消外部ScrollViewer或StackPanel,或用网格替换),但没有一种支持正确的水平滚动或项目大小调整。将GridView.ItemsPanel从VariableSizedWrapGrid切换到just WrapGrid也没有帮助 请注意以下标志的组合: IsSweepEnabled=“True”CanDragItems=“True”CanReorderItems=“True”AllowDrop=“True”IsItemClickEnabled=“False”。Windows 8 拖放;在Windows 8应用商店应用程序(C#)中使用触摸手势拖放可变大小的WrapGrid项目,windows-8,windows-store-apps,winrt-xaml,Windows 8,Windows Store Apps,Winrt Xaml,更新: 我通过支持渠道收到MS的回复,即当ItemPanelTemplate是VariableSizeWrapGrid时,目前不可能支持触摸重新排序,因为它缺少实现触摸重新排序所需的一些接口。 作为前言(并消除任何误解),我确实具备使用鼠标所需的功能。我所需要的就是通过触摸手势实现相同的功能 要求: 1.在可水平滚动的容器中显示一组项目,每个项目可以是半高或全高。应该可以通过在新位置拖放来重新排列它们。 2.为用户提供一种取消选择以前选择的项目的方法(与使用鼠标右键单击的效果相同) 我当前的代码
这就是鼠标d&d的工作原理,但触摸d&d或取消选择仍然没有成功。除非
项资源
绑定到可观察集合
,并且可以重新排序项
,CanDragItems
和AllowDrop
设置为真
,否则无法对网格视图重新排序。无需使用CollectionViewSource
在gridview
中启用重新排序。事实上,collectionviewsource
通常用于对gridview
进行分组,并且在分组数据时无法重新排序
无论如何,您的XAML将如下所示:
<Grid Background="Black">
<Grid.DataContext>
<local:MyModel/>
</Grid.DataContext>
<GridView CanReorderItems="True" CanDragItems="True" AllowDrop="True"
ItemsSource="{Binding Items}">
</GridView>
</Grid>
尽管任何可枚举的都可以绑定到网格视图的项源
,但它只是一个可观察集合
,支持重新排序。是的,您可以使用实现重新排序的自定义类型,但是当observetecollection
为您执行此操作时,为什么还要处理它呢
这是我回答中的一个片段
不要气馁。这比看起来容易
祝你好运 你看到这个了吗?Xyroid:这与我引用的GridViewEx的源代码相同。不幸的是,它的功能与其相似,但并不完全相同,我无法找出增量的哪一部分导致我的解决方案对手势不响应:-(我在这里讨论了一个类似的问题:。在我的情况下,将HorizontalScrollMode属性设置为Disabled会导致刷卡不起作用。最后,我被迫在GridView上启用HorizontalScrollMode。(这可能与您的情况无关。)标记正确的答案是礼貌的。杰瑞,我是你博客的忠实粉丝,对你只有深深的敬意。但是你的答案是……我应该如何把它……放到一个不同的问题上。当然,我的文章一定会被收集到。而且我不相信我提到了CollectionViewSourse。所以,虽然你的答案名义上是正确的,但我认为你的答案是正确的it’这不是我问题的答案。因此,恕我直言,我不会认为你的答案是正确的。因为它不是,而不是因为我不礼貌:——)
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);
}
}
<Grid Background="Black">
<Grid.DataContext>
<local:MyModel/>
</Grid.DataContext>
<GridView CanReorderItems="True" CanDragItems="True" AllowDrop="True"
ItemsSource="{Binding Items}">
</GridView>
</Grid>