Übersicht über Drag & Drop

In diesem Thema finden Sie eine Übersicht über Drag & Drop-Unterstützung in der Benutzeroberfläche und das Ablegen von Objekten.

Drag & Drop-Unterstützung 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. Bei der Ziehquelle und dem Ablageziel kann es sich um Benutzeroberflächenelemente in der gleichen Anwendung oder in verschiedenen Anwendungen handeln.

Die Art und Anzahl der Objekte, die mit Drag & Drop bearbeitet werden können, ist beliebig. Beispielsweise stellen Dateien, Ordner und ausgewählte Inhaltsbereiche gängige Objekte dar, die mithilfe von Drag & Drop-Vorgängen bearbeitet werden.

Die Aktionen, die im Einzelnen im Rahmen von Drag & Drop-Vorgängen ausgeführt werden, sind anwendungsspezifisch und werden oft durch den Kontext festgelegt. Beispielsweise bewirkt das Ziehen einer Auswahl von Dateien aus einem Ordner in einen anderen auf dem gleichen Speichergerät standardmäßig ein Verschieben der Dateien, während die Dateien beim Ziehen aus einer UNC-Freigabe (Universal Naming Convention) in einen lokalen Ordner standardmäßig kopiert werden.

Die von WPF 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. Drag-and-Drop unterstützt das Bearbeiten von Objekten innerhalb einer einzelnen Anwendung oder zwischen verschiedenen Anwendungen. Das Ziehen und Ablegen zwischen WPF-Anwendungen und anderen Windows-Anwendungen wird ebenfalls in vollem Umfang unterstützt.

In WPF kann ein beliebiges UIElement oder ContentElement an Drag & Drop-Vorgängen beteiligt sein. Die für Drag & Drop-Vorgänge erforderlichen Ereignisse und Methoden sind in der DragDrop-Klasse definiert. 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. Die an diese Ereignisse angefügten Ereignishandler werden an das zugrundeliegende angefügte DragDrop-Ereignis angefügt und empfangen die gleiche Instanz der Ereignisdaten. Weitere Informationen finden Sie beim UIElement.Drop-Ereignis.

Wichtig

OLE-Drag & Drop funktioniert in der Zone „Internet“ nicht.

Datenübertragung

Drag & Drop bildet einen Teil des allgemeineren Bereichs der Datenübertragung. Zur Datenübertragung gehören Drag & Drop- ebenso wie Kopieren und Einfügen-Vorgänge. 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. Für beide Arten von Vorgängen sind diese Voraussetzungen erforderlich:

  • Ein Quellobjekt, das die Daten bereitstellt.

  • Eine Möglichkeit zum vorübergehenden Speichern der übertragenen Daten.

  • Ein Zielobjekt, das die Daten empfängt.

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. Konzeptionell besteht ein Datenobjekt aus mindestens einem Paar eines Object, das die eigentlichen Daten enthält, und einem entsprechenden Datenformatbezeichner.

Die Ziehquelle leitet einen Drag & Drop-Vorgang durch Aufrufen der statischen DragDrop.DoDragDrop-Methode und Übergeben der übertragenen Daten an sie ein. Die DoDragDrop-Methode umschließt die Daten ggf. automatisch in einem DataObject. 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. Das Ablageziel ist für die Extraktion der Daten aus dem DataObject zuständig. Weitere Informationen zum Arbeiten mit Datenobjekten finden Sie unter Daten und Datenobjekte.

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. Sie können Code erstellen, der eine visuelle Darstellung der gezogenen Daten bereitstellt, wie es etwa beim Ziehen von Dateien im Windows-Explorer geschieht. 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.

Auswirkungen von Drag & Drop-Vorgängen

