Übersicht über Drag & DropDrag and Drop Overview

Dieses Thema enthält eine Übersicht zur Drag & Drop-Unterstützung in Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF)-Anwendungen.This topic provides an overview of drag-and-drop support in Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) applications. Drag & Drop bezeichnet im Allgemeinen eine Methode zur Datenübertragung, die die Verwendung einer Maus (oder eines anderen Zeigegeräts) zum Auswählen mindestens eines Objekts, das Ziehen dieses Objekts auf ein gewünschtes Ablageziels auf der Benutzeroberfläche (User Interface, UI)user interface (UI) und dessen Ablegen beinhaltet.Drag-and-drop commonly refers to a method of data transfer that involves using a mouse (or some other pointing device) to select one or more objects, dragging these objects over some desired drop target in the Benutzeroberfläche (User Interface, UI)user interface (UI), and dropping them.

Drag & Drop-Unterstützung in WPFDrag-and-Drop Support in WPF

An Drag & Drop-Vorgängen sind normalerweise zwei Seiten beteiligt: eine Ziehquelle, aus dem das gezogene Objekt stammt, und ein Ablageziel, das das abgelegte Objekt empfängt.Drag-and-drop operations typically involve two parties: a drag source from which the dragged object originates and a drop target which receives the dropped object. Bei der Ziehquelle und dem Ablageziel kann es sich um Benutzeroberflächenelemente in der gleichen Anwendung oder in verschiedenen Anwendungen handeln.The drag source and drop target may be UI elements in the same application or a different application.

Die Art und Anzahl der Objekte, die mit Drag & Drop bearbeitet werden können, ist beliebig.The type and number of objects that can be manipulated with drag-and-drop is completely arbitrary. Beispielsweise stellen Dateien, Ordner und ausgewählte Inhaltsbereiche gängige Objekte dar, die mithilfe von Drag & Drop-Vorgängen bearbeitet werden.For example, files, folders, and selections of content are some of the more common objects manipulated through drag-and-drop operations.

Die Aktionen, die im Einzelnen im Rahmen von Drag & Drop-Vorgängen ausgeführt werden, sind anwendungsspezifisch und werden oft durch den Kontext festgelegt.The particular actions performed during a drag-and-drop operation are application specific, and often determined by context. Beispielsweise bewirkt das Ziehen einer Auswahl von Dateien von einem Ordner auf einen anderen auf dem gleichen Speichergerät standardmäßig ein Verschieben der Dateien, während die Dateien beim Ziehen von einer Universal Naming Convention (UNC)Universal Naming Convention (UNC)-Freigabe auf einen lokalen Ordner standardmäßig kopiert werden.For example, dragging a selection of files from one folder to another on the same storage device moves the files by default, whereas dragging files from a Universal Naming Convention (UNC)Universal Naming Convention (UNC) share to a local folder copies the files by default.

Die von WPFWPF zur Verfügung gestellten Drag & Drop-Möglichkeiten sind äußerst flexibel und anpassbar, um eine große Bandbreite von Drag & Drop-Szenarien zu unterstützen.The drag-and-drop facilities provided by WPFWPF are designed to be highly flexible and customizable to support a wide variety of drag-and-drop scenarios. Drag-and-Drop unterstützt das Bearbeiten von Objekten innerhalb einer einzelnen Anwendung oder zwischen verschiedenen Anwendungen.Drag-and-drop supports manipulating objects within a single application, or between different applications. Drag & Drop zwischen WPFWPF Anwendungen und anderen Windows ist ebenfalls vollständig unterstützt.Dragging-and-dropping between WPFWPF applications and other Windows applications is also fully supported.

In WPFWPF können beliebige UIElement oder ContentElement an Drag & Drop-Vorgängen beteiligt sein.In WPFWPF, any UIElement or ContentElement can participate in drag-and-drop. Die für Drag & Drop-Vorgänge erforderlichen Ereignisse und Methoden sind in der DragDrop-Klasse definiert.The events and methods required for drag-and-drop operations are defined in the DragDrop class. Die Klassen UIElement und ContentElement enthalten Aliase für die angefügten DragDrop-Ereignisse, sodass ein geerbtes UIElement oder ContentElement in der Liste der Klassenelemente als Basiselement aufgeführt wird.The UIElement and ContentElement classes contain aliases for the DragDrop attached events so that the events appear in the class members list when a UIElement or ContentElement is inherited as a base element. Die an diese Ereignisse angefügten Ereignishandler werden an das zugrundeliegende angefügte DragDrop-Ereignis angefügt und empfangen die gleiche Instanz der Ereignisdaten.Event handlers that are attached to these events are attached to the underlying DragDrop attached event and receive the same event data instance. Weitere Informationen finden Sie beim UIElement.Drop-Ereignis.For more information, see the UIElement.Drop event.

Wichtig

OLE-Drag & Drop funktioniert in der Zone „Internet“ nicht.OLE drag-and-drop does not work while in the Internet zone.

DatenübertragungData Transfer

Drag & Drop bildet einen Teil des allgemeineren Bereichs der Datenübertragung.Drag-and-drop is part of the more general area of data transfer. Zur Datenübertragung gehören Drag & Drop- ebenso wie Kopieren und Einfügen-Vorgänge.Data transfer includes drag-and-drop and copy-and-paste operations. Ein Drag & Drop-Vorgang ist analog zu einem Kopieren und Einfügen- oder Ausschneiden und Einfügen-Vorgang, der zum Übertragen von Daten von einem Objekt oder einer Anwendung auf ein anderes bzw. eine andere mithilfe der Zwischenablage des Systems verwendet wird.A drag-and-drop operation is analogous to a copy-and-paste or cut-and-paste operation that is used to transfer data from one object or application to another by using the system clipboard. Für beide Arten von Vorgängen sind diese Voraussetzungen erforderlich:Both types of operations require:

  • Ein Quellobjekt, das die Daten bereitstellt.A source object that provides the data.

  • Eine Möglichkeit zum vorübergehenden Speichern der übertragenen Daten.A way to temporarily store the transferred data.

  • Ein Zielobjekt, das die Daten empfängt.A target object that receives the data.

