当使用触摸触发ListView项目的拖放操作时,似乎WinRT(Windows 8 / 8.1)和UWP(Windows 10)应用程序之间的行为已更改 .
在WinRT中,向左或向右“撕开”项目会导致它被分离,从而启动拖动行为 . 在UWP中,用户必须轻敲并暂停一个项目,然后移动它以启动拖动动作 .
我的问题是:有没有办法恢复/实现旧的WinRT风格的行为?新的方式不是很明显,在有限的用户测试中,我还没有看到一个人在没有向他们解释的情况下解决问题 .
作为一个简单的例子,下面的XAML适用于WinRT和UWP,但是基于触摸的交互在WinRT中是很容易被发现的 .
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<ListView AllowDrop="True" CanReorderItems="True">
<ListView.Items>
<x:String>Item 1</x:String>
<x:String>Item 2</x:String>
<x:String>Item 3</x:String>
<x:String>Item 4</x:String>
<x:String>Item 5</x:String>
</ListView.Items>
</ListView>
</Grid>
3 回答
我想要在这里受到质疑的类似行为,因为我对默认的win10行为感到恼火 . 可能有更好的解决方案,但这是我提出的 .
上面是我的GridView和绑定数据 . 我注意到如果我使用gridviews candrop和dragstarted事件,我就不能做我喜欢的事情 . 所以我使用了指向压缩的datatemplates stackpanels,它会立即启动 .
那里你也有指针点 . 在stackpanel上启动以移动数据 .
在我设法在我的动物列表中传递动物的ID之后,休息只是正常的数据捕获 .
我希望这对某人有所帮助并且答案不会太长 .
我终于想出了如何恢复ListView的旧Windows 8.1行为 . 如果垂直滑动滚动轴,它仍然允许滚动滚动并启动 one 项目的拖动操作 . 它基于Comet library,由自定义ListView实现 . 我们的想法是在ListViewItem中允许TranslateX / TranslateY和System Manipulations . 为此,您需要覆盖默认的ListViewItem样式 .
如果你想使用控件,你必须记住一些事情:
复制Themes / Generic.xaml中的样式并调整local2命名空间 .
如果使用水平滚动ListView,则必须相应地设置ListView的Orientation属性 . 控件未检测到已使用的ItemsPanel .
您仍然可以使用常规的UWP拖放机制,但是您必须为旧的Windows 8.1样式拖动订阅名为ItemStartDragging的第二个事件 .
如果在使用8.1样式拖动时处理Drop事件,则可以在DragEventArgs.DataView中找到数据,而在使用DragItemStarting(= default事件)时可以在DragEventArgs.Data.GetView()中找到它 . 不知道他们为什么表现不同 .
样式非常基本 . 您可能希望更改它们并使它们更类似于原始的ListViewItem样式 .
这是代码:
这是Generic.xaml中的XAML:
是的,在UWP应用程序中已更改了开始拖动操作的行为 .
可能的方法是创建一个Drag Behavior并附加到ListView,在此行为中,我们可以处理相关的触摸事件并使用UIElement.StartDragAsync method以编程方式启动拖放操作,以查找当前的ListViewItem,