Megosztás a következőn keresztül:


Drag and Drop áttekintés

Ez a témakör áttekintést nyújt a Windows Presentation Foundation (WPF) alkalmazások húzással történő támogatásáról. A húzás és ejtés általában olyan adatátviteli módszerre utal, amely egy egérrel (vagy más mutatóeszközzel) jelöli ki egy vagy több objektumot, az objektumokat a felhasználói felületen (UI) egy kívánt célhelyre viszik, majd ott elengedik.

Húzd és vidd támogatottság a WPF-ben

A húzási műveletek általában két felet foglalnak magukban: egy húzási forrást, amelyből az áthúzott objektum származik, és egy dobási cél, amely fogadja az elvetett objektumot. Az húzási forrás és az elhúzási cél lehet egy alkalmazás felhasználói felületi elemei vagy egy másik alkalmazás.

A húzással kezelhető objektumok típusa és száma teljesen tetszőleges. A fájlok, mappák és tartalomkijelölések például a húzási műveletek által manipulált leggyakoribb objektumok közé tartoznak.

A húzási művelet során végrehajtott műveletek alkalmazásspecifikusak, és gyakran a környezet határozza meg. Ha például egy kijelölt fájlt húz az egyik mappából a másikba ugyanazon a tárolóeszközön, alapértelmezés szerint áthelyezi a fájlokat, míg az univerzális elnevezési konvenció (UNC) megosztásból egy helyi mappába húzva alapértelmezés szerint átmásolja a fájlokat.

A WPF által biztosított húzási lehetőségek rendkívül rugalmasak és testreszabhatóak, így számos különféle húzási forgatókönyvet támogatnak. Az húzással módosíthatók az objektumok egyetlen alkalmazásban vagy különböző alkalmazások között. A WPF-alkalmazások és más Windows-alkalmazások közötti húzás és húzás is teljes mértékben támogatott.

A WPF-ben bármely UIElement vagy ContentElement részt vehet a húzás és ejtés folyamatában. A húzási műveletekhez szükséges eseményeket és metódusokat a DragDrop osztály határozza meg. A UIElement és ContentElement osztályok aliasokat tartalmaznak a DragDrop csatolt eseményekhez, így az események akkor jelennek meg az osztálytagok listájában, ha egy UIElement vagy ContentElement öröklődik alapelemként. Az eseményekhez csatolt eseménykezelők a mögöttes DragDrop csatolt eseményhez vannak csatolva, és ugyanazt az eseményadat-példányt kapják. További információ: UIElement.Drop esemény.

Fontos

Az OLE áthúzás és ejtés nem működik az internet zónájában.

Adatátvitel

Az áthúzás az adatátvitel általánosabb területének része. Az adatátvitel magában foglalja a húzási és másolási és beillesztési műveleteket. A húzási művelet hasonló a másolási és beillesztési vagy kivágási és beillesztési művelethez, amely az adatok egyik objektumból vagy alkalmazásból a másikba való átvitelére szolgál a rendszer vágólapjának használatával. Mindkét művelettípushoz a következő műveletek szükségesek:

  • Az adatokat biztosító forrásobjektum.

  • Az átvitt adatok ideiglenes tárolásának módja.

  • Az adatokat fogadó célobjektum.

Másolási és beillesztési művelet esetén a rendszer vágólapja ideiglenesen tárolja az átvitt adatokat; egy húzási műveletben egy DataObject az adatok tárolására szolgál. Az adatobjektumok elméletileg egy vagy több párból állnak egy Object, amely tartalmazza a tényleges adatokat, valamint egy megfelelő adatformátum-azonosítót.

Az húzási forrás egy húzási műveletet kezdeményez a statikus DragDrop.DoDragDrop metódus meghívásával és az átvitt adatok továbbításával. A DoDragDrop metódus szükség esetén automatikusan becsomagolja az adatokat egy DataObject. Az adatformátum jobb szabályozása érdekében az adatokat egy DataObject körbefuttathatja, mielőtt átadja azokat a DoDragDrop metódusnak. A beillesztési célpont felelős az adatok kinyeréséért a DataObject-ból. További információ az adatobjektumok használatával kapcsolatban: Adat- és adatobjektumok.

A húzási művelet forrása és célja felhasználói felületi elemek; azonban a ténylegesen átvitt adatok általában nem rendelkeznek vizuális ábrázolással. Kódot írhat, hogy vizuálisan ábrázolja a húzott adatokat, például amikor fájlokat húz a Windows Intézőben. Alapértelmezés szerint a rendszer visszajelzést küld a felhasználónak úgy, hogy a kurzort úgy módosítja, hogy a húzási művelet milyen hatással lesz az adatokra, például az adatok áthelyezésére vagy másolására.