Bei einem Kopieren und Einfügen-Vorgang wird die Zwischenablage des Systems verwendet, um die übertragenen Daten vorübergehend zu speichern; bei einem Drag & Drop-Vorgang wird ein DataObject zum Speichern der Daten verwendet.In a copy-and-paste operation, the system clipboard is used to temporarily store the transferred data; in a drag-and-drop operation, a DataObject is used to store the data. Konzeptionell besteht ein Datenobjekt aus mindestens einem Paar eines Object, das die eigentlichen Daten enthält, und einem entsprechenden Datenformatbezeichner.Conceptually, a data object consists of one or more pairs of an Object that contains the actual data, and a corresponding data format identifier.

Die Ziehquelle leitet einen Drag & Drop-Vorgang durch Aufrufen der statischen DragDrop.DoDragDrop-Methode und Übergeben der übertragenen Daten an sie ein.The drag source initiates a drag-and-drop operation by calling the static DragDrop.DoDragDrop method and passing the transferred data to it. Die DoDragDrop-Methode umschließt die Daten ggf. automatisch in einem DataObject.The DoDragDrop method will automatically wrap the data in a DataObject if necessary. Um mehr Kontrolle über das Datenformat zu erhalten, können Sie die Daten vor der Übergabe an die DataObject-Methode mit einem DoDragDrop umschließen.For greater control over the data format, you can wrap the data in a DataObject before passing it to the DoDragDrop method. Das Ablageziel ist für die Extraktion der Daten aus dem DataObject zuständig.The drop target is responsible for extracting the data from the DataObject. Weitere Informationen zum Arbeiten mit Datenobjekten finden Sie unter Daten und Datenobjekte.For more information about working with data objects, see Data and Data Objects.

Die Quelle und das Ziel eines Drag & Drop-Vorgangs sind normalerweise Elemente der Benutzeroberfläche; die tatsächlich übertragenen Daten haben aber in der Regel keine visuelle Darstellung.The source and target of a drag-and-drop operation are UI elements; however, the data that is actually being transferred typically does not have a visual representation. Sie können Code erstellen, der eine visuelle Darstellung der gezogenen Daten bereitstellt, wie es etwa beim Ziehen von Dateien im Windows-Explorer geschieht.You can write code to provide a visual representation of the data that is dragged, such as occurs when dragging files in Windows Explorer. Standardmäßig wird dem Benutzer eine Rückmeldung gegeben, indem die Form des Cursors geändert wird, um die Auswirkung darzustellen, die der Drag & Drop-Vorgang auf die Daten hat, etwa ob die Daten verschoben oder kopiert werden.By default, feedback is provided to the user by changing the cursor to represent the effect that the drag-and-drop operation will have on the data, such as whether the data will be moved or copied.

Auswirkungen von Drag & Drop-VorgängenDrag-and-Drop Effects

Drag & Drop-Vorgänge können verschiedene Auswirkungen auf die übertragenen Daten haben.Drag-and-drop operations can have different effects on the transferred data. Beispielsweise können Sie die Daten kopieren oder sie verschieben.For example, you can copy the data or you can move the data. In WPFWPF ist eine DragDropEffects-Enumeration definiert, die Sie verwenden können, um die Auswirkung eines Drag & Drop-Vorgangs anzugeben.WPFWPF defines a DragDropEffects enumeration that you can use to specify the effect of a drag-and-drop operation. In der Ziehquelle können Sie die Auswirkungen, die von der Quelle zugelassen werden, in der Methode DoDragDrop angeben.In the drag source, you can specify the effects that the source will allow in the DoDragDrop method. Im Ablageziel können Sie die Auswirkung, die von der Quelle beabsichtigt ist, in der Eigenschaft Effects der Klasse DragEventArgs angeben.In the drop target, you can specify the effect that the target intends in the Effects property of the DragEventArgs class. Wenn das Ablageziel seine beabsichtigte Auswirkung im DragOver-Ereignis angibt, werden diese Informationen im GiveFeedback-Ereignis an die Zielquelle zurück übermittelt.When the drop target specifies its intended effect in the DragOver event, that information is passed back to the drag source in the GiveFeedback event. Die Ziehquelle verwendet diese Informationen, um dem Benutzer mitzuteilen, welche Auswirkung das Ablegen auf dem Ablageziel auf die Daten haben wird.The drag source uses this information to inform the user what effect the drop target intends to have on the data. Wenn die Daten abgelegt werden, gibt das Ablageziel die tatsächlichen Auswirkungen im Drop-Ereignis an.When the data is dropped, the drop target specifies its actual effect in the Drop event. Diese Informationen werden als Rückgabewert der Methode DoDragDrop zurück an die Ziehquelle übergeben.That information is passed back to the drag source as the return value of the DoDragDrop method. Wenn das Ablageziel eine Auswirkung zurückgibt, die in der Liste der allowedEffects der Ziehquelle nicht aufgeführt ist, wird der Drag & Drop-Vorgang abgebrochen, ohne dass eine Übertragung von Daten stattfindet.If the drop target returns an effect that is not in the drag sources list of allowedEffects, the drag-and-drop operation is cancelled without any data transfer occurring.