Drag & Drop-Vorgänge können verschiedene Auswirkungen auf die übertragenen Daten haben. Beispielsweise können Sie die Daten kopieren oder sie verschieben. In WPF ist eine DragDropEffects-Enumeration definiert, die Sie verwenden können, um die Auswirkung eines Drag & Drop-Vorgangs anzugeben. In der Ziehquelle können Sie die Auswirkungen, die von der Quelle zugelassen werden, in der Methode DoDragDrop angeben. Im Ablageziel können Sie die Auswirkung, die von der Quelle beabsichtigt ist, in der Eigenschaft Effects der Klasse DragEventArgs angeben. Wenn das Ablageziel seine beabsichtigte Auswirkung im DragOver-Ereignis angibt, werden diese Informationen im GiveFeedback-Ereignis an die Zielquelle zurück übermittelt. Die Ziehquelle verwendet diese Informationen, um dem Benutzer mitzuteilen, welche Auswirkung das Ablegen auf dem Ablageziel auf die Daten haben wird. Wenn die Daten abgelegt werden, gibt das Ablageziel die tatsächlichen Auswirkungen im Drop-Ereignis an. Diese Informationen werden als Rückgabewert der Methode DoDragDrop zurück an die Ziehquelle übergeben. 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.

Es ist wichtig, sich daran zu erinnern, dass die DragDropEffects-Werte in WPF nur verwendet werden, um die Kommunikation zwischen der Ziehquelle und dem Ablageziel in Bezug auf die Auswirkungen des Drag & Drop-Vorgangs zu ermöglichen. Die tatsächliche Auswirkung des Drag & Drop-Vorgangs hängt von dem entsprechenden Code ab, den Sie für Ihre Anwendung schreiben.

Beispielsweise kann das Ablageziel angeben, dass die Auswirkung des Ablegens von Daten auf ihm die Verschiebung der Daten ist. Jedoch müssen die Daten zum Verschieben sowohl dem Zielelement hinzugefügt als auch aus dem Quellelement entfernt werden. 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.

Drag & Drop-Ereignisse

Drag & Drop-Vorgänge unterstützen ein ereignisgesteuertes Modell. Sowohl die Ziehquelle als auch das Ablageziel verwenden einen Satz von Standardereignissen beim Verarbeiten von Drag & Drop-Vorgängen. Die standardmäßigen Drag & Drop-Ereignisse sind in den folgenden Tabellen zusammengefasst. Dies sind angefügte Ereignisse der Klasse DragDrop. Weitere Informationen zu angefügten Ereignissen finden Sie unter Übersicht über angefügte Ereignisse.

Ereignisse der Ziehquelle

Ereignis Zusammenfassung
GiveFeedback Dieses Ereignis tritt während eines Drag & Drop-Vorgangs fortlaufend ein und ermöglicht der Ziehquelle, dem Benutzer Rückmeldung zu geben. Diese Rückmeldung erfolgt üblicherweise durch Ändern der Form des Mauszeigers, um die vom Ablageziel zugelassenen Auswirkungen anzuzeigen. Dies ist ein Bubbling-Ereignis.
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. Dies ist ein Bubbling-Ereignis.
PreviewGiveFeedback Tunnelversion von GiveFeedback.
PreviewQueryContinueDrag Tunnelversion von QueryContinueDrag.

Ereignisse des Ablageziels

Ereignis Zusammenfassung
DragEnter Dieses Ereignis tritt beim Ziehen eines Objekts in die Begrenzung des Ablageziels ein. Dies ist ein Bubbling-Ereignis.
DragLeave Dieses Ereignis tritt beim Ziehen eines Objekts aus der Begrenzung des Ablageziels ein. Dies ist ein Bubbling-Ereignis.
DragOver Dieses Ereignis tritt fortlaufend auf, während ein Objekt innerhalb der Begrenzung des Ablageziels gezogen (bewegt) wird. Dies ist ein Bubbling-Ereignis.
Drop Dieses Ereignis tritt ein, wenn ein Objekt auf dem Ablageziel abgelegt wird. Dies ist ein Bubbling-Ereignis.
PreviewDragEnter Tunnelversion von DragEnter.
PreviewDragLeave Tunnelversion von DragLeave.
PreviewDragOver Tunnelversion von DragOver.
PreviewDrop Tunnelversion von 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. Um Drag & Drop-Ereignisse auf der Klassenebene zu verarbeiten, überschreiben Sie die entsprechenden virtuellen On*Event- und On*PreviewEvent-Methoden. Weitere Informationen finden Sie unter Klassenbehandlung von Routingereignissen durch Steuerelement-Basisklassen.

