Entwickler-Ecke

Sonstiges (.NET) - Explorer hängt bei File Drop


ebber - So 25.01.09 19:11
Titel: Explorer hängt bei File Drop
Hallo,

ich habe ein Programm in das ich vom Windows Explorer Dateien reinziehen möchte. Das funktioniert auch. So:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
        private void SeFiWin_Drop(object sender, DragEventArgs e)
        {
            if (e.Data is DataObject && ((DataObject)e.Data).ContainsFileDropList())
            {
                foreach (string filePath in ((DataObject)e.Data).GetFileDropList())
                {
                        WindowAdd winAdd = new WindowAdd(this, filePath);
                        winAdd.ShowDialog();
                }
            } 
        }


Aber solange wie das läuft hängt der Explorer. Also so wie ich das sehe liegt das am ShowDialog. Aber wie kann ich das umgehen?

MfG


jaenicke - So 25.01.09 19:57

Du müsstest die Dateiliste dort nur auslesen und die Dialoge erst nach dem Ende von SeFiWin_Drop anzeigen.

Wie man dies am besten mit C# löst kann ich dir leider nicht sagen.


Kha - So 25.01.09 20:05

Das sollte mit BeginInvoke möglich sein: Schickt eine Windows-Message los, die erst nach Beenden des Drag-Vorgangs verarbeitet wird und den Delegate aufruft.


ebber - So 25.01.09 20:34

Danke. Das hat funktioniert.



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
        delegate void InsertDropsInvoke(DataObject da);
        private void SeFiWin_Drop(object sender, DragEventArgs e)
        {
            if (e.Data is DataObject && ((DataObject)e.Data).ContainsFileDropList())
            {
                this.Dispatcher.BeginInvoke(new InsertDropsInvoke(InsertDrops), ((DataObject)e.Data));
            }

            e.Handled = true;
        }

        private void InsertDrops(DataObject da)
        {
            foreach (string filePath in da.GetFileDropList())
            {
                    WindowAdd winAdd = new WindowAdd(this, filePath );
                    winAdd.ShowDialog();
            }
        }