Es muss beachtet werden, dass in WPFWPF die DragDropEffects-Werte nur für die Kommunikation zwischen der Ziehquelle und dem Ablageziel über die Auswirkungen des Drag & Drop-Vorgangs verwendet werden.It is important to remember that in WPFWPF, the DragDropEffects values are only used to provide communication between the drag source and the drop target regarding the effects of the drag-and-drop operation. Die tatsächliche Auswirkung des Drag & Drop-Vorgangs hängt von dem entsprechenden Code ab, den Sie für Ihre Anwendung schreiben.The actual effect of the drag-and-drop operation depends on you to write the appropriate code in your application.

Beispielsweise kann das Ablageziel angeben, dass die Auswirkung des Ablegens von Daten auf ihm die Verschiebung der Daten ist.For example, the drop target might specify that the effect of dropping data on it is to move the data. Jedoch müssen die Daten zum Verschieben sowohl dem Zielelement hinzugefügt als auch aus dem Quellelement entfernt werden.However, to move the data, it must be both added to the target element and removed from the source element. Das Quellelement kann beispielsweise angeben, dass es das Verschieben der Daten erlaubt. Wenn Sie aber nicht den Code bereitstellen, um die Daten aus dem Quellelement zu entfernen, ergibt sich als Endergebnis, dass die Daten kopiert statt verschoben werden.The source element might indicate that it allows moving the data, but if you do not provide the code to remove the data from the source element, the end result will be that the data is copied, and not moved.

Drag & Drop-EreignisseDrag-and-Drop Events

Drag & Drop-Vorgänge unterstützen ein ereignisgesteuertes Modell.Drag-and-drop operations support an event driven model. Sowohl die Ziehquelle als auch das Ablageziel verwenden einen Satz von Standardereignissen beim Verarbeiten von Drag & Drop-Vorgängen.Both the drag source and the drop target use a standard set of events to handle drag-and-drop operations. Die standardmäßigen Drag & Drop-Ereignisse sind in den folgenden Tabellen zusammengefasst.The following tables summarize the standard drag-and-drop events. Dies sind angefügte Ereignisse der Klasse DragDrop.These are attached events on the DragDrop class. Weitere Informationen zu angefügten Ereignissen finden Sie unter Übersicht über angefügte Ereignisse.For more information about attached events, see Attached Events Overview.

Ereignisse der ZiehquelleDrag Source Events

EreignisEvent ZusammenfassungSummary
GiveFeedback Dieses Ereignis tritt während eines Drag & Drop-Vorgangs fortlaufend ein und ermöglicht der Ziehquelle, dem Benutzer Rückmeldung zu geben.This event occurs continuously during a drag-and-drop operation, and enables the drop source to give feedback information to the user. Diese Rückmeldung erfolgt üblicherweise durch Ändern der Form des Mauszeigers, um die vom Ablageziel zugelassenen Auswirkungen anzuzeigen.This feedback is commonly given by changing the appearance of the mouse pointer to indicate the effects allowed by the drop target. Dies ist ein Bubbling-Ereignis.This is a bubbling event.
QueryContinueDrag Dieses Ereignis tritt ein, wenn während eines Drag & Drop-Vorgangs eine Änderung am Zustand der Tastatur- oder Maustasten eintritt, und ermöglicht dem Ablageziel, den Drag & Drop-Vorgang abhängig von den Tastenzuständen abzubrechen.This event occurs when there is a change in the keyboard or mouse button states during a drag-and-drop operation, and enables the drop source to cancel the drag-and-drop operation depending on the key/button states. Dies ist ein Bubbling-Ereignis.This is a bubbling event.
PreviewGiveFeedback Tunnelversion von GiveFeedback.Tunneling version of GiveFeedback.
PreviewQueryContinueDrag Tunnelversion von QueryContinueDrag.Tunneling version of QueryContinueDrag.

Ereignisse des AblagezielsDrop Target Events

EreignisEvent ZusammenfassungSummary
DragEnter Dieses Ereignis tritt beim Ziehen eines Objekts in die Begrenzung des Ablageziels ein.This event occurs when an object is dragged into the drop target's boundary. Dies ist ein Bubbling-Ereignis.This is a bubbling event.
DragLeave Dieses Ereignis tritt beim Ziehen eines Objekts aus der Begrenzung des Ablageziels ein.This event occurs when an object is dragged out of the drop target's boundary. Dies ist ein Bubbling-Ereignis.This is a bubbling event.
DragOver Dieses Ereignis tritt fortlaufend auf, während ein Objekt innerhalb der Begrenzung des Ablageziels gezogen (bewegt) wird.This event occurs continuously while an object is dragged (moved) within the drop target's boundary. Dies ist ein Bubbling-Ereignis.This is a bubbling event.
Drop Dieses Ereignis tritt ein, wenn ein Objekt auf dem Ablageziel abgelegt wird.This event occurs when an object is dropped on the drop target. Dies ist ein Bubbling-Ereignis.This is a bubbling event.
PreviewDragEnter Tunnelversion von DragEnter.Tunneling version of DragEnter.
PreviewDragLeave Tunnelversion von DragLeave.Tunneling version of DragLeave.
PreviewDragOver Tunnelversion von DragOver.Tunneling version of DragOver.
PreviewDrop Tunnelversion von Drop.Tunneling version of Drop.

Um Drag & Drop-Ereignisse für Instanzen eines Objekts zu verarbeiten, fügen Sie Handler für die in den vorhergehenden Tabellen aufgelisteten Ereignisse hinzu.To handle drag-and-drop events for instances of an object, add handlers for the events listed in the preceding tables. Um Drag & Drop-Ereignisse auf der Klassenebene zu verarbeiten, überschreiben Sie die entsprechenden virtuellen On*Event- und On*PreviewEvent-Methoden.To handle drag-and-drop events at the class level, override the corresponding virtual On*Event and On*PreviewEvent methods. Weitere Informationen finden Sie unter Klassenbehandlung von Routingereignissen durch Steuerelement-Basisklassen.For more information, see Class Handling of Routed Events by Control Base Classes.