Implementierung von Drag & Drop

Ein Benutzerelement kann eine Ziehquelle, ein Ablageziel oder beides darstellen. 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. Sie können die Drag & Drop-Erfahrung durch Verarbeitung optionaler Drag & Drop-Ereignisse verbessern.

Zum Implementieren der grundlegenden Drag & Drop-Funktionalität müssen Sie die folgenden Schritte ausführen:

  • Ermitteln des Elements, das als Ziehquelle fungieren soll. Eine Ziehquelle kann ein UIElement oder ein ContentElement sein.

  • Einen Ereignishandler in der Ziehquelle erstellen, der den Drag & Drop-Vorgang einleitet. Das zu verarbeitende Ereignis ist normalerweise das MouseMove-Ereignis.

  • Im Ereignishandler der Ziehquelle die Methode DoDragDrop aufrufen, um den Drag & Drop-Vorgang einzuleiten. Geben Sie im DoDragDrop-Aufruf die Ziehquelle, die zu übertragenden Daten und die zulässigen Auswirkungen an.

  • Ermitteln des Elements das als Ablageziel dienen soll. Ein Ablageziel kann ein UIElement oder ein ContentElement sein.

  • Legen Sie auf dem Ablageziel die AllowDrop-Eigenschaft auf true fest.

  • Erstellen Sie im Ablageziel einen Drop-Ereignishandler, um die abgelegten Daten zu verarbeiten.

  • Extrahieren Sie im Drop-Ereignishandler die Daten mithilfe der Methoden DragEventArgs und GetDataPresent aus den GetData.

  • Verwenden Sie die Daten im Drop-Ereignishandler, um den gewünschten Drag & Drop-Vorgang auszuführen.

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:

  • Um benutzerdefinierte Daten oder mehrere Datenelemente zu übertragen, erstellen Sie ein DataObject, das Sie an die DoDragDrop-Methode übergeben.

  • Um während eines Ziehvorgangs weitere Aktionen auszuführen, verarbeiten Sie die Ereignisse DragEnter, DragOver und DragLeave des Ablageziels.

  • Um die Darstellung des Mauszeigers zu ändern, verarbeiten Sie das GiveFeedback-Ereignis der Ziehquelle.

  • Um die Weise zu ändern, in der der Drag & Drop-Vorgang abgebrochen wird, verarbeiten Sie das QueryContinueDrag-Ereignis der Ziehquelle.

Drag & Drop-Beispiel

In diesem Abschnitt wird die Implementierung von Drag & Drop für ein Ellipse-Element beschrieben. Die Ellipse stellt sowohl eine Ziehquelle als auch ein Ablageziel dar. Die übertragenen Daten sind die Zeichenfolgendarstellung der Fill-Eigenschaft der Ellipse. Der folgende XAML-Code zeigt das Ellipse-Element und die mit Drag & Drop zusammenhängenden Ereignisse, die es verarbeitet. Eine ausführliche Anleitung zum Implementieren der Drag & Drop-Funktion finden Sie unter Exemplarische Vorgehensweise: Aktivieren der Drag & Drop-Funktion auf einem Benutzersteuerelement.

<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 Ziehquelle

