拖放在Windows 10 Mobile上的UWP应用程序中不起作用

时间:2018-01-15 16:58:44

标签: c# mobile uwp drag

我使用C#和XAML开发UWP应用程序。我尝试实现拖放功能。

这是一个简单的应用程序来演示我如何尝试这样做。该应用程序有两个边框 - 一个边框被拖动,第二个边框用于拖放。我还写了关于要输出的事件的信息。

版本1(在拖动的项目上使用CanDrag = true)

<Page x:Class="UWP_DragDrop.MainPage"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="using:UWP_DragDrop"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  mc:Ignorable="d">

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
    <Border x:Name="draggedItem"
            Grid.Row="0"
            Height="100"
            Width="150"
            HorizontalAlignment="Center"
            VerticalAlignment="Center"
            Background="Red"
            CanDrag="True"
            DragStarting="draggedItem_DragStarting"
            DropCompleted="draggedItem_DropCompleted">
        <TextBlock Text="Drag this item"
                   HorizontalAlignment="Center"
                   VerticalAlignment="Center" />
    </Border>
    <Border x:Name="dropArea"
            Grid.Row="1"
            Height="100"
            Width="150"
            HorizontalAlignment="Center"
            VerticalAlignment="Center"
            Background="Blue"
            AllowDrop="True"
            DragEnter="dropArea_DragEnter"
            Drop="dropArea_Drop">
        <TextBlock Text="Drop here"
                   HorizontalAlignment="Center"
                   VerticalAlignment="Center" />
    </Border>
</Grid>

using System.Diagnostics;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace UWP_DragDrop
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        private void draggedItem_DragStarting(UIElement sender, DragStartingEventArgs args)
        {
            Debug.WriteLine("draggedItem_DragStarting");
        }

        private void draggedItem_DropCompleted(UIElement sender, DropCompletedEventArgs args)
        {
            Debug.WriteLine("draggedItem_DropCompleted");
        }

        private void dropArea_DragEnter(object sender, DragEventArgs e)
        {
            Debug.WriteLine("dropArea_DragEnter");
            e.AcceptedOperation = Windows.ApplicationModel.DataTransfer.DataPackageOperation.Copy;
        }

        private void dropArea_Drop(object sender, DragEventArgs e)
        {
            Debug.WriteLine("dropArea_Drop");
        }
    }
}

1)当我在Visual Studio for LocalMachine和Simulator中运行它时,它可以正常工作(但仅用于鼠标输入)。在输出中,我有以下内容:

draggedItem_DragStarting dropArea_DragEnter dropArea_Drop draggedItem_DropCompleted

2)当我尝试在模拟器中运行它(触摸模式)时 - 我无法拖动项目。没有一个事件被触发(输出为空)

3)当我尝试在Windows 10 Mobile模拟器中运行它时,它不起作用。我在输出中看到的是:

draggedItem_DragStarting draggedItem_DropCompleted

一旦移动元素 - DropCompleted事件就会触发。

版本2(使用StartDragAsync)

我为拖动项删除了CanDrag = true,并通过StartDragAsync开始拖动操作。

<Page x:Class="UWP_DragDrop.MainPage"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="using:UWP_DragDrop"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  mc:Ignorable="d">

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
    <Border x:Name="draggedItem"
            Grid.Row="0"
            Height="100"
            Width="150"
            HorizontalAlignment="Center"
            VerticalAlignment="Center"
            Background="Red"
            PointerMoved="draggedItem_PointerMoved"
            DragStarting="draggedItem_DragStarting">
        <TextBlock Text="Drag this item"
                   HorizontalAlignment="Center"
                   VerticalAlignment="Center" />
    </Border>
    <Border x:Name="dropArea"
            Grid.Row="1"
            Height="100"
            Width="150"
            HorizontalAlignment="Center"
            VerticalAlignment="Center"
            Background="Blue"
            AllowDrop="True"
            DragEnter="dropArea_DragEnter"
            Drop="dropArea_Drop">
        <TextBlock Text="Drop here"
                   HorizontalAlignment="Center"
                   VerticalAlignment="Center" />
    </Border>
</Grid>

using System.Diagnostics;
using Windows.ApplicationModel.DataTransfer;
using Windows.Foundation;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Input;

namespace UWP_DragDrop
{
    public sealed partial class MainPage : Page
    {
        IAsyncOperation<DataPackageOperation> _dragOperation;

        public MainPage()
        {
            this.InitializeComponent();
        }

        private void draggedItem_PointerMoved(object sender, PointerRoutedEventArgs e)
        {
            if (e.Pointer.IsInContact && (_dragOperation == null))
            {
                Debug.WriteLine("draggedItem_StartDragAsync");
                _dragOperation = draggedItem.StartDragAsync(e.GetCurrentPoint(draggedItem));
                _dragOperation.Completed = DragCompleted;
            }
        }

        private void DragCompleted(IAsyncOperation<DataPackageOperation> asyncInfo, AsyncStatus asyncStatus)
        {
            _dragOperation = null;
            Debug.WriteLine("draggedItem_DragCompleted");
        }

        private void draggedItem_DragStarting(UIElement sender, DragStartingEventArgs args)
        {
            Debug.WriteLine("draggedItem_DragStarting");
        }

        private void dropArea_DragEnter(object sender, DragEventArgs e)
        {
            Debug.WriteLine("dropArea_DragEnter");
            e.AcceptedOperation = DataPackageOperation.Copy;
        }

        private void dropArea_Drop(object sender, DragEventArgs e)
        {
            Debug.WriteLine("dropArea_Drop");
        }
    }
}

1)桌面和模拟器(鼠标模式)有效。

2)模拟器(触摸模式)现在也可以使用。

3)Windows 10移动模拟器不起作用。 DropCoartter再次在DragStarting之后立即触发。

如何在Windows 10移动设备上进行拖放操作?为什么版本1在方案2和3中不起作用,而版本2在方案3中不起作用?

1 个答案:

答案 0 :(得分:1)

不幸的是,仿真器和移动设备目前似乎不支持自定义拖动。详情请参阅this known issue。正如雷蒙德所说:

  

您可以在列表视图中拖放项目,任何UI元素都可以是放置目标,但不会拖动到其他进程或拖动自定义。

目前,Windows 10不支持完整的拖放功能。