Implementierung von Drag & DropImplementing Drag-and-Drop

Ein Benutzerelement kann eine Ziehquelle, ein Ablageziel oder beides darstellen.A UI element can be a drag source, a drop target, or both. Zum Implementieren der grundlegenden Drag & Drop-Funktionalität müssen Sie Code zum Einleiten des Drag & Drop-Vorgangs und zu Verarbeiten der abgelegten Daten erstellen.To implement basic drag-and-drop, you write code to initiate the drag-and-drop operation and to process the dropped data. Sie können die Drag & Drop-Erfahrung durch Verarbeitung optionaler Drag & Drop-Ereignisse verbessern.You can enhance the drag-and-drop experience by handling optional drag-and-drop events.

Zum Implementieren der grundlegenden Drag & Drop-Funktionalität müssen Sie die folgenden Schritte ausführen:To implement basic drag-and-drop, you will complete the following tasks:

  • Ermitteln des Elements, das als Ziehquelle fungieren soll.Identify the element that will be a drag source. Eine Ziehquelle kann ein UIElement oder ein ContentElement sein.A drag source can be a UIElement or a ContentElement.

  • Einen Ereignishandler in der Ziehquelle erstellen, der den Drag & Drop-Vorgang einleitet.Create an event handler on the drag source that will initiate the drag-and-drop operation. Das zu verarbeitende Ereignis ist normalerweise das MouseMove-Ereignis.The event is typically the MouseMove event.

  • Im Ereignishandler der Ziehquelle die Methode DoDragDrop aufrufen, um den Drag & Drop-Vorgang einzuleiten.In the drag source event handler, call the DoDragDrop method to initiate the drag-and-drop operation. Geben Sie im DoDragDrop-Aufruf die Ziehquelle, die zu übertragenden Daten und die zulässigen Auswirkungen an.In the DoDragDrop call, specify the drag source, the data to be transferred, and the allowed effects.

  • Ermitteln des Elements das als Ablageziel dienen soll.Identify the element that will be a drop target. Ein Ablageziel kann ein UIElement oder ein ContentElement sein.A drop target can be UIElement or a ContentElement.

  • Legen Sie auf dem Ablageziel die AllowDrop-Eigenschaft auf true fest.On the drop target, set the AllowDrop property to true.

  • Erstellen Sie im Ablageziel einen Drop-Ereignishandler, um die abgelegten Daten zu verarbeiten.In the drop target, create a Drop event handler to process the dropped data.

  • Extrahieren Sie im Drop-Ereignishandler die Daten mithilfe der Methoden DragEventArgs und GetDataPresent aus den GetData.In the Drop event handler, extract the data from the DragEventArgs by using the GetDataPresent and GetData methods.

  • Verwenden Sie die Daten im Drop-Ereignishandler, um den gewünschten Drag & Drop-Vorgang auszuführen.In the Drop event handler, use the data to perform the desired drag-and-drop operation.

Sie können Ihre Drag & Drop-Implementierung erweitern, indem Sie ein benutzerdefiniertes DataObject erstellen und optionale Ereignisse der Ziehquelle und des Ablageziels verarbeiten, wie in den folgenden Aufgaben dargestellt:You can enhance your drag-and-drop implementation by creating a custom DataObject and by handling optional drag source and drop target events, as shown in the following tasks:

  • Um benutzerdefinierte Daten oder mehrere Datenelemente zu übertragen, erstellen Sie ein DataObject, das Sie an die DoDragDrop-Methode übergeben.To transfer custom data or multiple data items, create a DataObject to pass to the DoDragDrop method.

  • Um während eines Ziehvorgangs weitere Aktionen auszuführen, verarbeiten Sie die Ereignisse DragEnter, DragOver und DragLeave des Ablageziels.To perform additional actions during a drag, handle the DragEnter, DragOver, and DragLeave events on the drop target.

  • Um die Darstellung des Mauszeigers zu ändern, verarbeiten Sie das GiveFeedback-Ereignis der Ziehquelle.To change the appearance of the mouse pointer, handle the GiveFeedback event on the drag source.

  • Um die Weise zu ändern, in der der Drag & Drop-Vorgang abgebrochen wird, verarbeiten Sie das QueryContinueDrag-Ereignis der Ziehquelle.To change how the drag-and-drop operation is canceled, handle the QueryContinueDrag event on the drag source.

Drag & Drop-BeispielDrag-and-Drop Example

In diesem Abschnitt wird die Implementierung von Drag & Drop für ein Ellipse-Element beschrieben.This section describes how to implement drag-and-drop for an Ellipse element. Die Ellipse stellt sowohl eine Ziehquelle als auch ein Ablageziel dar.The Ellipse is both a drag source and a drop target. Die übertragenen Daten sind die Zeichenfolgendarstellung der Fill-Eigenschaft der Ellipse.The transferred data is the string representation of the ellipse’s Fill property. Der folgende XAML-Code zeigt das Ellipse-Element und die mit Drag & Drop zusammenhängenden Ereignisse, die es verarbeitet.The following XAML shows the Ellipse element and the drag-and-drop related events that it handles. Eine ausführliche Anleitung zum Implementieren der Drag & Drop-Funktion finden Sie unter Exemplarische Vorgehensweise: Aktivieren der Drag & Drop-Funktion auf einem Benutzersteuerelement.For complete steps on how to implement drag-and-drop, see Walkthrough: Enabling Drag and Drop on a User Control.

<Ellipse Height="50" Width="50" Fill="Green"
     MouseMove="ellipse_MouseMove"
     GiveFeedback="ellipse_GiveFeedback"
     AllowDrop="True"
     DragEnter="ellipse_DragEnter" DragLeave="ellipse_DragLeave"
     DragOver="ellipse_DragOver" Drop="ellipse_Drop" />

