UWP ListView拖动触摸行为

Mik*_*tly 5 xaml listview drag-and-drop uwp

使用触摸触发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>
Run Code Online (Sandbox Code Playgroud)

Fra*_*SFT 0

在 WinRT 中,向左或向右“撕裂”项目会导致其分离,从而启动拖动行为。在 UWP 中,用户必须点击并按住某个项目一小会儿,然后移动该项目即可启动拖动操作。

是的,UWP 应用程序中启动拖动操作的行为已更改。

我的问题是:有没有办法恢复/实现旧的 WinRT 风格行为?

可能的方法是创建一个 DragBehavior 并附加到 ListView,在这个Behavior中,我们可以处理相关的触摸事件并使用UIElement.StartDragAsync 方法以编程方式启动拖放操作,以找到当前的ListViewItem,

public class FrameworkElementDragBehavior : DependencyObject, IBehavior
{
        private bool isMouseClicked = false;
        public DependencyObject AssociatedObject { get; private set; }

        public void Attach(DependencyObject associatedObject)
        {
            var control = associatedObject as Control;
            if (control == null)
                throw new ArgumentException(
                    "FrameworkElementDragBehavior can be attached only to Control");

            AssociatedObject = associatedObject;

            ((FrameworkElement)this.AssociatedObject).Holding += FrameworkElementDragBehavior_Holding;
            ((FrameworkElement)this.AssociatedObject).DragStarting += FrameworkElementDragBehavior_DragStarting;
        }

        private void FrameworkElementDragBehavior_Holding(object sender, Windows.UI.Xaml.Input.HoldingRoutedEventArgs e)
        {
            //Just for example, not the completed code
            var obj = ((ListView)sender).SelectedItem as ListViewItem;

            if (obj != null)
            {
                //Call the UIElement.StartDragAsync method
            }
        }

        private void FrameworkElementDragBehavior_DragStarting(UIElement sender, DragStartingEventArgs args)
        {
            throw new NotImplementedException();
        }

        public void Detach()
        {
            AssociatedObject = null;
        }
}
Run Code Online (Sandbox Code Playgroud)