2010-09-14 3 views
7

Ich versuche, eine träge Drag & Drop-Operation zu implementieren. Ich möchte meinem Benutzer eine Listview mit Dateien zeigen, wenn der Benutzer eine Datei zieht und in einen Ordner legt, der Inhalt heruntergeladen und zugestellt werden soll.Implement faul drag & drop

Ich benutze die IDataObject Schnittstelle, aber mein Problem ist, dass die GetData() Methode viel zu früh abgefragt wird. Zum Beispiel wird ein Ziehen über den Desktop (ohne jeglichen involvierten Tropfen) die Methode GetData() ein paar Mal abfragen. Und jeder dieser Aufrufe startet den Download der Datei:/

Jetzt ist meine Frage: Was ist hier falsch - warum wird die GetData() Methode ohne jeden Tropfen aufgerufen? Gibt es eine andere Möglichkeit zum Implementieren von Lazy Drag & Drop-Operationen in .net?

+0

Das Problem, das Sie haben werden, ist für das Drop-Ereignis im Explorer, wo Sie den Download starten möchten. Sie können dies per Drag-Drop auf ein anderes Steuerelement in Ihrem Formular überprüfen, das Sie beim Drop-Ereignis von abonnieren können. –

+0

Ja, das könnte mir helfen, aber es klingt viel komplizierter und bindet mich nur an den Explorer. Andere Targets, die Dateidrops normalerweise akzeptieren, können die Daten nicht abrufen. In der Theorie sollte das Drop-Ereignis * IDataObject.GetData() * aufrufen - und nur so sollte es sein. Dann kann ich die Daten liefern (direkt oder per Download). Es gibt jedoch Aufrufe zu diesen Funktionen ohne einen involvierten Abfall, was diesen Ansatz unbrauchbar macht. – tanascius

+0

Gibt es keine Möglichkeit, den Download zu verzögern, bis das empfangende Ende tatsächlich fragt, um die Bytes zu sehen? –

Antwort

1

Vielleicht für Sie könnte ... arbeiten

Bei jedem Auftreten des GetData() dies zu tun:

  • Sie hier eine Art von einem Timer benötigen.
  • Wenn Ihr Timer bereits aktiv ist, beenden Sie ihn.
  • erstellen und starten Sie einen neuen Timer. Machen Sie 1sec oder bestimmen Sie die Dauer des Experiments.
  • auf Timer-Ereignis tun, was zu tun ist.

Ich benutze ähnliche Prozedur bei vielen Gelegenheiten, wo solche Workaround benötigt wird.

+0

Das Problem hier ist, dass der Widerstand überhaupt abgebrochen werden konnte. – tanascius

+0

Sie sagen, dass Sie auf keinen Fall zwischen abgeschlossenem Drag & Drop und abgebrochenem unterscheiden können? –

+0

Ja, wie brechen Sie Ihren Timer ab, wenn ein Drag & Drop abgebrochen wird? – tanascius

1

Ich denke, dass GetData aufgerufen wird, damit das (potenzielle) Drop-Ziel bestimmen kann, ob es die (potenziellen) Drop-Elemente akzeptieren kann oder nicht. Haben Sie überlegt, eine Shell-Erweiterung zu verwenden?

+0

Soweit ich das verstehe [GetDataPresent] (http://msdn.microsoft.com/en- us/library/f0z723wb.aspx) Methode sollte zuerst aufgerufen werden. Versuche immer noch ... – tanascius