Húzás és ejtés effektusok

Az áthúzási műveletek eltérő hatással lehetnek az átvitt adatokra. Másolhatja például az adatokat, vagy áthelyezheti az adatokat. A WPF egy DragDropEffects enumerálást határoz meg, amellyel megadhatja a húzási művelet hatását. Az húzási forrásban megadhatja a forrás által a DoDragDrop metódusban engedélyezett effektusokat. Az elejtési célterületen megadhatja, hogy a cél milyen hatást kíván elérni a Effects osztály DragEventArgs tulajdonságában. Ha a dobás célobjektuma meghatározza a kívánt hatást az DragOver eseményben, a rendszer visszaadja az adatokat a GiveFeedback esemény húzás forrásának. Az húzási forrás ezen információk alapján tájékoztatja a felhasználót arról, hogy a cél milyen hatást szándékozik gyakorolni az adatokra. Amikor az adatokat elvetik, a dobás célpontja az Drop eseményben határozza meg annak tényleges hatását. Ezt az információt a rendszer a DoDragDrop metódus visszatérési értékeként adja vissza a húzási forrásnak. Ha a drop target olyan effektust ad vissza, amely nem szerepel a allowedEffectshúzási forráslistájában, a húzási művelet adatátvitel nélkül megszakad.

Fontos megjegyezni, hogy a WPF-ben a DragDropEffects értékek csak a húzási forrás és az elhúzási cél közötti kommunikáció biztosítására szolgálnak a húzási művelet hatásaival kapcsolatban. A húzási művelet tényleges hatása attól függ, hogy ön írja meg a megfelelő kódot az alkalmazásban.

Előfordulhat például, hogy a célhely azt határozza meg, hogy az adatok eldobása az adatok áthelyezését eredményezi-e. Az adatok áthelyezéséhez azonban mindkettőt hozzá kell adni a célelemhez, és el kell távolítani a forráselemből. A forráselem azt jelezheti, hogy lehetővé teszi az adatok áthelyezését, de ha nem adja meg a kódot, hogy eltávolítsa az adatokat a forráselemből, a végeredmény az lesz, hogy az adatok másolása és áthelyezése nem történik meg.

Húzás és ejtés események

A húzással végzett műveletek támogatják az eseményvezérelt modelleket. A húzási forrás és a drop cél egyaránt szabványos eseménykészletet használ a húzási műveletek kezeléséhez. Az alábbi táblázatok a szabványos húzás és ejtés eseményeit összegzik. Ezek az DragDrop osztály csatolt eseményei. További információ a csatolt eseményekről: Csatolt események áttekintése.

Forrásesemények húzása

Esemény Összefoglalás
GiveFeedback Ez az esemény folyamatosan történik egy húzási művelet során, és lehetővé teszi, hogy a drop forrás visszajelzési információkat adjon a felhasználónak. Ezt a visszajelzést általában az egérmutató megjelenésének módosításával adják, jelezve a célobjektum által megengedett hatásokat. Ez egy pezsgő esemény.
QueryContinueDrag Ez az esemény akkor fordul elő, ha egy húzási művelet során megváltozik a billentyűzet vagy az egérgomb állapota, és lehetővé teszi, hogy a legördülő forrás megszakítsa a húzási műveletet a billentyű/gomb állapotától függően. Ez egy pezsgő esemény.
PreviewGiveFeedback A GiveFeedbackalagút verziója.
PreviewQueryContinueDrag A QueryContinueDragalagút verziója.

Célesemények elvetése

Esemény Összefoglalás
DragEnter Ez az esemény akkor fordul elő, ha egy objektumot húznak a cél célhatárába. Ez egy pezsgő esemény.
DragLeave Ez az esemény akkor fordul elő, ha egy objektumot húznak ki a cél célhatárából. Ez egy pezsgő esemény.
DragOver Ez az esemény folyamatosan történik, miközben egy objektumot húznak (áthelyeznek) a célterületen belül. Ez egy pezsgő esemény.
Drop Ez az esemény akkor fordul elő, amikor egy objektumot leejtenek a lerakási célpontra. Ez egy pezsgő esemény.
PreviewDragEnter A DragEnteralagút verziója.
PreviewDragLeave A DragLeavealagút verziója.
PreviewDragOver A DragOveralagút verziója.
PreviewDrop A Dropalagút verziója.