Aktivieren eines Elements als ZiehquelleEnabling an Element to be a Drag Source

Ein Objekt, das eine Ziehquelle darstellt, ist für Folgendes zuständig:An object that is a drag source is responsible for:

  • Erkennen, wenn ein Ziehvorgang eintritt.Identifying when a drag occurs.

  • Einleiten des Drag & Drop-Vorgangs.Initiating the drag-and-drop operation.

  • Identifizieren der zu übertragenden Daten.Identifying the data to be transferred.

  • Angeben der zulässigen Auswirkungen, die der Drag & Drop-Vorgang auf die übertragenen Daten haben darf.Specifying the effects that the drag-and-drop operation is allowed to have on the transferred data.

Die Ziehquelle kann darüber hinaus Rückmeldung an den Benutzer hinsichtlich der zulässigen Aktionen (Verschieben, Kopieren, keine) geben und den Drag & Drop-Vorgang auf der Grundlage weiterer Benutzereingaben, wie etwa Drücken der ESC-Taste während des Ziehens, abbrechen.The drag source may also give feedback to the user regarding the allowed actions (move, copy, none), and can cancel the drag-and-drop operation based on additional user input, such as pressing the ESC key during the drag.

Zu Bestimmen, wann ein Ziehvorgang eintritt, liegt in der Zuständigkeit Ihrer Anwendung, die anschließend den Drag & Drop-Vorgang durch Aufrufen der Methode DoDragDrop einleiten muss.It is the responsibility of your application to determine when a drag occurs, and then initiate the drag-and-drop operation by calling the DoDragDrop method. Dies ist normalerweise der Fall, wenn ein MouseMove-Ereignis über dem zu ziehenden Element eintritt, während eine Maustaste gedrückt wird.Typically, this is when a MouseMove event occurs over the element to be dragged while a mouse button is pressed. Im folgenden Beispiel ist zu sehen, wie ein Drag & Drop-Vorgang vom MouseMove-Ereignishandler eines Ellipse-Elements eingeleitet wird, um es zu einer Ziehquelle zu machen.The following example shows how to initiate a drag-and-drop operation from the MouseMove event handler of an Ellipse element to make it a drag source. Die übertragenen Daten sind die Zeichenfolgendarstellung der Fill-Eigenschaft der Ellipse.The transferred data is the string representation of the ellipse’s Fill property.

private void ellipse_MouseMove(object sender, MouseEventArgs e)
{
    Ellipse ellipse = sender as Ellipse;
    if (ellipse != null && e.LeftButton == MouseButtonState.Pressed)
    {
        DragDrop.DoDragDrop( ellipse,
                             ellipse.Fill.ToString(),
                             DragDropEffects.Copy);
    }
}
Private Sub Ellipse_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Input.MouseEventArgs)
    Dim ellipse = TryCast(sender, Ellipse)
    If ellipse IsNot Nothing AndAlso e.LeftButton = MouseButtonState.Pressed Then
        DragDrop.DoDragDrop(ellipse, ellipse.Fill.ToString(), DragDropEffects.Copy)
    End If
End Sub

Rufen Sie im Innern des MouseMove-Ereignishandlers die Methode DoDragDrop auf, um den Drag & Drop-Vorgang einzuleiten.Inside of the MouseMove event handler, call the DoDragDrop method to initiate the drag-and-drop operation. Die Methode DoDragDrop akzeptiert drei Parameter:The DoDragDrop method takes three parameters:

  • dragSource – Ein Verweis auf das Abhängigkeitsobjekt, das die Quelle der übertragenen Daten bildet; dies ist normalerweise die Quelle des MouseMove-Ereignisses.dragSource – A reference to the dependency object that is the source of the transferred data; this is typically the source of the MouseMove event.

  • data – Ein Objekt, das die übertragenen Daten enthält, umschlossen von einem DataObject.data - An object that contains the transferred data, wrapped in a DataObject.

  • allowedEffects – Einer der DragDropEffects-Enumerationswerte, der die zulässigen Auswirkungen des Drag & Drop-Vorgangs angibt.allowedEffects - One of the DragDropEffects enumeration values that specifies the permitted effects of the drag-and-drop operation.

Im Parameter data können beliebige serialisierbare Objekte übergeben werden.Any serializable object can be passed in the data parameter. Wenn die Daten noch nicht von einem DataObject umschlossen sind, werden sie automatisch von einem neuen DataObject umschlossen.If the data is not already wrapped in a DataObject, it will automatically be wrapped in a new DataObject. Zum Übergeben mehrerer Datenelemente müssen Sie das DataObject selbst erstellen und es an die DoDragDrop-Methode übergeben.To pass multiple data items, you must create the DataObject yourself, and pass it to the DoDragDrop method. Weitere Informationen finden Sie unter Daten und Datenobjekte.For more information, see Data and Data Objects.

Der allowedEffects-Parameter wird verwendet, um anzugeben, welche Aktionen die Ziehquelle dem Ablageziel mit den übertragenen Daten erlaubt.The allowedEffects parameter is used to specify what the drag source will allow the drop target to do with the transferred data. Die üblichen Werte für eine Ziehquelle sind Copy, Move und All.The common values for a drag source are Copy, Move, and All.

Hinweis

Das Ablageziel kann außerdem angeben, welche Auswirkungen es als Reaktion auf die Ablage der Daten beabsichtigt.The drop target is also able to specify what effects it intends in response to the dropped data. Wenn das Ablageziel den Typ der abzulegenden Daten beispielsweise nicht erkennt, kann es die Daten zurückweisen, indem es die zulässigen Auswirkungen auf None festlegt.For example, if the drop target does not recognize the data type to be dropped, it can refuse the data by setting its allowed effects to None. Dies erfolgt normalerweise im DragOver-Ereignishandler des Ablageziels.It typically does this in its DragOver event handler.

