Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 文件中的MessageBox拖放+;drop事件处理程序导致Windows资源管理器冻结_C#_.net_Wpf_Drag And Drop - Fatal编程技术网

C# 文件中的MessageBox拖放+;drop事件处理程序导致Windows资源管理器冻结

C# 文件中的MessageBox拖放+;drop事件处理程序导致Windows资源管理器冻结,c#,.net,wpf,drag-and-drop,C#,.net,Wpf,Drag And Drop,场景:C#/WPF应用程序,为UI控件启用dragdrop。从Windows资源管理器拖动文件并将其放到UI控件上时,会出现一个MessageBox 问题:只要没有点击MessageBox(点击“确定”),Windows资源管理器就会被冻结,并(可能)等待拖放事件返回 问题:有没有办法在显示消息框之前将Windows资源管理器从等待状态中释放出来?“DragEventArgs”类的“”属性如何 代码: private void OnDrop_ButtonOpen(object sender,

场景:C#/WPF应用程序,为UI控件启用dragdrop。从Windows资源管理器拖动文件并将其放到UI控件上时,会出现一个MessageBox

问题:只要没有点击MessageBox(点击“确定”),Windows资源管理器就会被冻结,并(可能)等待拖放事件返回

问题:有没有办法在显示消息框之前将Windows资源管理器从等待状态中释放出来?“DragEventArgs”类的“”属性如何

代码:

 private void OnDrop_ButtonOpen(object sender, DragEventArgs e)
 {
   if (e.Data.GetDataPresent(DataFormats.FileDrop))
   {
     string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
     MessageBox.Show(files[0]);
   }
 }
附言:还有其他类似的问题。但是,没有“过早”返回事件的解决方案。

如果我们看一下,我们可以看到它说:

当用户开始拖放操作时,源将创建一个数据对象,并通过调用DoDragDrop启动一个拖放循环

因此,源窗口现在被卡在由启动的循环中

当光标进入另一个窗口(称为目标窗口)时,
DoDragDrop
函数将调用目标窗口
IDropTarget
界面的
DragEnter
DragOver
方法

当您释放鼠标按钮将数据放入目标窗口时,
DoDragDrop
函数将调用
IDropTarget
界面的
drop
方法。如果我们继续阅读

当目标完成数据对象时,它从IDropTarget::Drop返回。系统返回源的DoDragDrop调用以通知源数据传输已完成

…我们看到源窗口的
DoDragDrop
调用在目标窗口退出其
IDropTarget::Drop
方法之前不会退出

在.NET中,当调用
IDropTarget::Drop
方法时,它将引发
DragDrop
事件。引发事件意味着它调用所有附加的
DragDrop
事件处理程序,并且由于这不是异步的,调用方法(
IDropTarget::Drop
)将被阻止,直到调用并退出所有
DragDrop
事件处理程序

因此,要回答您的问题:不,您不能“过早”返回。它被每线程代码执行的标准逻辑阻止:一次一行

您的最佳选择如下:

  • 在显示消息框的位置启动任务/新线程。您可能需要为此创建一个消息循环,但我不能100%确定

  • 创建您自己的消息框表单,并使用非模式调用
    form.show()
    显示它


  • 最终,MessageBox将被(可能很耗时的)将filedrop加载到内存中所取代。不过,该应用程序也应该能够通过一个常见的“打开文件”对话框打开文件。我的sw架构初学者直觉告诉我(可能是错误的),无论文件名/路径如何(dragdrop或dialog),都应该使用相同的文件加载函数。然而,这里也许没有矛盾。也许可以从打开的对话框上下文和“国外”任务调用相同的加载文件函数?@AddeTbkg:是的,通用函数是最好的。是的,可以从OFD和另一个线程/任务调用该函数。请记住,线程和任务必须调用才能访问UI。