Перетаскивание WPF в / из Windows Explorer, но не в / из себя - PullRequest
0 голосов
/ 22 января 2020

У меня есть radGridView, в который я могу перетаскивать файлы из Windows Explorer, и из которого я также могу перетаскивать файлы в Explorer.

Однако мне нужно запретить перетаскивание в себя (дублирование записей и также генерирует исключения).

WPF:

<telerik:RadGridView Name="radGridView" Drop="OnDrop" DragLeave="radGridView_DragLeave">
    <telerik:RadGridView.RowStyle>
        <Style TargetType="telerik:GridViewRow">
            <Setter Property="telerik:DragDropManager.AllowDrag" Value="True" />
        </Style>
    </telerik:RadGridView.RowStyle>

И обработчики:

private void OnDrop(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.FileDrop))
    {
        string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
        MessageManager.Publish("LoadDataFiles", files);
    }
}

private void radGridView_DragLeave(object sender, DragEventArgs e)
{
    [..]
    DragDrop.DoDragDrop(this, new DataObject(DataFormats.FileDrop, paths.ToArray()),
    DragDropEffects.Copy);
}

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

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

Он также иногда генерирует исключение после при удалении из вида сетки в проводник исключение происходит в строке DragDrop:

Помощник по управляемой отладке 'FatalExecutionEngineError': 'Во время выполнения обнаружена фатальная ошибка. Адрес ошибки был 0x70cca7d0 в потоке 0x48c8. Код ошибки 0x80131623. Эта ошибка может быть ошибкой в ​​CLR или в небезопасных или не поддающихся проверке частях пользовательского кода. Распространенными источниками этой ошибки являются ошибки пользовательского маршалинга для COM-взаимодействия или PInvoke, которые могут повредить стек. '

1 Ответ

0 голосов
/ 02 февраля 2020

Определение того, являются ли перетаскиваемые данные приемлемыми для цели, выполняется во время события DragOver. Вы должны обработать radGridView.DragOver и установить DragEventArgs.Effects на None, если отбрасываемые данные уже присутствуют в сетке.


DragLeave событие, которое вы, похоже, обрабатываете:

Происходит, когда объект перетаскивается из-за пределов элемента, который действует как цель отбрасывания, но не отбрасывается.

К моменту возникновения этого события операция перетаскивания уже выполняется. Но в вашем обработчике вы вызываете DragDrop.DoDragDrop, то есть то, что вы должны вызывать, чтобы сначала запустить перетаскивание. Поскольку одно уже выполняется, я не удивлен, что это вызовет какое-то исключение.

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


Что касается «пиктограммы при попадании в проводник файлов не правильно». Я не могу ничего сделать, пока ты не покажешь мне, что значит "не правильно". Я подозреваю, что вы хотите показать какой-то пользовательский курсор мыши, поэтому я скажу вам, что это должно быть сделано как часть события GiveFeedback.

...