Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Dit onderwerp bevat een overzicht van slepen-en-neerzetten-ondersteuning in WPF-toepassingen (Windows Presentation Foundation). Slepen en neerzetten verwijst meestal naar een methode voor gegevensoverdracht waarbij u een muis (of een ander aanwijsapparaat) gebruikt om een of meer objecten te selecteren, deze objecten over een gewenst neerzetdoel in de gebruikersinterface (UI) te slepen en neer te zetten.
Ondersteuning voor slepen en neerzetten in WPF
Slepen en neerzetten omvat meestal twee partijen: een sleepbron waarvan het gesleepte object afkomstig is en een neergezet doel dat het neergezette object ontvangt. Bron voor slepen en neerzetten en het doel kunnen gebruikersinterface-elementen zijn in dezelfde toepassing of in een andere toepassing.
Het type en het aantal objecten dat kan worden bewerkt met slepen en neerzetten is volledig willekeurig. Bestanden, mappen en selecties van inhoud zijn bijvoorbeeld enkele van de meest voorkomende objecten die worden gemanipuleerd via slepen en neerzetten.
De specifieke acties die worden uitgevoerd tijdens een bewerking voor slepen en neerzetten, zijn toepassingsspecifiek en worden vaak bepaald door context. Als u bijvoorbeeld een selectie bestanden van de ene map naar de andere sleept op hetzelfde opslagapparaat, worden de bestanden standaard verplaatst, terwijl bestanden van een UNC-share (Universal Naming Convention) naar een lokale map worden gekopieerd.
De door WPF geboden faciliteiten voor slepen en neerzetten zijn ontworpen om zeer flexibel en aanpasbaar te zijn ter ondersteuning van een groot aantal scenario's voor slepen en neerzetten. Slepen en neerzetten ondersteunt het bewerken van objecten binnen één toepassing of tussen verschillende toepassingen. Slepen en neerzetten tussen WPF-toepassingen en andere Windows-toepassingen wordt ook volledig ondersteund.
In WPF kan elk UIElement of ContentElement deelnemen aan slepen en neerzetten. De gebeurtenissen en methoden die vereist zijn voor sleep-en-neerzetbewerkingen zijn gedefinieerd in klasse DragDrop. De UIElement- en ContentElement-klassen bevatten aliassen voor de DragDrop gekoppelde gebeurtenissen, zodat de gebeurtenissen worden weergegeven in de lijst met klassenleden wanneer een UIElement of ContentElement wordt overgenomen als basiselement. Gebeurtenis-handlers die aan deze gebeurtenissen zijn gekoppeld, worden gekoppeld aan de onderliggende DragDrop-gebeurtenis en ontvangen hetzelfde gebeurtenisgegevensobject. Zie de gebeurtenis UIElement.Drop voor meer informatie.
Belangrijk
Slepen en neerzetten met OLE werkt niet in de Internetzone.
Gegevensoverdracht
Onder slepen en neerzetten verstaan we een onderdeel van het bredere gebied van gegevensoverdracht. Gegevensoverdracht omvat bewerkingen voor slepen en neerzetten en kopiëren en plakken. Een bewerking voor slepen en neerzetten is vergelijkbaar met een kopieer-en-plak- of knip- en plakbewerking die wordt gebruikt om gegevens van het ene object of de toepassing naar het andere over te dragen met behulp van het klembord van het systeem. Voor beide typen bewerkingen is het volgende vereist:
Een bronobject dat de gegevens levert.
Een manier om de overgedragen gegevens tijdelijk op te slaan.
Een doelobject dat de gegevens ontvangt.
In een kopieer- en plakbewerking wordt het klembord van het systeem gebruikt om de overgedragen gegevens tijdelijk op te slaan; in een slepen-en-neerzetten-bewerking wordt een DataObject gebruikt om de gegevens op te slaan. Conceptueel bestaat een gegevensobject uit een of meer paren van een Object die de werkelijke gegevens bevat en een bijbehorende id voor gegevensindeling.
De slepenbron initieert een slepen-en-neerzetten-bewerking door de statische DragDrop.DoDragDrop methode aan te roepen en de overgedragen gegevens eraan door te geven. De DoDragDrop-methode verpakt de gegevens automatisch in een DataObject, indien nodig. Voor meer controle over de gegevensindeling kunt u de gegevens in een DataObject verpakken voordat u deze doorgeeft aan de DoDragDrop methode. De doelplaats is verantwoordelijk voor het extraheren van de gegevens uit de DataObject. Zie Gegevens- en gegevensobjectenvoor meer informatie over het werken met gegevensobjecten.
De bron en het doel van een slepen-en-neerzetten-bewerking zijn ELEMENTEN van de gebruikersinterface; De gegevens die daadwerkelijk worden overgedragen, hebben echter meestal geen visuele weergave. U kunt code schrijven om een visuele weergave te bieden van de gegevens die worden gesleept, zoals wanneer u bestanden sleept in Windows Verkenner. Standaard wordt feedback aan de gebruiker gegeven door de cursor te wijzigen om het effect te vertegenwoordigen dat de bewerking slepen en neerzetten op de gegevens heeft, bijvoorbeeld of de gegevens worden verplaatst of gekopieerd.
Effecten slepen en neerzetten
Slepen en neerzetten kan verschillende gevolgen hebben voor de overgedragen gegevens. U kunt bijvoorbeeld de gegevens kopiëren of de gegevens verplaatsen. WPF definieert een DragDropEffects opsomming die u kunt gebruiken om het effect van een slepen-en-neerzetten-bewerking op te geven. In de sleepbron kunt u de effecten opgeven die de bron in de methode DoDragDrop toestaat. In het neerzetdoel kunt u het effect specificeren dat het doel beoogt in de eigenschap Effects van de DragEventArgs-klasse. Wanneer het dropdoel het beoogde effect aangeeft in het DragOver-evenement, wordt deze informatie teruggestuurd aan de sleepbron in het GiveFeedback-evenement. De sleepbron gebruikt deze informatie om de gebruiker te informeren over het effect dat het dropdoel op de gegevens zal hebben. Wanneer de gegevens worden verwijderd, geeft het neervaldoel het werkelijke effect op in de Drop gebeurtenis. Deze informatie wordt doorgegeven aan de sleepbron als de retourwaarde van de methode DoDragDrop. Als het neerzetdoel een effect retourneert dat zich niet in de lijst met sleepbronnen van allowedEffectsbevindt, wordt de bewerking slepen en neerzetten geannuleerd zonder dat er gegevensoverdracht plaatsvindt.
Het is belangrijk te onthouden dat in WPF de DragDropEffects-waarden alleen worden gebruikt om communicatie tussen de sleepbron en het doelgebied te bieden met betrekking tot de effecten van de sleep-en-neerzetbewerking. Het werkelijke effect van de bewerking slepen en neerzetten is afhankelijk van het schrijven van de juiste code in uw toepassing.
Het drop-doelwit kan bijvoorbeeld aangeven dat het effect van het neerzetten van data is om de data te verplaatsen. Als u de gegevens echter wilt verplaatsen, moeten deze beide worden toegevoegd aan het doelelement en worden verwijderd uit het bronelement. Het bronelement kan erop wijzen dat het mogelijk is om de gegevens te verplaatsen, maar als u de code niet opgeeft om de gegevens uit het bronelement te verwijderen, is het eindresultaat dat de gegevens worden gekopieerd en niet worden verplaatst.
Slepen-en-Neerzetten-evenementen
Slepen en neerzetten ondersteunt een gebeurtenisgestuurd model. Zowel de sleepbron als het doel gebruiken een standaardset van gebeurtenissen om sleep- en neerzetbewerkingen af te handelen. De volgende tabellen geven een overzicht van de standaard drag-and-drop evenementen. Dit zijn gekoppelde gebeurtenissen in de DragDrop-klasse. Zie Overzicht van gekoppelde gebeurtenissenvoor meer informatie over gekoppelde gebeurtenissen.
Bron gebeurtenissen slepen
| Gebeurtenis | Samenvatting |
|---|---|
| GiveFeedback | Deze gebeurtenis vindt continu plaats tijdens een slepen-en-neerzetten-bewerking en stelt de drop-bron in staat om feedbackinformatie te geven aan de gebruiker. Deze feedback wordt meestal gegeven door het uiterlijk van de muisaanwijzer te wijzigen om de effecten aan te geven die zijn toegestaan door het doelobject. Dit is een bruisende gebeurtenis. |
| QueryContinueDrag | Deze gebeurtenis treedt op wanneer er een wijziging is in de status van een toets of muisknop tijdens een slepen-en-neerzettenbewerking, en stelt de bron die de neerzetbewerking uitvoert in staat om deze te annuleren, afhankelijk van de status van de toets of muisknop. Dit is een bruisende gebeurtenis. |
| PreviewGiveFeedback | Tunnelversie van GiveFeedback. |
| PreviewQueryContinueDrag | Tunnelversie van QueryContinueDrag. |
Doelevenementen verwijderen
| Gebeurtenis | Samenvatting |
|---|---|
| DragEnter | Deze gebeurtenis treedt op wanneer een object wordt gesleept naar de grens van het neervallende doel. Dit is een bruisende gebeurtenis. |
| DragLeave | Deze gebeurtenis treedt op wanneer een object buiten de grens van het doelgebied wordt gesleept. Dit is een bruisende gebeurtenis. |
| DragOver | Deze gebeurtenis vindt continu plaats terwijl een object wordt gesleept (verplaatst) binnen de grens van het neervallende doel. Dit is een bruisende gebeurtenis. |
| Drop | Deze gebeurtenis treedt op wanneer een object op het doelgebied wordt laten vallen. Dit is een bruisende gebeurtenis. |
| PreviewDragEnter | Tunnelversie van DragEnter. |
| PreviewDragLeave | Tunnelversie van DragLeave. |
| PreviewDragOver | Tunnelversie van DragOver. |
| PreviewDrop | Tunnelversie van Drop. |
Als u slepen-en-neerzetten-gebeurtenissen voor exemplaren van een object wilt verwerken, voegt u handlers toe voor de gebeurtenissen die in de voorgaande tabellen worden vermeld. Als u slepen-en-neerzetten-gebeurtenissen op klasseniveau wilt afhandelen, overschrijft u de bijbehorende virtuele On*Event- en On*PreviewEvent-methoden.
Slepen en neerzetten implementeren
Een UI-element kan een sleepbron, een neerzetdoel of beide zijn. Als u eenvoudige slepen en neerzetten wilt implementeren, schrijft u code om de bewerking slepen en neerzetten te initiëren en de verwijderde gegevens te verwerken. U kunt de slepen-en-neerzettenervaring verbeteren door optionele gebeurtenissen voor slepen en neerzetten te verwerken.
Als u het eenvoudige slepen en neerzetten wilt implementeren, voert u de volgende taken uit:
Identificeer het element dat een sleepbron is. Een slepenbron kan een UIElement of een ContentElementzijn.
Maak een event-handler op het bronelement voor slepen waarmee de sleep-en-neerzetbewerking wordt gestart. De gebeurtenis is doorgaans de MouseMove gebeurtenis.
Roep in de handler voor slepen van brongebeurtenissen de DoDragDrop methode aan om de bewerking slepen en neerzetten te initiëren. Geef in de DoDragDrop aanroep de sleepbron, de gegevens die moeten worden overgedragen en de toegestane effecten op.
Identificeer het element dat een doel voor neerzetten is. Een doel voor neerzetten kan UIElement of een ContentElementzijn.
Stel op het doel voor neerzetten de eigenschap AllowDrop in op
true.Maak in het doelgebied een Drop gebeurtenis-handler om de neergezette gegevens te verwerken.
Pak in de Drop gebeurtenis-handler de gegevens uit de DragEventArgs met behulp van de methoden GetDataPresent en GetData.
Gebruik in de Drop eventhandler de gegevens om de gewenste drag-and-drop-bewerking uit te voeren.
U kunt de implementatie van slepen en neerzetten verbeteren door een aangepaste DataObject te maken en door optionele sleep- en neerzetgebeurtenissen af te handelen, zoals wordt weergegeven in de volgende taken.
Als u aangepaste gegevens of meerdere gegevensitems wilt overdragen, maakt u een DataObject om door te geven aan de DoDragDrop methode.
Als u extra acties wilt uitvoeren tijdens het slepen, moet u de DragEnter-, DragOver- en DragLeave-gebeurtenissen op het dropelement verwerken.
Als u het uiterlijk van de muisaanwijzer wilt wijzigen, handelt u de GiveFeedback-gebeurtenis op de sleepbron af.
Als u wilt wijzigen hoe de bewerking slepen en neerzetten wordt geannuleerd, verwerkt u de QueryContinueDrag gebeurtenis op de slepenbron.
Voorbeeld van slepen en neerzetten
In deze sectie wordt beschreven hoe u slepen en neerzetten implementeert voor een Ellipse-element. De Ellipse is zowel een sleepbron als een doelwit voor neerzetten. De overgedragen data is de tekenreeks van de eigenschap Fill van de ellips. In de volgende XAML ziet u het element Ellipse en de gebeurtenissen die verband houden met drag-and-drop die het verwerkt. Zie Walkthrough: Slepen en neerzetten inschakelen op een gebruikersbesturingselementvoor volledige stappen voor het implementeren van slepen en neerzetten.
<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" />
Een element inschakelen als een sleepbron
Een object dat een slepenbron is, is verantwoordelijk voor:
Wanneer er een sleep plaatsvindt identificeren.
Het slepen-en-neerzetten-initiatief starten.
De gegevens identificeren die moeten worden overgedragen.
Het opgeven van de effecten die de bewerking slepen en neerzetten mag hebben op de overgedragen gegevens.
De sleepbron kan ook feedback geven aan de gebruiker met betrekking tot de toegestane acties (verplaatsen, kopiëren, geen) en kan de slepen-en-neerzettenbewerking annuleren op basis van aanvullende gebruikersinvoer, door op de ESC-toets te drukken tijdens het slepen.
Het is de verantwoordelijkheid van uw toepassing om te bepalen wanneer er een sleepactie plaatsvindt en vervolgens de sleep-en-neerzetbewerking te starten door de methode DoDragDrop aan te roepen. Meestal vindt dit plaats wanneer een MouseMove-gebeurtenis zich voordoet over het element dat moet worden gesleept terwijl een muisknop ingedrukt is. In het volgende voorbeeld staat uitgelegd hoe een drag-and-drop-operatie kan worden gestart vanuit de MouseMove event handler van een Ellipse-element om deze tot een sleepbron te maken. De overgedragen data is de tekenreeks van de eigenschap Fill van de ellips.
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
Roep in de MouseMove gebeurtenishandler de DoDragDrop methode aan om de sleep-en-neerzetbewerking te initiëren. De methode DoDragDrop heeft drie parameters:
dragSource: een verwijzing naar het afhankelijkheidsobject dat de bron is van de overgedragen gegevens; dit is doorgaans de bron van de MouseMove gebeurtenis.data- Een object dat de overgedragen gegevens bevat, verpakt in een DataObject.allowedEffects- Een van de DragDropEffects opsommingswaarden waarmee de toegestane effecten van de bewerking slepen en neerzetten worden opgegeven.
Elk serialiseerbare object kan worden doorgegeven in de parameter data. Als de gegevens nog niet zijn verpakt in een DataObject, worden deze automatisch verpakt in een nieuwe DataObject. Als u meerdere gegevensitems wilt doorgeven, moet u de DataObject zelf maken en doorgeven aan de DoDragDrop methode. Zie Gegevens- en gegevensobjectenvoor meer informatie.
De parameter allowedEffects wordt gebruikt om op te geven wat de sleepbron het doel voor neerzetten toestaat te doen met de overgedragen gegevens. De algemene waarden voor een sleepbron zijn Copy, Moveen All.
Opmerking
De bestemmingslocatie kan ook aangeven welke effecten het beoogt als reactie op de neergezette gegevens. Als het doel voor neerzetten bijvoorbeeld het gegevenstype dat moet worden neergezet niet onderkent, kan het de gegevens weigeren door de toegestane effecten in te stellen op None. Dit gebeurt doorgaans in de DragOver-gebeurtenishandler.
Een slepenbron kan desgewenst de GiveFeedback en QueryContinueDrag gebeurtenissen verwerken. Tenzij u de gebeurtenissen als verwerkt aanmerkt, worden standaardhandlers voor deze gebeurtenissen gebruikt. U negeert deze gebeurtenissen doorgaans, tenzij u een specifieke noodzaak hebt om hun standaardgedrag te wijzigen.
De GiveFeedback-gebeurtenis wordt continu gegenereerd terwijl de bron wordt gesleept. De standaardhandler voor deze gebeurtenis controleert of de sleepbron boven een geldig drop-doel is. Als dat zo is, controleert het de toegestane effecten van het doelobject. Vervolgens geeft het feedback aan de eindgebruiker met betrekking tot de toegestane drop-effecten. Dit wordt meestal gedaan door de muiscursor te wijzigen in een niet-neerzetten cursor, een kopieercursor of een verplaatscursor. U moet deze gebeurtenis alleen afhandelen als u aangepaste cursors moet gebruiken om feedback te geven aan de gebruiker. Als u deze gebeurtenis afhandelt, moet u deze markeren als afgehandeld, zodat de standaardhandler uw handler niet overschrijft.
De QueryContinueDrag-gebeurtenis wordt continu gegenereerd terwijl de bron wordt gesleept. U kunt deze gebeurtenis afhandelen om te bepalen welke actie de slepen-en-neerzetten-bewerking beëindigt op basis van de status van de ESC-, SHIFT-, CTRL- en ALT-toetsen, evenals de status van de muisknoppen. De standaardhandler voor deze gebeurtenis annuleert de sleep-en-neerzetbewerking als de ESC-toets wordt ingedrukt en laat de gegevens vallen als de muisknop wordt losgelaten.
Waarschuwing
Deze gebeurtenissen worden continu gegenereerd tijdens de drag-and-drop-bewerking. Daarom moet u resource-intensieve taken in de gebeurtenishandlers vermijden. Gebruik bijvoorbeeld een cursor in de cache in plaats van een nieuwe cursor te maken telkens wanneer de GiveFeedback gebeurtenis wordt gegenereerd.
Een element inschakelen als doel voor loslaten
Een object dat een neerzetgebied is, is verantwoordelijk voor:
Het specificeren dat het een geldige plaats is om neer te zetten.
Reageren op de sleepbron wanneer deze over het doel sleept.
Controleren of de overgedragen gegevens een indeling hebben die kan worden ontvangen.
De verwijderde gegevens verwerken.
Als u wilt opgeven dat een element een neerzetdoel is, stelt u de eigenschap AllowDrop in op true. De neerzetdoelevenementen worden vervolgens gegenereerd op het element, zodat u ze kunt afhandelen.
Wanneer een doel voor neerzetten wordt geëvalueerd, wordt een hittest uitgevoerd om te bepalen of de cursor zich boven de visual van het element bevindt. Sommige besturingselementen, zoals Canvas, hebben geen visuele presentatie en kunnen niet als doel voor slepen-en-neerzetten worden gebruikt, tenzij een visuele presentatie wordt toegevoegd. Stel de Canvas.Background eigenschap in op elke kleur om een visual te maken die de Canvas kleur vult. Als u de Canvas doorzichtigheid wilt behouden, maar dit wilt inschakelen als een doel voor neerzetten, stelt u de Background eigenschap in op Transparent.
Tijdens een slepen-en-droppen-bewerking vindt de volgende reeks gebeurtenissen plaats op de doellocatie:
De DragEnter-gebeurtenis treedt op wanneer de gegevens naar de rand van het doelgebied worden gesleept. Normaal gesproken verwerkt u deze gebeurtenis om een voorbeeld te geven van de effecten van de bewerking slepen en neerzetten, indien van toepassing. Stel de eigenschap DragEventArgs.Effects niet in de DragEnter gebeurtenis in, omdat deze wordt overschreven in de gebeurtenis DragOver.
In het volgende voorbeeld ziet u de DragEnter gebeurtenis-handler voor een Ellipse-element. Met deze code ziet u een voorbeeld van de effecten van de bewerking slepen en neerzetten door de huidige Fill kwast op te slaan. Vervolgens wordt de methode GetDataPresent gebruikt om te controleren of de DataObject die over de ellips wordt gesleept tekenreeksgegevens bevat die kunnen worden geconverteerd naar een Brush. Zo ja, dan worden de gegevens geëxtraheerd met behulp van de methode GetData. Het wordt dan omgezet naar een Brush en toegepast op de ellips. De wijziging wordt teruggezet in de DragLeave event handler. Als de gegevens niet kunnen worden geconverteerd naar een Brush, wordt er geen actie uitgevoerd.
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
De DragOver gebeurtenis vindt continu plaats terwijl de gegevens over het doel worden gesleept. Deze gebeurtenis is gekoppeld aan de GiveFeedback gebeurtenis op de sleepbron. In de DragOver eventhandler gebruikt u doorgaans de GetDataPresent- en GetData-methoden om te controleren of de overgedragen gegevens in een formaat zijn dat het dropdoel kan verwerken. U kunt ook controleren of er wijzigingstoetsen worden ingedrukt, wat meestal aangeeft of de gebruiker een verplaatsings- of kopieeractie wil uitvoeren. Nadat deze controles zijn uitgevoerd, stelt u de eigenschap DragEventArgs.Effects in om de sleepbron op de hoogte te stellen van welk effect het weglaten van de gegevens zal hebben. De sleepbron ontvangt deze informatie in de GiveFeedback gebeurtenis args en kan een geschikte cursor instellen om feedback te geven aan de gebruiker.
In het volgende voorbeeld ziet u de DragOver gebeurtenis-handler voor een Ellipse-element. Met deze code wordt gecontroleerd of de DataObject die over de ellips wordt gesleept een tekenreeks bevat die kan worden geconverteerd naar een Brush. Als dat het zo is, wordt de eigenschap DragEventArgs.Effects ingesteld op Copy. Hiermee wordt aangegeven dat de gegevens naar de ellips kunnen worden gekopieerd. Als de gegevens niet kunnen worden geconverteerd naar een Brush, wordt de eigenschap DragEventArgs.Effects ingesteld op None. Dit geeft de sleepbron aan dat de ellips geen geldige druppelbestemming is voor de gegevens.
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
De DragLeave gebeurtenis treedt op wanneer de gegevens buiten de grens van het doelobject worden gesleept zonder te worden losgelaten. U kunt deze gebeurtenis afhandelen om alles ongedaan te maken wat u in de DragEnter event handler hebt gedaan.
In het volgende voorbeeld ziet u de DragLeave gebeurtenis-handler voor een Ellipse-element. Met deze code wordt de preview die is uitgevoerd in de DragEnter-evenementenhandler ongedaan gemaakt door de opgeslagen Brush toe te passen op de ellips.
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
De Drop-gebeurtenis treedt op wanneer de gegevens worden neergezet op het doel, standaard gebeurt dit als de muisknop wordt losgelaten. In de Drop gebeurtenis-handler gebruikt u de GetData methode om de overgedragen gegevens uit de DataObject te extraheren en eventuele gegevensverwerking uit te voeren die uw toepassing nodig heeft. De gebeurtenis Drop beëindigt de slepen-en-neerzetten-bewerking.
In het volgende voorbeeld ziet u de Drop gebeurtenis-handler voor een Ellipse-element. Met deze code worden de effecten van de slepen-en-neerzetten-bewerking toegepast, en deze is vergelijkbaar met de code in de DragEnter evenementhandler. Er wordt gecontroleerd of de DataObject die over de ellips wordt gesleept, tekenreeksgegevens bevat die kunnen worden geconverteerd naar een Brush. Zo ja, dan wordt de Brush toegepast op de ellips. Als de gegevens niet kunnen worden geconverteerd naar een Brush, wordt er geen actie uitgevoerd.
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
Zie ook
.NET Desktop feedback