Ziehquellen können optional die Ereignisse GiveFeedback und QueryContinueDrag verarbeiten.A drag source can optionally handle the GiveFeedback and QueryContinueDrag events. Diese Ereignisse weisen Standardhandler auf, die verwendet werden, sofern ein Ereignis nicht als behandelt gekennzeichnet wird.These events have default handlers that are used unless you mark the events as handled. Normalerweise werden diese Ereignisse ignoriert, es sei denn, es besteht eine spezifische Notwendigkeit, ihr Standardverhalten zu ändern.You will typically ignore these events unless you have a specific need to change their default behavior.

Das GiveFeedback-Ereignis wird fortlaufend ausgelöst, während die Ziehquelle gezogen wird.The GiveFeedback event is raised continuously while the drag source is being dragged. Der Standardhandler für dieses Ereignis überprüft, ob die Ziehquelle sich über einem gültigen Ablageziel befindet.The default handler for this event checks whether the drag source is over a valid drop target. Ist das der Fall, überprüft er die zulässigen Auswirkungen des Ablageziels.If it is, it checks the allowed effects of the drop target. Dann gibt er dem Endbenutzer Rückmeldung hinsichtlich der zulässigen Ablageauswirkungen.It then gives feedback to the end user regarding the allowed drop effects. Dies erfolgt normalerweise durch Ändern des Mauscursors in einen Nicht ablegen-, Kopier- oder Verschiebecursor.This is typically done by changing the mouse cursor to a no-drop, copy, or move cursor. Sie sollten dieses Ereignis nur verarbeiten, wenn Sie benutzerdefinierte Cursor verwenden müssen, um dem Benutzer Rückmeldung zu geben.You should only handle this event if you need to use custom cursors to provide feedback to the user. Wenn Sie dieses Ereignis behandeln, markieren Sie es als behandelt, damit der Standardhandler Ihren Handler nicht überschreibt.If you handle this event, be sure to mark it as handled so that the default handler does not override your handler.

Das QueryContinueDrag-Ereignis wird fortlaufend ausgelöst, während die Ziehquelle gezogen wird.The QueryContinueDrag event is raised continuously while the drag source is being dragged. Sie können dieses Ereignis verarbeiten, um zu bestimmen, welche Aktion den Drag & Drop-Vorgang beendet, basierend auf dem Zustand der Tasten ESC, UMSCHALT, STRG und ALT sowie dem Zustand der Maustasten.You can handle this event to determine what action ends the drag-and-drop operation based on the state of the ESC, SHIFT, CTRL, and ALT keys, as well as the state of the mouse buttons. Der Standardhandler für dieses Ereignis bricht den Drag & Drop-Vorgang ab, wenn die ESC-Taste gedrückt wird, und legt die Daten ab, wenn die Maustaste freigegeben wird.The default handler for this event cancels the drag-and-drop operation if the ESC key is pressed, and drops the data if the mouse button is released.

Achtung

Diese Ereignisse werden während des Drag & Drop-Vorgangs fortlaufend ausgelöst.These events are raised continuously during the drag-and-drop operation. Daher sollten ressourcenintensive Tasks in den Ereignishandlern vermieden werden.Therefore, you should avoid resource-intensive tasks in the event handlers. Verwenden Sie z. B. einen zwischengespeicherten Cursor, statt bei jeder Auslösung des GiveFeedback-Ereignisses einen neuen Cursor zu erstellen.For example, use a cached cursor instead of creating a new cursor each time the GiveFeedback event is raised.

Aktivieren eines Elements als AblagezielEnabling an Element to be a Drop Target

Ein Objekt, das ein Ablageziel darstellt, ist für Folgendes zuständig:An object that is a drop target is responsible for:

  • Angeben, dass es sich um ein gültiges Ablageziel handelt.Specifying that it is a valid drop target.

  • Reagieren auf die Ziehquelle, wenn sie über das Ziel gezogen wird.Responding to the drag source when it drags over the target.

  • Überprüfen, ob die übertragenen Daten in einem empfangbaren Format vorliegen.Checking that the transferred data is in a format that it can receive.

  • Verarbeiten der abgelegten Daten.Processing the dropped data.

Um anzugeben, dass ein Element ein Ablageziel ist, legen Sie seine AllowDrop-Eigenschaft auf true fest.To specify that an element is a drop target, you set its AllowDrop property to true. Dadurch werden die Ablagezielereignisse für das Element ausgelöst, sodass Sie sie verarbeiten können.The drop target events will then be raised on the element so that you can handle them. Während eines Drag & Drop-Vorgang tritt die folgenden Reihenfolge der Ereignisse beim Ablageziel auf:During a drag-and-drop operation, the following sequence of events occurs on the drop target:

  1. DragEnter

  2. DragOver

  3. DragLeave oder DropDragLeave or Drop

Das DragEnter-Ereignis tritt ein, wenn die Daten in den Begrenzung des Ablageziels gezogen werden.The DragEnter event occurs when the data is dragged into the drop target's boundary. Normalerweise verarbeiten Sie dieses Ereignis, um eine Vorschau der Auswirkungen des Drag & Drop-Vorgangs bereitzustellen, wenn das in Ihrer Anwendung sinnvoll ist.You typically handle this event to provide a preview of the effects of the drag-and-drop operation, if appropriate for your application. Legen Sie nicht die DragEventArgs.Effects-Eigenschaft im Ereignis DragEnter fest, da sie im DragOver-Ereignis überschrieben wird.Do not set the DragEventArgs.Effects property in the DragEnter event, as it will be overwritten in the DragOver event.