Az objektumpéldányok húzási eseményeinek kezeléséhez adjon hozzá kezelőket az előző táblákban felsorolt eseményekhez. A húzás és ejtés események osztályszinten történő kezeléséhez felül kell írnia a megfelelő virtuális On*Event és On*PreviewEvent metódusokat.

Húzás és ejtés megvalósítása

A felhasználói felületi elemek lehetnek húzási források, dobási cél vagy mindkettő. Az egyszerű húzás és ejtés megvalósításához kódot kell írnia a húzási művelet elindításához és az elvetett adatok feldolgozásához. A húzás és ejtés élményét javíthatja azáltal, hogy kezeli az opcionális húzás és ejtés eseményeket.

Az alapvető húzás és dobás megvalósításához a következő feladatokat fogja elvégezni:

  • Azonosítsa a húzási forrásként szolgáló elemet. A húzási forrás lehet UIElement vagy ContentElement.

  • Hozzon létre egy eseménykezelőt a húzási forráson, amely elindítja a húzási műveletet. Az esemény jellemzően a MouseMove esemény.

  • A húzási forrás eseménykezelőjében hívja meg a DoDragDrop metódust a húzási művelet elindításához. A DoDragDrop hívásban adja meg a húzási forrást, az átvitt adatokat és az engedélyezett effektusokat.

  • Azonosítsa a célként szolgáló elemet. A dobási cél lehet UIElement vagy ContentElement.

  • A dobási célon állítsa a AllowDrop tulajdonságot trueértékre.

  • A drop targetben hozzon létre egy Drop eseménykezelőt az elvetett adatok feldolgozásához.

  • A Drop eseménykezelőben nyerje ki az adatokat a DragEventArgs-ból a GetDataPresent és a GetData metódusok használatával.

  • Az Drop eseménykezelőben az adatok használatával hajtsa végre a kívánt húzási műveletet.

A húzással és ejtéssel történő végrehajtás javítása érdekében hozzon létre egy egyéni DataObject elemet, és kezelje a választható húzási forráseseményeket és ejtési céleseményeket, ahogyan az az alábbi feladatokban látható:

  • Egyéni adatok vagy több adatelem átviteléhez hozzon létre egy DataObject a DoDragDrop metódusnak való továbbításhoz.

  • Ha további műveleteket szeretne végrehajtani a fogd és vidd művelet során, kezelje a DragEnter, DragOverés DragLeave eseményeket a célobjektumon.

  • Az egérmutató megjelenésének módosításához kezelje a GiveFeedback eseményt a húzási forráson.

  • A húzás és ejtés művelet megszakításának módosításához kezelje a QueryContinueDrag eseményt a húzóforráson.

Példa húzás és ejtéssel

Ez a szakasz ismerteti, hogyan lehet megvalósítani a húzás és ejtés funkciót egy Ellipse elemhez. A Ellipse egyszerre húzási forrás és dobási cél is. Az átvitt adatok az ellipszis Fill tulajdonságának sztringreprezentációja. Az alábbi XAML a Ellipse elemet és az általa kezelt húzás-és ejtés eseményeket mutatja be. A húzás és ejtés teljes lépéseit tekintse meg a útmutatóban: A húzás és ejtés engedélyezése egy felhasználói vezérlőn.

<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" />

Elem húzási forrásként való engedélyezése

Egy húzási forrásként szolgáló objektum a következőért felelős:

  • A húzás időpontjának azonosítása.

  • A húzás és ejtés művelet kezdeményezése.

  • Az átvitt adatok azonosítása.

  • Annak megadása, hogy az áthúzási művelet milyen hatással lehet az átvitt adatokra.

Az húzási forrás visszajelzést is küldhet a felhasználónak az engedélyezett műveletekkel kapcsolatban (áthelyezés, másolás, nincs), és megszakíthatja a húzási műveletet további felhasználói bemenetek alapján, például az ESC billentyű lenyomásával a húzás során.

Az alkalmazás feladata annak meghatározása, hogy mikor fordul elő húzás, majd indítsa el a húzási műveletet a DoDragDrop metódus meghívásával. Általában ez az az eset, amikor egy MouseMove esemény lép fel a húzni kívánt elem felett, miközben az egérgombot lenyomja. Az alábbi példa bemutatja, hogyan kezdeményezhet húzási műveletet egy MouseMove elem Ellipse eseménykezelőjének segítségével, hogy az húzási forrás legyen. Az átvitt adatok az ellipszis Fill tulajdonságának sztringreprezentációja.

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

