【问题标题】:How to use drag&drop in an async task如何在异步任务中使用拖放
【发布时间】: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


【解决方案1】:

像这样使用 Invoke 解决了我的问题:

private async Task OpenForm2()
{
    this.Invoke((MethodInvoker)delegate
    {
        var form2 = new Form2("C:\\testfile.txt");
        var result = form2.ShowDialog();
    });
}

【讨论】:

    猜你喜欢
    • 2019-12-20
    • 2019-11-25
    • 1970-01-01
    • 2019-01-22
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多