gpt4 book ai didi

c# - 文件拖放事件处理程序中的 MessageBox 导致 Windows 资源管理器卡住

转载 作者:太空宇宙 更新时间:2023-11-03 12:36:18 26 4
gpt4 key购买 nike

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

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

问题:有什么方法可以让 Windows Explorer 从显示 MessageBox 的等待状态中释放出来? “DragEventArgs”类的“Handled”属性怎么样?

代码:

 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]);
}
}

PS:还有其他类似的问题。但是,没有“过早地”返回事件的解决方案。

最佳答案

如果我们看一下this documentation article about Drag and Drop operations我们可以看到它说:

When the user starts a drag-and-drop operation, the source creates a data object and initiates a drag loop by calling DoDragDrop.

因此源窗口现在陷入了由 DoDragDrop function 启动的循环中.

当光标进入另一个窗口(称为目标窗口)时,DoDragDrop 函数将调用DragEnterDragOver 目标窗口的 IDropTarget 接口(interface)的方法。

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

When the target is finished with the data object, it returns from IDropTarget::Drop. The system returns the source's DoDragDrop call to notify the source that the data transfer is complete.

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

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

所以回答您的问题:不,您不能“过早”归还它。它被每线程代码执行的标准逻辑阻塞:一次一行。

您最好的选择是:

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

  2. 创建您自己的消息框表单并使用非模态调用 Form.Show() 显示它。

关于c# - 文件拖放事件处理程序中的 MessageBox 导致 Windows 资源管理器卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40854984/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com