Az MouseMove eseménykezelőben hívja meg a DoDragDrop metódust a húzási művelet elindításához. A DoDragDrop metódus három paramétert használ:

  • dragSource – Az átvitt adatok forrásaként használt függőségi objektumra mutató hivatkozás; ez általában a MouseMove esemény forrása.

  • data - Egy objektum, amely az átvitt adatokat tartalmazza, bebugyolálva egy DataObject-be.

  • allowedEffects – Az egyik DragDropEffects enumerálási érték, amely meghatározza a húzási művelet engedélyezett hatásait.

Bármely szerializálható objektum átadható a data paraméterben. Ha az adatok még nincsenek becsomagolva egy DataObject-ba, a rendszer automatikusan egy új DataObject-be csomagolja be őket. Több adatelem átadásához saját maga kell létrehoznia a DataObject, és át kell adnia azt a DoDragDrop metódusnak. További információ: Adat- és adatobjektumok.

A allowedEffects paraméterrel lehet meghatározni, hogy a húzási forrás mit engedélyez a célhelynek az átvitt adatokkal kapcsolatban. A húzási forrás általános értékei a következők: Copy, Moveés All.

Megjegyzés:

A dobási cél azt is meg tudja határozni, hogy milyen hatásokat tervez az elvetett adatokra reakcióként. Ha például a dobási cél nem ismeri fel az eldobott adattípust, elutasíthatja az adatokat úgy, hogy az engedélyezett effektusokat Noneértékre állítja. Ez általában a DragOver eseménykezelőjében történik.

A húzási forrás igény szerint képes kezelni a GiveFeedback és QueryContinueDrag eseményeket. Az eseményekhez alapértelmezett kezelők tartoznak, amelyeket akkor használnak, hacsak az eseményeket nem jelöli kezeltként. Ezeket az eseményeket általában figyelmen kívül fogja hagyni, hacsak nem kell módosítania az alapértelmezett viselkedésüket.

A GiveFeedback eseményt a rendszer folyamatosan emeli ki a húzási forrás húzása közben. Az esemény alapértelmezett kezelője ellenőrzi, hogy a húzási forrás érvényes dobási célon van-e túl. Ha igen, ellenőrzi a dobási cél engedélyezett hatásait. Ezután visszajelzést ad a végfelhasználónak az engedélyezett legördülő effektusokkal kapcsolatban. Ez általában úgy történik, hogy az egérmutatót nem esésmentesre, másolásra vagy áthelyezésre módosítja. Ezt az eseményt csak akkor érdemes kezelnie, ha egyéni kurzorokkal kell visszajelzést küldenie a felhasználónak. Ha ezt az eseményt kezeli, mindenképpen jelölje meg kezeltként, hogy az alapértelmezett kezelő ne bírálja felül az ön kezelését.

A QueryContinueDrag eseményt a rendszer folyamatosan emeli ki a húzási forrás húzása közben. Az esemény kezelésekor meghatározhatja, melyik művelet zárja le a húzás és ejtés műveletet az ESC, SHIFT, CTRL és ALT billentyűk, valamint az egérgombok állapota alapján. Az esemény alapértelmezett kezelője megszakítja a húzási műveletet, ha az ESC-kulcsot lenyomja, és az egérgomb megjelenésekor eldobja az adatokat.

Figyelmeztetés

Ezek az események a húzás és ejtés művelet során folyamatosan jelennek meg. Ezért kerülnie kell az erőforrás-igényes feladatokat az eseménykezelőkben. Például használjon gyorsítótárazott kurzort ahelyett, hogy minden alkalommal új kurzort hozzon létre, amikor a GiveFeedback esemény aktiválódik.

Elem engedélyezése célelhagyásos célként

A drop target objektum felelős a következőért:

  • Annak megadása, hogy ez egy érvényes dobási cél.

  • Reagálás a húzási forrásra, amikor az áthúzódik a célon.

  • Annak ellenőrzése, hogy az átvitt adatok olyan formátumúak-e, amelyet fogadni tud.

  • A ledobott adatok feldolgozása.

Ha meg szeretné adni, hogy egy elem egy dobási cél, a AllowDrop tulajdonságát trueértékre kell állítania. A célelemekhez kapcsolódó események ezután az elemen kerülnek aktiválásra, hogy Ön kezelhesse őket.

A dobási cél kiértékelésekor a rendszer egy találati tesztet végez annak megállapítására, hogy a kurzor az elem vizualizációja felett van-e. Egyes vezérlők, például a Canvas, nem rendelkeznek vizuális elemmel, és csak akkor használhatók célként eldobásra, ha hozzáadnak egy vizuális elemet. Állítsa a Canvas.Background tulajdonságot bármilyen színre, hogy olyan vizualizációt hozzon létre, amely színnel tölti ki a Canvas. A Canvas átlátszóan tartásához, de annak célként való engedélyezéséhez állítsa a Background tulajdonságot Transparentértékre.