Das folgende Beispiel zeigt den DragEnter-Ereignishandler für ein Ellipse-Element.The following example shows the DragEnter event handler for an Ellipse element. Dieser Code bewirkt eine Vorschau der Auswirkungen des Drag & Drop-Vorgangs durch Speichern des aktuellen Fill-Pinsels.This code previews the effects of the drag-and-drop operation by saving the current Fill brush. Anschließend wird die Methode GetDataPresent verwendet, um zu überprüfen, ob das DataObject-Objekt, das über die Ellipse gezogen wird, Zeichenfolgendaten enthält, die in einen Brush konvertiert werden können.It then uses the GetDataPresent method to check whether the DataObject being dragged over the ellipse contains string data that can be converted to a Brush. Ist das der Fall, werden die Daten mithilfe der GetData-Methode extrahiert.If so, the data is extracted using the GetData method. Anschließend werden sie in einen Brush konvertiert und auf die Ellipse angewendet.It is then converted to a Brush and applied to the ellipse. Die Änderung wird im DragLeave-Ereignishandler rückgängig gemacht.The change is reverted in the DragLeave event handler. Wenn die Daten nicht in einen Brush konvertiert werden können, wird keine Aktion ausgeführt.If the data cannot be converted to a Brush, no action is performed.

private Brush _previousFill = null;
private void ellipse_DragEnter(object sender, DragEventArgs e)
{
    Ellipse ellipse = sender as Ellipse;
    if (ellipse != null)
    {
        // Save the current Fill brush so that you can revert back to this value in DragLeave.
        _previousFill = ellipse.Fill;
        
        // If the DataObject contains string data, extract it.
        if (e.Data.GetDataPresent(DataFormats.StringFormat))
        {
            string dataString = (string)e.Data.GetData(DataFormats.StringFormat);

            // If the string can be converted into a Brush, convert it.
            BrushConverter converter = new BrushConverter();
            if (converter.IsValid(dataString))
            {
                Brush newFill = (Brush)converter.ConvertFromString(dataString);
                ellipse.Fill = newFill;
            }
        }
    }
}
Private _previousFill As Brush = Nothing
Private Sub Ellipse_DragEnter(ByVal sender As System.Object, ByVal e As System.Windows.DragEventArgs)
    Dim ellipse = TryCast(sender, Ellipse)
    If ellipse IsNot Nothing Then
        ' Save the current Fill brush so that you can revert back to this value in DragLeave.
        _previousFill = ellipse.Fill

        ' If the DataObject contains string data, extract it.
        If e.Data.GetDataPresent(DataFormats.StringFormat) Then
            Dim dataString = e.Data.GetData(DataFormats.StringFormat)

            ' If the string can be converted into a Brush, convert it.
            Dim converter As New BrushConverter()
            If converter.IsValid(dataString) Then
                Dim newFill As Brush = CType(converter.ConvertFromString(dataString), Brush)
                ellipse.Fill = newFill
            End If
        End If
    End If
End Sub

Das DragOver-Ereignis wird kontinuierlich ausgelöst, während die Daten über das Ablageziel gezogen werden.The DragOver event occurs continuously while the data is dragged over the drop target. Dieses Ereignis ist mit dem GiveFeedback-Ereignis der Ziehquelle gekoppelt.This event is paired with the GiveFeedback event on the drag source. Im DragOver-Ereignishandler verwenden Sie normalerweise die Methoden GetDataPresent und GetData, um zu prüfen, ob die übertragenen Daten in einem Format vorliegen, das vom Ablageziel verarbeitet werden kann.In the DragOver event handler, you typically use the GetDataPresent and GetData methods to check whether the transferred data is in a format that the drop target can process. Darüber hinaus können Sie prüfen, ob Modifizierertasten gedrückt sind, was normalerweise anzeigt, ob der Benutzer eine Verschiebe- oder eine Kopieraktion beabsichtigt.You can also check whether any modifier keys are pressed, which will typically indicate whether the user intends a move or copy action. Nachdem diese Prüfungen vorgenommen wurden, legen Sie die DragEventArgs.Effects-Eigenschaft fest, um die Ziehquelle zu benachrichtigen, welche Auswirkungen das Ablegen der Daten hat.After these checks are performed, you set the DragEventArgs.Effects property to notify the drag source what effect dropping the data will have. Die Ziehquelle empfängt diese Informationen in den GiveFeedback-Ereignisargumenten und kann einen geeigneten Cursor festlegen, um dem Benutzer Rückmeldung zu geben.The drag source receives this information in the GiveFeedback event args, and can set an appropriate cursor to give feedback to the user.

Das folgende Beispiel zeigt den DragOver-Ereignishandler für ein Ellipse-Element.The following example shows the DragOver event handler for an Ellipse element. Dieser Code überprüft, ob das über die Ellipse gezogene DataObject Zeichenfolgendaten enthält, die in einen Brush konvertiert werden können.This code checks to see if the DataObject being dragged over the ellipse contains string data that can be converted to a Brush. In diesem Fall legt er die DragEventArgs.Effects-Eigenschaft als Copy fest.If so, it sets the DragEventArgs.Effects property to Copy. Dies zeigt der Ziehquelle an, dass die Daten zur Ellipse kopiert werden können.This indicates to the drag source that the data can be copied to the ellipse. Wenn die Daten nicht in einen Brush konvertiert werden können, wird die Eigenschaft DragEventArgs.Effects auf None festgelegt.If the data cannot be converted to a Brush, the DragEventArgs.Effects property is set to None. Dieses zeigt der Datenquelle an, dass die Ellipse kein gültiges Ablageziel für die Daten darstellt.This indicates to the drag source that the ellipse is not a valid drop target for the data.

