У меня есть 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, которые могут повредить стек. '