Drag'n drop in WPF blocks explorer

时间:2016-06-11 15:09:43

标签: c# wpf xaml drag-and-drop

在我的WPF应用程序中,我接受拖放文件,在检查它们是否是我想要的输入后,我打开一个弹出窗口,供用户输入有关删除文件的所有必要信息。我只使用drop事件中的文件名。

我的应用程序没有任何问题。但是,我注意到当我删除文件时,Windows资源管理器变得没有响应,如果我将鼠标指针悬停在它上面,我会得到一个“拖动”鼠标指针,直到我的应用程序中的弹出窗口再次关闭。

如果重要的话我会赢10。我该如何解决这个问题?

XAML:

 <Grid AllowDrop="True" Drop="Grid_Drop"> ... </Grid>

XAML.CS:

private void Grid_Drop(object sender, DragEventArgs e)
{
    if(e.Data.GetDataPresent(DataFormats.FileDrop))
    {
        var files = (string[])e.Data.GetData(DataFormats.FileDrop);

        foreach (var file in files)
        {
            // ... Check if file is acceptable and if so, open window
            ShowCreateEditWindow(file);                       
        }
    }
}

private void ShowCreateEditWindow(string filePath)
{
    var win2 = new CreateEditWindow();
    win2.DataContext = this;
    win2.CreateEdit.Title = "Adding entry";
    win2.fileLabel.Content = filePath;
    if (win2.ShowDialog() == true)
    {
        // If everything is ok, do other stuff
    }
    else return;
}

3 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,并使用以下方法解决了这个问题:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.timer = new DispatcherTimer();
        this.timer.Interval = TimeSpan.FromSeconds(1);
        this.timer.Tick += new EventHandler(timer_Tick);
        this.timer.Start();
    }

    void timer_Tick(object sender, EventArgs e)
    {
        if (this.dropData != null) {
            ProcessDropData(this.dropData);
            this.dropData = null;
        }
    }

    private void Window_Drop(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent(DataFormats.FileDrop)) {
            this.dropData = e.Data.GetData(DataFormats.FileDrop);
        }
    }

    private void ProcessDropData(object data)
    {
        string[] paths = (string[])data;
        // do work here
    }

    private DispatcherTimer timer;
    private object dropData;
}

使用DispatcherTimer允许稍后在UI线程中处理数据。

答案 1 :(得分:0)

使用 {0}代替win2.Show(),ShowDialog会创建一个阻止窗口。这意味着您无法使用

win2.ShowDialog

了。您可能应该用一些事件系统替换它。

答案 2 :(得分:0)

您可以使用Dispatcher.BeginInvoke()解决此问题。这将安排您的委托在UI线程的下一个空闲时间运行。这意味着拖放操作将首先完成,并且资源管理器将不会被锁定。