перетаскивание — отставание в UWP

Здравствуйте любители перетаскивания,

Кто-нибудь может объяснить, почему я вижу большую задержку при использовании перетаскивания с моими приложениями UWP?

Я написал тестовое приложение, которое содержит только обработчики сообщений перетаскивания, а также обработчики указателей для сравнения. Вот код...

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

        grid1.AllowDrop = true;
        grid1.DragOver += Grid1_DragOver;
        grid1.Drop += Grid1_Drop;
        grid1.DragLeave += Grid1_DragLeave;

        grid1.PointerEntered += Grid1_PointerEntered;
        grid1.PointerExited += Grid1_PointerExited;

    }

    //  Drag Handlers ************************
    private void Grid1_DragOver(object sender, DragEventArgs e)
    {
        msgFromPointer.Text = "  drag/drop item has entered";

        e.AcceptedOperation = Windows.ApplicationModel.DataTransfer.DataPackageOperation.Copy;
        Debug.WriteLine("in grid1 drag over handler");
    }

    private void Grid1_DragLeave(object sender, DragEventArgs e)
    {
        msgFromPointer.Text = "";
    }

    private void Grid1_Drop(object sender, DragEventArgs e)
    {
        Debug.WriteLine("in grid1 drop handler");
    }


    // pointer handlers *******************
    private void Grid1_PointerEntered(object sender, PointerRoutedEventArgs e)
    {

        msgFromPointer.Text = "POINTER has entered";
    }

    private void Grid1_PointerExited(object sender, PointerRoutedEventArgs e)
    {
        msgFromPointer.Text = "";
    }

При перетаскивании в мое приложение, кажется, происходит задержка около 1/2 секунды, прежде чем мое приложение получает сообщение dragOver. Для сравнения, кажется, что сообщение pointerOver поступает почти одновременно с перемещением указателя. Медленное поведение одинаково при использовании сенсорного экрана или мыши. Вот видео поведения…

видео о задержках

Компьютер, который я использую, имеет сенсорный экран, и мне интересно, есть ли какой-то сенсорный «драйвер» или фильтр, который замедляет сообщение перетаскивания. Я пробовал кучу настроек конфигурации Windows, таких как настройки мыши и дисплея, но без изменений. ПК — Dell Inspiron 3593 с последними драйверами. Моя версия Windows 10 — 1903, сборка 18362.836.

Приложение, которое я разрабатываю, использует много перетаскивания, и это медленное поведение делает пользовательский интерфейс действительно сложным. Это как пытаться вести телефонный разговор с задержкой в ​​1/2 секунды.

Любые идеи?

Дэн


person Dan Scavezze    schedule 23.05.2020    source источник
comment
кажется, что задержка требуется для загрузки миниатюры в DragUI, попробуйте еще раз с миниатюрой файла с более кэшируемой информацией, например, с миниатюрой файла .txt, также проверьте, что происходит, когда вы перетаскиваете несколько файлов.   -  person Xeorge Xeorge    schedule 24.05.2020
comment
Я попытался удалить файл .txt и несколько файлов, но получил такое же отставание. В приложении, которое я разрабатываю, я полностью отключил отрисовку миниатюры, но все равно получил то же отставание.   -  person Dan Scavezze    schedule 24.05.2020
comment
возможно, это связано с тем, что вы используете отладочную сборку, отладочные сборки намного медленнее и используют вдвое больше оперативной памяти, переключитесь на выпуск и проверьте, как все идет.   -  person Xeorge Xeorge    schedule 24.05.2020
comment
Я попробую это позже сегодня. Спасибо!   -  person Dan Scavezze    schedule 24.05.2020
comment
Хорошо, я сделал релизную сборку, но без изменений. Я обнаружил еще одну вещь. В приложении, которое я разрабатываю (в отличие от тестового приложения), когда я бросаю файл, приложение отображает изображение. Я обнаружил, что могу удалить файл до отображения миниатюры, глифа и текста. После той же задержки изображение отображается. Это заставляет меня думать, что все сообщения задерживаются - сообщение dragOver и сообщение drop. Затем, через 1/2 секунды, все сообщения доставляются, и приложение делает то, что должно.   -  person Dan Scavezze    schedule 25.05.2020


Ответы (1)


Событие DragOver запускается, когда приложение определяет, что элемент под текущим указателем является потенциальной целью размещения.

Это требует, чтобы указатель зависал в течение определенного периода времени. Это может быть причиной задержки, которую вы думаете.

Вы можете попробовать событие DragEnter, которое запускается раньше, чем DragOver.

Спасибо

person Richard Zhang - MSFT    schedule 25.05.2020
comment
Это было интересно! Я пробовал DragEnter раньше в своем основном приложении, и он НЕ сокращал задержку перед появлением миниатюры/глифа/текста, поэтому я не был оптимистичен. Однако я реализовал его в своем тестовом приложении только для повторного тестирования и добавил «DRAG ENTER message» в отображаемую текстовую строку. Конечно же, сообщение «DRAG ENTER» появилось сразу, но для появления эскиза/глифа/текста по-прежнему требуется 1/2 секунды. Означает ли это, что я должен жить с этой задержкой в ​​UWP? Раньше у меня были приложения, отличные от UWP, в которых этой задержки нет. - person Dan Scavezze; 26.05.2020
comment
Привет, Эта часть задержки - процесс восстановления миниатюры изображения, который нельзя пропустить на данный момент. - person Richard Zhang - MSFT; 26.05.2020
comment
ХОРОШО. Это отвечает на мой вопрос. Спасибо @Richard! В качестве постскриптума я попытался дать пользователю более раннюю обратную связь, изменив непрозрачность при получении сообщения dragOver. Однако новая непрозрачность не появлялась до тех пор, пока не отображалась миниатюра/глиф/заголовок. Затем я остановил отображение эскиза/глифа/заголовка с помощью элементов e.DragUIOverride, но не повезло. Изменение непрозрачности по-прежнему задерживается, хотя ни один из эскизов/глифов/заголовков не отображается. - person Dan Scavezze; 26.05.2020