private void ellipse_DragOver(object sender, DragEventArgs e)
{
    e.Effects = DragDropEffects.None;

    // If the DataObject contains string data, extract it.
    if (e.Data.GetDataPresent(DataFormats.StringFormat))
    {
        string dataString = (string)e.Data.GetData(DataFormats.StringFormat);

        // If the string can be converted into a Brush, allow copying.
        BrushConverter converter = new BrushConverter();
        if (converter.IsValid(dataString))
        {
            e.Effects = DragDropEffects.Copy | DragDropEffects.Move;
        }
    }
}
Private Sub Ellipse_DragOver(ByVal sender As System.Object, ByVal e As System.Windows.DragEventArgs)
    e.Effects = DragDropEffects.None

    ' If the DataObject contains string data, extract it.
    If e.Data.GetDataPresent(DataFormats.StringFormat) Then
        Dim dataString = e.Data.GetData(DataFormats.StringFormat)

        ' If the string can be converted into a Brush, convert it.
        Dim converter As New BrushConverter()
        If converter.IsValid(dataString) Then
            e.Effects = DragDropEffects.Copy Or DragDropEffects.Move
        End If
    End If
End Sub

Das DragLeave-Ereignis tritt ein, wenn die Daten aus der Begrenzung des Ziels heraus gezogen werden, ohne abgelegt worden zu sein.The DragLeave event occurs when the data is dragged out of the target's boundary without being dropped. Sie behandeln dieses Ereignis, um alles rückgängig zu machen, was Sie im DragEnter-Ereignishandler ausgeführt haben.You handle this event to undo anything that you did in the DragEnter event handler.

Das folgende Beispiel zeigt den DragLeave-Ereignishandler für ein Ellipse-Element.The following example shows the DragLeave event handler for an Ellipse element. Dieser Code macht die im DragEnter-Ereignishandler ausgeführte Vorschau rückgängig, indem er den gespeicherten Brush auf die Ellipse anwendet.This code undoes the preview performed in the DragEnter event handler by applying the saved Brush to the ellipse.

private void ellipse_DragLeave(object sender, DragEventArgs e)
{
    Ellipse ellipse = sender as Ellipse;
    if (ellipse != null)
    {
        ellipse.Fill = _previousFill;
    }
}
Private Sub Ellipse_DragLeave(ByVal sender As System.Object, ByVal e As System.Windows.DragEventArgs)
    Dim ellipse = TryCast(sender, Ellipse)
    If ellipse IsNot Nothing Then
        ellipse.Fill = _previousFill
    End If
End Sub

Das Drop-Ereignis tritt ein, wenn die Daten über dem Ablageziel abgelegt werden; standardmäßig geschieht dies beim Freigeben der Maustaste.The Drop event occurs when the data is dropped over the drop target; by default, this happens when the mouse button is released. Im Drop-Ereignishandler verwenden Sie die Methode GetData, um die übertragenen Daten aus dem DataObject zu extrahieren und jede von Ihrer Anwendung benötigte Datenverarbeitung auszuführen.In the Drop event handler, you use the GetData method to extract the transferred data from the DataObject and perform any data processing that your application requires. Das Drop-Ereignis beendet den Drag & Drop-Vorgang.The Drop event ends the drag-and-drop operation.

Das folgende Beispiel zeigt den Drop-Ereignishandler für ein Ellipse-Element.The following example shows the Drop event handler for an Ellipse element. Dieser Code wendet die Auswirkungen des Drag & Drop-Vorgan an und ähnelt dem Code im DragEnter-Ereignishandler.This code applies the effects of the drag-and-drop operation, and is similar to the code in the DragEnter event handler. Er überprüft, ob das DataObject, das über die Ellipse gezogen wird, Zeichenfolgendaten enthält, die in einen Brush konvertiert werden können.It checks to see if the DataObject being dragged over the ellipse contains string data that can be converted to a Brush. In diesem Fall wird der Brush auf die Ellipse angewendet.If so, the Brush is applied to the ellipse. Wenn die Daten nicht in einen Brush konvertiert werden können, wird keine Aktion ausgeführt.If the data cannot be converted to a Brush, no action is performed.

private void ellipse_Drop(object sender, DragEventArgs e)
{
    Ellipse ellipse = sender as Ellipse;
    if (ellipse != null)
    {
        // If the DataObject contains string data, extract it.
        if (e.Data.GetDataPresent(DataFormats.StringFormat))
        {
            string dataString = (string)e.Data.GetData(DataFormats.StringFormat);

            // If the string can be converted into a Brush, 
            // convert it and apply it to the ellipse.
            BrushConverter converter = new BrushConverter();
            if (converter.IsValid(dataString))
            {
                Brush newFill = (Brush)converter.ConvertFromString(dataString);
                ellipse.Fill = newFill;
            }
        }
    }
}
Private Sub Ellipse_Drop(ByVal sender As System.Object, ByVal e As System.Windows.DragEventArgs)
    Dim ellipse = TryCast(sender, Ellipse)
    If ellipse IsNot Nothing Then

        ' If the DataObject contains string data, extract it.
        If e.Data.GetDataPresent(DataFormats.StringFormat) Then
            Dim dataString = e.Data.GetData(DataFormats.StringFormat)

            ' If the string can be converted into a Brush, convert it.
            Dim converter As New BrushConverter()
            If converter.IsValid(dataString) Then
                Dim newFill As Brush = CType(converter.ConvertFromString(dataString), Brush)
                ellipse.Fill = newFill
            End If
        End If
    End If
End Sub

Siehe auchSee Also

Clipboard
Exemplarische Vorgehensweise: Aktivieren der Drag & Drop-Funktion auf einem BenutzersteuerelementWalkthrough: Enabling Drag and Drop on a User Control
Themen zu VorgehensweisenHow-to Topics
Drag & DropDrag and Drop