Ein Objekt, das eine Ziehquelle darstellt, ist für Folgendes zuständig:

  • Erkennen, wenn ein Ziehvorgang eintritt.

  • Einleiten des Drag & Drop-Vorgangs.

  • Identifizieren der zu übertragenden Daten.

  • Angeben der zulässigen Auswirkungen, die der Drag & Drop-Vorgang auf die übertragenen Daten haben darf.

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.

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. Dies ist normalerweise der Fall, wenn ein MouseMove-Ereignis über dem zu ziehenden Element eintritt, während eine Maustaste gedrückt wird. 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. Die übertragenen Daten sind die Zeichenfolgendarstellung der Fill-Eigenschaft der Ellipse.

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. Die Methode DoDragDrop akzeptiert drei Parameter:

  • dragSource – Ein Verweis auf das Abhängigkeitsobjekt, das die Quelle der übertragenen Daten bildet; dies ist normalerweise die Quelle des MouseMove-Ereignisses.

  • data – Ein Objekt, das die übertragenen Daten enthält, umschlossen von einem DataObject.

  • allowedEffects – Einer der DragDropEffects-Enumerationswerte, der die zulässigen Auswirkungen des Drag & Drop-Vorgangs angibt.

Im Parameter data können beliebige serialisierbare Objekte übergeben werden. Wenn die Daten noch nicht von einem DataObject umschlossen sind, werden sie automatisch von einem neuen DataObject umschlossen. Zum Übergeben mehrerer Datenelemente müssen Sie das DataObject selbst erstellen und es an die DoDragDrop-Methode übergeben. Weitere Informationen finden Sie unter Daten und Datenobjekte.

Der allowedEffects-Parameter wird verwendet, um anzugeben, welche Aktionen die Ziehquelle dem Ablageziel mit den übertragenen Daten erlaubt. Die üblichen Werte für eine Ziehquelle sind Copy, Move und All.

Hinweis

Das Ablageziel kann außerdem angeben, welche Auswirkungen es als Reaktion auf die Ablage der Daten beabsichtigt. 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. Dies erfolgt normalerweise im DragOver-Ereignishandler des Ablageziels.

Ziehquellen können optional die Ereignisse GiveFeedback und QueryContinueDrag verarbeiten. Diese Ereignisse weisen Standardhandler auf, die verwendet werden, sofern ein Ereignis nicht als behandelt gekennzeichnet wird. Normalerweise werden diese Ereignisse ignoriert, es sei denn, es besteht eine spezifische Notwendigkeit, ihr Standardverhalten zu ändern.

Das GiveFeedback-Ereignis wird fortlaufend ausgelöst, während die Ziehquelle gezogen wird. Der Standardhandler für dieses Ereignis überprüft, ob die Ziehquelle sich über einem gültigen Ablageziel befindet. Ist das der Fall, überprüft er die zulässigen Auswirkungen des Ablageziels. Dann gibt er dem Endbenutzer Rückmeldung hinsichtlich der zulässigen Ablageauswirkungen. Dies erfolgt normalerweise durch Ändern des Mauscursors in einen Nicht ablegen-, Kopier- oder Verschiebecursor. Sie sollten dieses Ereignis nur verarbeiten, wenn Sie benutzerdefinierte Cursor verwenden müssen, um dem Benutzer Rückmeldung zu geben. Wenn Sie dieses Ereignis behandeln, markieren Sie es als behandelt, damit der Standardhandler Ihren Handler nicht überschreibt.

Das QueryContinueDrag-Ereignis wird fortlaufend ausgelöst, während die Ziehquelle gezogen wird. 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. 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.

Achtung

Diese Ereignisse werden während des Drag & Drop-Vorgangs fortlaufend ausgelöst. Daher sollten ressourcenintensive Tasks in den Ereignishandlern vermieden werden. Verwenden Sie z. B. einen zwischengespeicherten Cursor, statt bei jeder Auslösung des GiveFeedback-Ereignisses einen neuen Cursor zu erstellen.

Aktivieren eines Elements als Ablageziel

