Silverlight Drag and Drop API
Einführung
Drag and Drop ist eine gemeinsame UX Paradigma und eine Top angeforderte Funktion. In Silverlight 4 Beta, führten wir eine Reihe grundlegender API, um die häufigsten Szenario Ziehen und Ablegen von Dateien Bilder sie zu Silverlight-Anwendungen zu ermöglichen, und wir entwarf die API, damit wir mehr Drag & Drop-Funktionalitäten die Straße hinunter, ohne API ändern aussetzen , hoffentlich.
API
Unten ist der Kern der neuen API:
System.Windows-Namespace
(
public abstract class UIElement: DependencyObject
(
/ / Felder
public static readonly DependencyProperty AllowDropProperty;
/ / Events
öffentliche Veranstaltung DragEventHandler DragEnter;
öffentliche Veranstaltung DragEventHandler DragLeave;
öffentliche Veranstaltung DragEventHandler DragOver;
öffentliche Veranstaltung DragEventHandler Drop;
/ / Eigenschaften
public bool AllowDrop (get; gesetzt;)
)
sender, DragEventArgs e); public delegate void DragEventHandler (object sender, DragEventArgs e);
öffentlichen versiegelte Klasse DragEventArgs: RoutedEventArgs
(
/ / Methoden
public Point GetPosition (UIElement relativeTo);
/ / Eigenschaften
öffentlichen IDataObject Data ([SecuritySafeCritical] get;)
public bool Handled (get; gesetzt;)
)
)
Namespace System.Windows.Controls
(
public abstract class Control: FrameworkElement
(
protected virtual void OnDragEnter (DragEventArgs e);
protected virtual void OnDragLeave (DragEventArgs e);
protected virtual void OnDragOver (DragEventArgs e);
protected virtual void OnDrop (DragEventArgs e);
)
)
- AllowDrop: Dies ist die Abhängigkeit des Vermögens, der angibt, ob ein Element ein Drop-Ziel ist.
- DragEnter, DragLeave, DragOver & Drop: Es sind Ereignisse geroutet. Sie sprudeln, und das Feuer nur auf Elemente mit AllowDrop auf true gesetzt.
- OnDragEnter, OnDragLeave, OnDragOver & OnDrop: Dies sind virtuelle Funktionen für die Unterklassen zu überschreiben geschützt.
- DragEventArgs: Diese Klasse ermöglicht Drop-Ziel-oder Event-Handler-Methode überschreibt, um Zugriff auf die Daten gezogen wird oder zurückgenommen werden.
Verwendung
Es sind vor allem zwei Möglichkeiten, um Silverlight's Drag & Drop-API verwenden:
- Silverlight-Anwendungen können diese Dropziel Veranstaltungen be-und verarbeiten die Dateien gelöscht in der Event-Handler.
- Silverlight-Steuerelemente können überschreiben diejenigen Dropziel virtuelle Funktionen verarbeiten die Daten gezogen werden und fiel auf, und aktivieren Sie sich Droptargets werden.
Einschränkungen
Die Drag & Drop-Funktionalität in Silverlight 4 Beta nur versendet, ermöglicht die häufigste Szenario: Silverlight-Plugin als Datei Drop-Ziel. Bitte beachten Sie die folgenden Einschränkungen mit aktuellen Implementierung:
- Es gibt keinen Tropfen Source Support (QueryContinueDrag & GiveFeedback).
- Es gibt keine DragDropEffects oder DragDropKeyStates in DragEventArgs.
- gibt es keinen visuellen für das gezogene Objekt oder DragDropEffects.
- nur die Datei per Drag & Drop wird unterstützt von:
- Alle Veranstaltungen Dropziel Feuer nur, wenn von Dateien per Drag & Drop.
- IDataObject, Datenobjekt und DragEventArgs.Data unterstützen nur ein Format: "FileDrop", und die Daten werden vom Typ FileInfo [].
- die meisten von IDataObject Methoden werfen NotImplementedException.
- für drag and drop auf Windows arbeiten, müssen Silverlight-Plugin windowed werden. In einem anderen Wort, wenn <param name="windowless" value="true"/> angegeben ist, wird Drop-Ereignisse nicht ausgelöst.
- Seit Silverlight-Plugin auf Mac ist immer fensterlosen, müssen Sie JavaScript hook up Drop-Ereignisse, um Silverlight Drop-Ereignisse auslösen. In ein anderes Wort, wenn Sie Ihre Silverlight-Anwendung zur Unterstützung der Datei-Drop auf dem Mac als auch Windows wollen, müssen Sie folgende Skript-und Silverlight-Plugin Attribute hinzuzufügen, um die Hosting-oder HTML-ASPX-Seite:
<! - Fügen Sie folgende Skript vor dem Ende des HEAD-Tag ->
<script type= "text/javascript">
Funktion handleDragEnter (oEvent) (
/ / Standard-Operationen verhindern
oEvent.preventDefault ();
var flag = silverlightControl.dragEnter (oEvent);
/ / Wenn wir sie erfolgreich behandelt dann stoppen Ausbreitung der Veranstaltung
if (flag)
oEvent.stopPropagation ();
)
Funktion handleDragLeave (oEvent) (
/ / Standard-Operationen verhindern
oEvent.preventDefault ();
var flag = silverlightControl.dragLeave (oEvent);
/ / Wenn wir sie erfolgreich behandelt dann stoppen Ausbreitung der Veranstaltung
if (flag)
oEvent.stopPropagation ();
)
Funktion handleDragOver (oEvent) (
/ / Standard-Operationen verhindern
oEvent.preventDefault ();
var flag = silverlightControl.dragOver (oEvent);
/ / Wenn wir sie erfolgreich behandelt dann stoppen Ausbreitung der Veranstaltung
if (flag)
oEvent.stopPropagation ();
)
Funktion handleDropEvent (oEvent) (
/ / Standard-Operationen verhindern
oEvent.preventDefault ();
var flag = silverlightControl.dragDrop (oEvent);
/ / Wenn wir sie erfolgreich behandelt dann stoppen Ausbreitung der Veranstaltung
if (flag)
oEvent.stopPropagation ();
)
</ Script>
<! - Verwenden Sie JavaScript Dropziel Ereignisse auszulösen Silverlight's Dropziel Veranstaltungen ->
type= "application/x-silverlight-2" width= "100%" height= "100%" <Object data = "data: application/x-silverlight-2" type = "application/x-silverlight-2" width = "100%" height = "100%"
ondragover= "handleDragOver(event)" id = "silverlightControl" ondragenter = "handleDragEnter (event)" OnDragOver = "handleDragOver (event)"
> ondragleave = "handleDragLeave (event)" OnDrop = "handleDropEvent (event)"> - DragEventArgs.Data ist nur zugänglich, in Drop-Ereignis. Zugreifen DragEventArgs.Data in DragEnter, DragOver und DragLeave kann SecurityException . Und den Zugriff auf Directory kann DirectoryName oder FullName Eigenschaft des FileInfo-Objekt aus DragEventArgs.Data Ursache ArgumentNullException.
Demo App
Unten finden Sie eine Demo-Anwendung:
- der linken oberen Raster verschachtelten Dropziel Ereignishandler DragEventArgs Info-Display.
- Oben rechts verschachtelten Gitter enthalten ImageDropTarget User Control, die OnDrop Methode überschreibt, um die abgelegte Datei machen, wenn es ein Bild ist.
- der unteren Listbox zeigt die Abfolge der Ereignisse Drop-Ziel, ihre sprudeln, und DragEventArgs info.
Sie finden den vollständigen Quellcode hier .
Rückkopplung
Während wir freuen uns auf die Drag & Drop hinzufügen, um Silverlight, wir wissen es gibt eine Menge zu beenden / zu verbessern, und was wir freigegeben ist nur eine Beta. Wie immer Ihr Feedback sehr geschätzt wird, und wird als wichtiger Datenpunkt uns zu helfen, Prioritäten für die Arbeit verwendet werden. Vielen Dank!









