WPF从Windows资源管理器拖放到/从Windows资源管理器拖放

时间:2020-01-22 18:40:48

标签: c# .net wpf drag-and-drop

我有一个radGridView,可以从Windows资源管理器中删除文件,也可以从中将文件拖到资源管理器中。

但是,我需要禁止拖入自身(复制条目并生成异常)。

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有时也会被调用。

有时它还会在从gridview拖放到文件资源管理器后生成异常,该异常发生在DragDrop行上:

托管调试助手'FatalExecutionEngineError':'运行时 遇到致命错误。错误的地址在 0x70cca7d0,在线程0x48c8上。错误代码为0x80131623。这个错误 可能是CLR中或bug的不安全或不可验证部分中的错误 用户代码。此错误的常见来源包括用户封送处理错误 用于COM-interop或PInvoke,这可能会破坏堆栈。'

1 个答案:

答案 0 :(得分:0)

DragOver事件期间确定目标是否接受了拖动的数据。如果要删除的数据已经存在于网格中,则应该处理radGridView.DragOver并将DragEventArgs.Effects设置为None


您似乎正在处理的DragLeave事件:

在将对象拖到充当放置目标的元素的边界内而没有被放置的情况下发生。

在引发此事件时,拖放操作已经在进行中。但是在您的处理程序中,您调用DragDrop.DoDragDrop,这是您首先要开始拖放的调用。既然已经在进行中,我不奇怪这会引发某种异常。

除了重新审视WPF Drag and Drop Overview并确保您了解哪些事件起什么作用外,我不确定可以提供什么建议。


关于“放入文件资源管理器时的图标不正确”。如果没有您向我展示“不正确”的意思,我将无能为力。我怀疑您想显示某种自定义鼠标光标,所以我会告诉您,这应该作为GiveFeedback事件的一部分来完成。

相关问题