【发布时间】:2021-01-05 15:21:42
【问题描述】:
我的目标是将文件从我的应用中拖放到网站的拖放区中。
为此,我制作了这个表格:
public partial class Form2 : Form
{
private DataObject File;
public Form2(string filePath)
{
InitializeComponent();
File = new DataObject();
File.SetFileDropList(new StringCollection() { filePath });
labelFileName.Text = Path.GetFileName(filePath);
}
private void labelFileName_MouseDown(object sender, MouseEventArgs e)
{
labelFileName.DoDragDrop(File, DragDropEffects.Copy);
}
}
如果我这样使用它就可以了:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
var form2 = new Form2("C:\\testfile.txt");
form2.ShowDialog();
}
}
但是,如果我在这样的异步任务中使用它,拖放将不起作用:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private async void buttonRunAsync_Click(object sender, EventArgs e)
{
await Task.Run(() => OpenForm2());
}
private async Task OpenForm2()
{
var form2 = new Form2("C:\\testfile.txt");
form2.ShowDialog();
// do some stuff based on dialog result
}
}
我认为这是因为它没有在 UI 线程中运行,但我没有找到好的解释,而且我不确定这是否是问题所在。
【问题讨论】:
-
为什么你认为你需要异步?
-
当你说“它不起作用”时,你能描述一下吗?它因异常而崩溃?
-
Task.Run方法在后台线程上执行提供的委托。在您的情况下,这是一个问题,因为不允许在 UI 线程之外的任何其他线程中访问 UI 元素。如果您的意图是在显示form2对话框时保持主表单响应(畅通),请查看this 问题。 -
@LarsTech 我并不特别需要异步。我需要在异步任务中显示此对话框,然后等待用户拖放并点击 OK。
-
@WSC 拖放功能不起作用。我无法将其拖出我的应用程序。其他一切正常。
标签: c# winforms asynchronous drag-and-drop