Ein Objekt, das ein Ablageziel darstellt, ist für Folgendes zuständig:

  • Angeben, dass es sich um ein gültiges Ablageziel handelt.

  • Reagieren auf die Ziehquelle, wenn sie über das Ziel gezogen wird.

  • Überprüfen, ob die übertragenen Daten in einem empfangbaren Format vorliegen.

  • Verarbeiten der abgelegten Daten.

Um anzugeben, dass ein Element ein Ablageziel ist, legen Sie seine AllowDrop-Eigenschaft auf true fest. Dadurch werden die Ablagezielereignisse für das Element ausgelöst, sodass Sie sie verarbeiten können. Während eines Drag & Drop-Vorgang tritt die folgenden Reihenfolge der Ereignisse beim Ablageziel auf:

  1. DragEnter

  2. DragOver

  3. DragLeave oder Drop

Das DragEnter-Ereignis tritt ein, wenn die Daten in den Begrenzung des Ablageziels gezogen werden. Normalerweise verarbeiten Sie dieses Ereignis, um eine Vorschau der Auswirkungen des Drag & Drop-Vorgangs bereitzustellen, wenn das in Ihrer Anwendung sinnvoll ist. Legen Sie nicht die DragEventArgs.Effects-Eigenschaft im Ereignis DragEnter fest, da sie im DragOver-Ereignis überschrieben wird.

Das folgende Beispiel zeigt den DragEnter-Ereignishandler für ein Ellipse-Element. Dieser Code bewirkt eine Vorschau der Auswirkungen des Drag & Drop-Vorgangs durch Speichern des aktuellen Fill-Pinsels. 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. Ist das der Fall, werden die Daten mithilfe der GetData-Methode extrahiert. Anschließend werden sie in einen Brush konvertiert und auf die Ellipse angewendet. Die Änderung wird im DragLeave-Ereignishandler rückgängig gemacht. Wenn die Daten nicht in einen Brush konvertiert werden können, wird keine Aktion ausgeführt.

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. Dieses Ereignis ist mit dem GiveFeedback-Ereignis der Ziehquelle gekoppelt. 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. 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. 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. Die Ziehquelle empfängt diese Informationen in den GiveFeedback-Ereignisargumenten und kann einen geeigneten Cursor festlegen, um dem Benutzer Rückmeldung zu geben.

Das folgende Beispiel zeigt den DragOver-Ereignishandler für ein Ellipse-Element. Dieser Code überprüft, ob das über die Ellipse gezogene DataObject Zeichenfolgendaten enthält, die in einen Brush konvertiert werden können. In diesem Fall legt er die DragEventArgs.Effects-Eigenschaft als Copy fest. Dies zeigt der Ziehquelle an, dass die Daten zur Ellipse kopiert werden können. Wenn die Daten nicht in einen Brush konvertiert werden können, wird die Eigenschaft DragEventArgs.Effects auf None festgelegt. Dieses zeigt der Datenquelle an, dass die Ellipse kein gültiges Ablageziel für die Daten darstellt.

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. Sie behandeln dieses Ereignis, um alles rückgängig zu machen, was Sie im DragEnter-Ereignishandler ausgeführt haben.

Das folgende Beispiel zeigt den DragLeave-Ereignishandler für ein Ellipse-Element. Dieser Code macht die im DragEnter-Ereignishandler ausgeführte Vorschau rückgängig, indem er den gespeicherten Brush auf die Ellipse anwendet.

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. 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. Das Drop-Ereignis beendet den Drag & Drop-Vorgang.

Das folgende Beispiel zeigt den Drop-Ereignishandler für ein Ellipse-Element. Dieser Code wendet die Auswirkungen des Drag & Drop-Vorgan an und ähnelt dem Code im DragEnter-Ereignishandler. Er überprüft, ob das DataObject, das über die Ellipse gezogen wird, Zeichenfolgendaten enthält, die in einen Brush konvertiert werden können. In diesem Fall wird der Brush auf die Ellipse angewendet. Wenn die Daten nicht in einen Brush konvertiert werden können, wird keine Aktion ausgeführt.

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

Weitere Informationen