WPF DragDrop:Window.ShowModal()挂起Windows资源管理器



我已经编写了代码,允许将文件从Windows资源管理器拖放到WPF应用程序中。在我的丢弃事件处理程序中,我启动一个窗口,其中显示有关丢弃文件的信息。如果我使用window.ShowModally()创建此窗口,则Windows资源管理器将挂起/冻结,直到我的应用程序中的窗口关闭。但是,如果我使用window.Show()创建窗口,则不会出现此问题。不幸的是,我要求以模式显示此窗口。

Windows资源管理器线程可能被锁定,因为它检测到其中一个文件正在被使用。有没有办法通知Windows资源管理器它不需要等待我的应用程序中的窗口关闭?我已经尝试将DragDropEventArgs.Handled设置为true,但这并不能解决问题。

一旦我从DragDrop中提取了数据,我就不再需要它了,所以如果有办法在我的Drop事件处理程序中取消或结束DragDrop,那么这将是一个可以接受的解决方案。

您不能在任何拖放事件处理程序中进行阻塞,这将挂起D+D管道,而死源窗口是预期的结果。

有一个简单的解决方法,只需要求调度程序在事件完成后运行您的代码。它的BeginInvoke()方法做得很优雅。大致:

private void Window_Drop(object sender, DragEventArgs e) {
// Do something with dropped object
//...
this.Dispatcher.BeginInvoke(new Action(() => {
var dlg = new DialogWindow();
dlg.Owner = this;
var result = dlg.ShowDialog();
// etc..
}));
}

最新更新