@ David Leisner
Hallo David,
Ja, ist das Verhalten so ziemlich das gleiche in SL4 RTM: Nutzer der Standard-Cursor-Wechsel an Plugin-Ebene, dh zu sehen, wenn es eine Steuerung mit AllDrop auf true setzen, wird die gesamte Plugin-Display ermöglichen die Drop-Cursor, aber es ist keine Kontrolle über spezifische, und es ist nicht anpassbar, dh, wird Cursor nicht für die Kontrollen mit AllDrop Veränderung auf false setzen, und es gibt keine DragDropEffects in DragEventArgs gesetzt. Wir können mehr umsetzen DnD Funktionen in zukünftigen Releases.
Vielen Dank,
Ning-
Vielen Dank für diese sehr nützlich und einfach zu implementierende Funktion!
Frage: In Ihrem ursprünglichen Artikel, den Sie sagte, dass in der Silverlight 4 Beta "gibt es keinen visuellen für das gezogene Objekt oder DragDropEffects."
Ist dies auch der Fall in den letzten Silverlight-4-Veröffentlichung?
Beim Ziehen eines Bildes aus dem Windows Explorer auf eine Silverlight ListBox, wird es äußerst nützlich, um den Cursor Aussehen anpassen und haben auch einen anderen Stil Cursor je nachdem, ob das Zielelement AllowDrop ermöglicht hat oder nicht.
Vielen Dank!
Hallo, danke für Beispielcode.
Hallo,
ist es möglich, die DataGridDragDropTarget Starten von einer Drag-Aktion zu verhindern?
Was ich will, ist zu einem DataGrid verwenden nur als DragSource und ein anderes nur als dropTarget. Und die dropTarget-only-DataGrid sollte nicht zeigen "StartDragShadow" beim Drücken und Bewegen der Maus über ein Element.
Vielen Dank!
Steven
@ Rudy
Ich möchte Ihnen auch know.thank!
Was
Silverlight
@ Rudy
Bitte sehen Sie auch meine anderen Antworten. Das Silverlight Toolkit bereits ListBoxDragDropTarget , so dass Sie aus ListBox ziehen können. Sie müssen Ihre eigenen Canvas Drag Drop-Ziel-Container umzusetzen, für jetzt.
@ GB
Gerade jetzt SL4 Runtime unterstützt nur SL Plugin als Datei Drop-Ziel, und nur aussetzt Dropziel Eigenschaften (AllDrop) und Veranstaltungen (DragEnter / Verschieben / Leave, Drop), aber nicht ziehen Quelle Ereignisse (GiveFeedback, QueryContinueDrag). Es ist nicht vollständig erweiterbar via entweder IDataObject. Wenn Sie nicht warten können, Ihre beste Chance ist jetzt an der Umsetzung Toolkit, das es ermöglicht aussehen drag and drop vom und zum DataGrid in SL Plugin. Der Code ist in DataGridDragDropTarget.cs unter source \ Controls.Data.Toolkit Projekt. Dank.
hallo, ich möchte wissen, wie die Umsetzung zu Drag & Drop auf DataGrid?
Ich würde gerne wissen, ob es eine Möglichkeit, per Drag & Drop Objekte (Symbole) aus Listenfeld auf die Leinwand umzusetzen sind?
Regards
Rudy
@ Brice Prunier
Ja. Jafar umgesetzt hat fast abgeschlossen, WPF-kompatibel, Drag & Drop-Funktionalität sowohl für Silverlight 3 und Silverlight 4. Es ist der Versand als Teil Silverlight Toolkit . Ich empfehle Check-out seine Blog-Beiträge für weitere Informationen.
Bitte beachten Sie eine wichtige Unterschiede zwischen den beiden Drag & Drop-Implementierungen: das Toolkit Version am Anfang der Laufzeit implementiert ist, so bedarf es einer * DragDropTarget Container, und funktioniert nur zwischen den Elementen innerhalb einer Silverlight-Plugin kontrollieren. Die Umsetzung Toolkit nutzt Laufzeit Drag & Drop-API, wenn es kann, wie in Silverlight Toolkit 4, verwendet Microsoft.Windows.DragDrop.AllowDrop UIElement.AllowDrop Eigentum. Während der Laufzeit macht Drop-Ziel für alle Veranstaltungen UIElement, das Toolkit Umsetzung bereits verarbeitet diese Ereignisse für wichtige Steuerelemente wie DataGrid, ListBox und TreeView, so dass es wirklich einfach zu bedienen ist. Wir haben dafür gesorgt, die APIs sind so kompatibel wie möglich, damit die Menschen können beide zusammen verwenden für jetzt, und migrieren, um die Umsetzung ziemlich leicht Runtime als Laufzeit macht mehr Drag & Drop-Funktionalitäten. Dies ist auch der allgemeine Ansatz der Silverlight Toolkit, da rief ich in früheren Post Silverlight Controls .
SL4 Toolkit (System.Windows.Controls.Toolkit) bietet mehr höheres DragDrop Implementierungen für intra Silverligth Drag & Drop.
Nicht alle Fälle werden derzeit von SL 4 Toolkit unterstützt, aber Sie können sich mühelos erstellen Sie Ihre eigenen von der abstrakten Klasse DragDropTarget.
Was