Egy húzási művelet során a következő eseménysorozat történik a drop targeten:

  1. DragEnter

  2. DragOver

  3. DragLeave vagy Drop

A DragEnter esemény akkor következik be, amikor az adatokat behúzzák a cél határaiba. Ezt az eseményt általában úgy kezeli, hogy előnézetet adjon a húzási művelet hatásairól, ha szükséges az alkalmazás számára. Ne állítsa be a DragEventArgs.Effects tulajdonságot az DragEnter eseményben, mert az felülíródik a DragOver eseményben.

Az alábbi példában egy DragEnter elem Ellipse eseménykezelője látható. Ez a kód az aktuális Fill ecset mentésével mutatja be a húzás és dobás művelet hatásait. Ezután a GetDataPresent metódussal ellenőrzi, hogy a DataObject, amelyet az ellipszis fölé húznak, tartalmaz-e olyan sztringadatokat, amelyek átalakíthatók Brush. Ha igen, az adatok kinyerése a GetData módszerrel történik. Ezután Brush-á alakul, és az ellipszisre alkalmazzák. A módosítás visszaáll a DragLeave eseménykezelőben. Ha az adatok nem konvertálhatók Brush-ra, nincs végrehajtva művelet.

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

A DragOver esemény folyamatosan zajlik, miközben az adatokat áthúzzák a célterületre. Ez az esemény a húzási forrás GiveFeedback eseményével van párosítva. Az DragOver eseménykezelőben általában a GetDataPresent és GetData metódusokat használja annak ellenőrzésére, hogy az átvitt adatok olyan formátumban vannak-e, amelyet a célfeldolgozás képes kezelni. Azt is ellenőrizheti, hogy a módosító billentyűk lenyomva vannak-e, ami általában azt jelzi, hogy a felhasználó áthelyezési vagy másolási műveletet kíván-e végrehajtani. Az ellenőrzések elvégzése után a DragEventArgs.Effects tulajdonságot úgy állítja be, hogy értesítse a húzási forrást, hogy milyen hatással lesz az adatok elvetése. A húzási forrás megkapja ezeket az információkat az GiveFeedback esemény args-ben, és beállíthatja a megfelelő kurzort, hogy visszajelzést küldjön a felhasználónak.

Az alábbi példában egy DragOver elem Ellipse eseménykezelője látható. Ez a kód azt ellenőrzi, hogy a DataObject, amely az ellipszis fölé van húzva, tartalmaz-e olyan szöveges adatokat, amelyek átalakíthatók Brush-re. Ha igen, a DragEventArgs.Effects tulajdonságot Copyértékre állítja. Ez azt jelzi a húzási forrásnak, hogy az adatok átmásolhatók az ellipszisre. Ha az adatok nem konvertálhatók Brush, a DragEventArgs.Effects tulajdonság értéke None. Ez azt jelzi a húzás forrásának, hogy az ellipszis érvénytelen célpont az adatok számára.

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

A DragLeave esemény akkor következik be, ha az adatok a cél határán kívülre kerülnek anélkül, hogy elvetik őket. Ezt az eseményt úgy kezeli, hogy visszaállítson mindent, amit az DragEnter eseménykezelőben tett.

Az alábbi példában egy DragLeave elem Ellipse eseménykezelője látható. Ez a kód visszavonja az DragEnter eseménykezelőben végrehajtott előnézetet az ellipszisre mentett Brush alkalmazásával.

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

A Drop esemény akkor következik be, amikor az adatok eldobásra kerülnek a célterületen; alapértelmezés szerint ez akkor fordul elő, amikor az egérgombot felengedik. Az Drop eseménykezelőben a GetData metódus használatával kinyerheti az átvitt adatokat a DataObject, és elvégezheti az alkalmazás által igényelt adatfeldolgozást. Az Drop esemény véget vet a húzás és ejtés műveletnek.

Az alábbi példában egy Drop elem Ellipse eseménykezelője látható. Ez a kód a húzási művelet hatásait alkalmazza, és hasonló a DragEnter eseménykezelőben lévő kódhoz. Ellenőrzi, hogy az ellipszis fölé húzott DataObject tartalmaz-e olyan karakterlánc adatokat, amelyek átalakíthatók Brush. Ha igen, a Brush az ellipszisre van alkalmazva. Ha az adatok nem konvertálhatók Brush-ra, nincs végrehajtva művelet.

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

Lásd még