Sdílet prostřednictvím


Přehled přetahování

Toto téma obsahuje přehled podpory přetažení v aplikacích WINDOWS Presentation Foundation (WPF). Přetažení obvykle odkazuje na metodu přenosu dat, která zahrnuje použití myši (nebo jiného odkazujícího zařízení) k výběru jednoho nebo více objektů, přetažení těchto objektů přes požadovaný cíl přetažení v uživatelském rozhraní a jejich vyřazení.

Podpora přetažení ve WPF

Operace přetahování obvykle zahrnují dvě strany: zdroj přetažení, ze kterého pochází přetažený objekt, a cíl přetažení, který přijímá přetažený objekt. Zdrojem přetahování a cílem přetažení mohou být prvky uživatelského rozhraní ve stejné aplikaci nebo v jiné aplikaci.

Typ a počet objektů, se kterými lze manipulovat pomocí přetažení, je zcela libovolný. Například soubory, složky a výběry obsahu jsou některé z nejběžnějších objektů manipulovaných pomocí operací přetažení.

Konkrétní akce prováděné během operace přetažení jsou specifické pro aplikaci a často se určují podle kontextu. Například přetažení výběru souborů z jedné složky do jiné na stejném úložném zařízení přesune soubory ve výchozím nastavení, zatímco přetažení souborů ze sdílené složky UNC (Universal Naming Convention) do místní složky soubory ve výchozím nastavení zkopíruje.

Zařízení podporující přetahování, která poskytuje WPF, jsou navržená tak, aby byla vysoce flexibilní a přizpůsobitelná tak, aby podporovala širokou škálu scénářů přetažení. Přetažení podporuje manipulaci s objekty v rámci jedné aplikace nebo mezi různými aplikacemi. Přetažení mezi aplikacemi WPF a jinými aplikacemi pro Windows je také plně podporováno.

Ve WPF se může jakýkoli UIElement nebo ContentElement účastnit operace přetahování. Události a metody vyžadované pro operace přetažení a vložení jsou definovány ve třídě DragDrop. Třídy UIElement a ContentElement obsahují aliasy pro DragDrop připojené události, aby se události zobrazily v seznamu členů třídy, pokud je UIElement nebo ContentElement zděděna jako základní prvek. Obslužné rutiny událostí připojené k těmto událostem jsou napojeny na základní událost DragDrop a přijímají tutéž instanci dat události. Další informace najdete na události UIElement.Drop.

Důležitý

Přetahování a vložení OLE nefunguje v zóně Internetu.

Přenos dat

Drag-and-drop je součástí obecnější oblasti přenosu dat. Přenos dat zahrnuje operace přetažení a kopírování a vložení. Operace přetažení je analogická k operaci kopírování a vložení nebo vyjmutí a vložení, která se používá k přenosu dat z jednoho objektu nebo aplikace do jiné pomocí systémové schránky. Oba typy operací vyžadují:

  • Zdrojový objekt, který poskytuje data.

  • Způsob dočasného ukládání přenášených dat.

  • Cílový objekt, který přijímá data.

Při operaci kopírování a vložení se systémová schránka používá k dočasnému ukládání přenášených dat, zatímco při operaci přetažení se k ukládání dat využívá jednotka DataObject. Datový objekt se koncepčně skládá z jedné nebo více dvojic Object, která obsahuje skutečná data, a odpovídající identifikátor formátu dat.

Zdroj přetažení zahájí operaci přetažení voláním statické DragDrop.DoDragDrop metody a předáním přenesených dat do ní. Metoda DoDragDrop v případě potřeby automaticky zabalí data do DataObject. Pro větší kontrolu nad formátem dat můžete data zabalit do DataObject před předáním do metody DoDragDrop. Cílový objekt je zodpovědný za extrahování dat z DataObject. Další informace o práci s datovými objekty naleznete v tématu Data a datové objekty.

Zdrojem a cílem operace přetažení jsou prvky uživatelského rozhraní; data, která jsou skutečně přenášena, však obvykle nemají vizuální reprezentaci. Můžete napsat kód pro vizuální znázornění dat, která jsou přetažena, například při přetahování souborů v Průzkumníku Windows. Ve výchozím nastavení se uživateli poskytuje zpětná vazba tak, že změníte kurzor tak, aby představoval efekt, který bude mít operace přetažení na data, například jestli se data přesunou nebo zkopírují.

Efekty táhni a pusť

Operace přetažení mohou mít různé efekty na přenášená data. Můžete například zkopírovat data nebo je můžete přesunout. WPF definuje výčtovou hodnotu DragDropEffects, kterou můžete použít k určení efektu operace přetažení a umístění. Ve zdroji tažení můžete určit efekty, které zdroj povolí v metodě DoDragDrop. V cíli přetažení můžete určit účinek, který je zamýšlen cílem, ve vlastnosti Effects třídy DragEventArgs. Když cíl přetažení určuje zamýšlený účinek v události DragOver, předají se informace zpět do zdroje přetažení v události GiveFeedback. Zdroj přetažení využívá tyto informace k tomu, aby uživatele informoval o tom, jaký účinek má cíl přetažení na data. Když jsou data přetažena, cílový prvek určuje svůj skutečný účinek v události Drop. Informace se předají zpět do zdroje přetažení jako návratová hodnota metody DoDragDrop. Pokud cíl přetažení vrátí efekt, který není v seznamu zdrojů přetažení allowedEffects, operace přetažení se zruší bez jakéhokoli přenosu dat.

Je důležité si uvědomit, že ve WPF se hodnoty DragDropEffects používají pouze k poskytování komunikace mezi zdrojem přetažení a cílem přetažení, pokud jde o účinky operace přetažení. Skutečný účinek operace přetažení závisí na tom, že v aplikaci napíšete příslušný kód.

Například cíl přetažení může určit, že efektem upuštění dat na něj je jejich přesunutí. Pokud však chcete přesunout data, musí se přidat do cílového prvku i odebrat ze zdrojového prvku. Zdrojový prvek může znamenat, že umožňuje přesunout data, ale pokud nezadáte kód pro odebrání dat ze zdrojového prvku, bude konečným výsledkem, že se data zkopírují a nepřesunou se.

"Přetáhnout a pustit události"

Operace přetažení podporují model řízený událostmi. Jak zdroj táhnutí, tak i cíl puštění používají standardní sadu událostí ke zpracování operací táhnutí a puštění. Následující tabulky shrnují standardní události přetahování. Tyto události jsou připojeny na třídě DragDrop. Další informace o připojených událostech naleznete v tématu Přehled připojených událostí.

Přetažení zdrojových událostí

Událost Shrnutí
GiveFeedback K této události dochází nepřetržitě během operace přetažení a umožňuje zdroji přetažení poskytnout uživateli informace o zpětné vazbě. Tato zpětná vazba se obvykle poskytuje změnou vzhledu ukazatele myši, který označuje efekty povolené cílem přesunu. Jedná se o bublající událost.
QueryContinueDrag K této události dochází v případě, že během operace přetažení dojde ke změně stavu klávesnice nebo tlačítka myši a umožní zdroji přetažení zrušit operaci přetažení v závislosti na stavu klávesy nebo tlačítka. Jedná se o bublající událost.
PreviewGiveFeedback Verze tunelového propojení GiveFeedback.
PreviewQueryContinueDrag Tunelová verze QueryContinueDrag.

Vyřazení cílových událostí

Událost Shrnutí
DragEnter K této události dochází, když je objekt přetažen do hranice cíle přetažení. Jedná se o bublající událost.
DragLeave K této události dochází, když je objekt přetažen z hranice cílové oblasti. Jedná se o bublající událost.
DragOver K této události dochází, když je objekt nepřetržitě přetahován v rámci hranice cílové oblasti. Jedná se o bublající událost.
Drop K této události dochází, když je objekt spuštěn na cílovou oblast. Jedná se o bublinkovou událost.
PreviewDragEnter Verze tunelového propojení DragEnter.
PreviewDragLeave Tunelovací verze DragLeave.
PreviewDragOver Verze tunelového propojení DragOver.
PreviewDrop Tunelovací verze Drop.

Chcete-li zpracovat události přetažení pro instance objektu, přidejte obslužné rutiny pro události uvedené v předchozích tabulkách. Chcete-li na úrovni třídy zpracovat události přetažení, překryjte odpovídající virtuální metody On*Event a On*PreviewEvent. Další informace naleznete v tématu zpracování směrovaných událostí základními třídami ovládacího prvku.

Implementace táhni a pusť

Prvek uživatelského rozhraní může být zdroj přetažení, cíl přetažení nebo obojí. Pokud chcete implementovat základní přetahování a upouštění, napíšete kód, který zahájí operaci přetahování a zpracuje upuštěná data. Můžete vylepšit uživatelský zážitek s funkcí drag-and-drop tím, že budete zpracovávat volitelné události drag-and-drop.

Pokud chcete implementovat základní přetahování myší, dokončíte následující úlohy:

  • Identifikujte prvek, který bude zdrojem přetažení. Zdrojem přetažení může být UIElement nebo ContentElement.

  • Na zdroji přetažení vytvořte obslužnou rutinu události, která zahájí operaci přetažení. Událost je obvykle MouseMove událostí.

  • V obslužné rutině události přetažení volejte metodu DoDragDrop, abyste inicializovali operaci přetažení a vložení. Ve volání DoDragDrop zadejte zdroj přetažení, data, která se mají přenést, a povolené efekty.

  • Určete prvek, který bude cílem přetažení. Cíl přetažení může být UIElement nebo ContentElement.

  • V cíli přetažení nastavte vlastnost AllowDrop na true.

  • V cílové oblasti přetahování vytvořte obslužnou rutinu události Drop pro zpracování přenesených dat.

  • V obslužné rutině události Drop extrahujte data z DragEventArgs pomocí GetDataPresent a GetData metod.

  • V obsluze události Drop použijte data k provedení požadované operace přetažení a vložení.

Implementaci přetažení můžete vylepšit vytvořením vlastního DataObject a zpracováním volitelných událostí zdroje přetažení a cíle pro umístění, jak je znázorněno v následujících úlohách:

  • Pokud chcete přenést vlastní data nebo více datových položek, vytvořte DataObject, který předáte metodě DoDragDrop.

  • Pokud chcete provádět další akce během přetažení, zpracujte události DragEnter, DragOvera DragLeave na cíli přetažení.

  • Pokud chcete změnit vzhled ukazatele myši, zpracujte událost GiveFeedback ve zdroji přetažení.

  • Pokud chcete změnit způsob zrušení operace přetažení, zpracujte událost QueryContinueDrag na zdroji přetažení.

Příklad přetažení a vložení

Tato část popisuje, jak implementovat přetažení pro prvek Ellipse. Ellipse je zdroj přetažení i cíl přetažení. Přenášená data jsou řetězcová reprezentace Fill vlastnosti elipsy. Následující XAML ukazuje element Ellipse a související události s přetažením, které tento element zpracovává. Pro úplný postup, jak implementovat funkci přetažení a puštění, podívejte se na téma Návod: Povolení přetažení a puštění na uživatelském ovládacím prvku.

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

Povolení, aby prvek byl zdrojem přetažení

Objekt, který je zdrojem přetažení, je zodpovědný za:

  • Identifikace, kdy dojde k přetažení

  • Inicializování operace přetažení.

  • Identifikace přenášených dat

  • Určení efektů, které operace přetažení může mít na přenášených datech.

Zdroj přetažení může také uživateli poskytnout zpětnou vazbu týkající se povolených akcí (přesunutí, kopírování, žádný) a může operaci přetažení zrušit na základě dalšího uživatelského vstupu, například stisknutí klávesy ESC během přetažení.

Je zodpovědností vaší aplikace určit, kdy dojde k přetažení, a poté zahájit operaci přetažení voláním metody DoDragDrop. Obvykle k tomu dochází, když MouseMove událost nastane nad prvkem, který má být přetahován, zatímco je stisknuto tlačítko myši. Následující příklad ukazuje, jak zahájit operaci přetažení z obslužné rutiny události MouseMove elementu Ellipse, aby se stal zdrojem přetažení. Přenášená data jsou řetězcová reprezentace Fill vlastnosti elipsy.

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

Uvnitř obslužné rutiny události MouseMove zavolejte metodu DoDragDrop, aby se zahájila operace přetahování. Metoda DoDragDrop přebírá tři parametry:

  • dragSource – odkaz na objekt závislosti, který je zdrojem přenášených dat; to je obvykle zdroj události MouseMove.

  • data - objekt, který obsahuje přenášená data zabalená do DataObject.

  • allowedEffects – jedna z hodnot výčtu DragDropEffects, která určuje povolené účinky operace přetažení.

Jakýkoli serializovatelný objekt lze předat v data parametru. Pokud data ještě nejsou zabalena v DataObject, automaticky se zabalí do nové DataObject. Pokud chcete předat více datových položek, musíte vytvořit DataObject sami a předat ho DoDragDrop metodě. Další informace naleznete v části Data a datové objekty.

Parametr allowedEffects slouží k určení toho, co zdroj přetažení umožní cíli přetažení provádět s přenesenými daty. Společné hodnoty zdroje přetažení jsou Copy, Movea All.

Poznámka

Cíl vyřazení také dokáže určit, jaké účinky hodlá v reakci na vyřazená data. Například pokud cíl přetažení nerozpozná datový typ, který má být přetažen, může data odmítnout nastavením svých povolených efektů na None. Obvykle to dělá ve své DragOver obslužné rutině pro události.

Zdroj drag-and-drop může volitelně zpracovat události GiveFeedback a QueryContinueDrag. Tyto události mají výchozí obslužné rutiny, které se použijí, pokud události nenastavíte jako zpracované. Tyto události obvykle budete ignorovat, pokud nemáte konkrétní potřebu změnit jejich výchozí chování.

Událost GiveFeedback je vyvolána nepřetržitě při přetahování zdroje přetažení. Výchozí obslužná rutina této události zkontroluje, zda je zdroj přetažení přes platný cíl přetažení. Pokud ano, zkontroluje povolené účinky cíle přetažení. Potom poskytne koncovému uživateli zpětnou vazbu týkající se povolených efektů přetažení. To se obvykle provádí změnou kurzoru myši na kurzor bez přetažení, kopírování nebo přesunutí kurzoru. Tuto událost byste měli zpracovat pouze v případě, že potřebujete k poskytnutí zpětné vazby uživateli použít vlastní kurzory. Pokud tuto událost zpracujete, nezapomeňte ji označit jako popisovanou, aby výchozí obslužná rutina nepřepsala vaši obslužnou rutinu.

Událost QueryContinueDrag je vyvolána nepřetržitě při přetahování zdroje přetažení. Tuto událost můžete zpracovat, abyste zjistili, jaká akce ukončí operaci přetažení na základě stavu kláves ESC, SHIFT, CTRL a ALT a stavu tlačítek myši. Výchozí obslužná rutina pro tuto událost zruší operaci přetažení, pokud je stisknuta klávesa ESC, a v případě uvolnění tlačítka myši zahodí data.

Opatrnost

Tyto události se průběžně generují během operace přetahování. Proto byste se měli vyhnout úlohám náročným na zdroje v obslužných rutinách událostí. Například místo vytvoření nového kurzoru při každém vyvolání události GiveFeedback použijte kurzor uložený v mezipaměti.

Umožnit elementu být cílem přetažení

Objekt, který je cílem odstranění, zodpovídá za:

  • Určuje, že se jedná o platný cíl vyřazení.

  • Reagování na zdroj přetažení, když je přetahován přes cíl.

  • Kontrola, jestli jsou přenášená data ve formátu, který může přijímat.

  • Zpracování vyřazených dat.

Chcete-li určit, že prvek je cílem přetažení, nastavíte jeho vlastnost AllowDrop na true. Události cílového umístění budou vyvolány na prvku, abyste je mohli zpracovat.

Při vyhodnocení cíle přetažení se provede test trefy, který identifikuje, zda se kurzor nachází nad vizuální částí prvku. Některé ovládací prvky, jako je například Canvas, nemají grafické zobrazení a nelze je použít jako cílové místo pro přetažení, dokud se nepřidá grafický prvek. Nastavte vlastnost Canvas.Background na libovolnou barvu a vytvořte vizuál, který vyplní Canvas barvou. Pokud chcete zachovat Canvas transparentní, ale povolit ho jako cíl pro vkládání, nastavte vlastnost Background na Transparent.

Během přetahovací operace probíhá na cílovém místě přetažení následující posloupnost událostí:

  1. DragEnter

  2. DragOver

  3. DragLeave nebo Drop

Událost DragEnter nastane, když jsou data přetažena do hranice cíle přetažení. Tuto událost obvykle zpracováváte, abyste získali náhled na efekty operace drag-and-drop, pokud je to vhodné pro vaši aplikaci. Nenastavujte vlastnost DragEventArgs.Effects v události DragEnter, protože bude přepsána v události DragOver.

Obslužná rutina události DragEnter pro element Ellipse je ukázána v následujícím příkladu. Tento kód zobrazí náhled efektů operace přetažení myší uložením aktuálního štětce Fill. Pak pomocí GetDataPresent metody zkontroluje, zda DataObject přetahované přes elipsu obsahuje řetězcová data, která lze převést na Brush. Pokud ano, data se extrahují pomocí metody GetData. Potom se převede na Brush a použije se na elipsu. Změna je vrácena zpět v obslužné rutině události DragLeave. Pokud data nelze převést na Brush, neprovádí se žádná akce.

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

Událost DragOver probíhá nepřetržitě, když jsou data přetažena přes cílový objekt. Tato událost je propojena s událostí GiveFeedback na zdroji přetažení. V obslužné rutině události DragOver obvykle používáte metody GetDataPresent a GetData ke kontrole, zda data jsou přenášena ve formátu, který může cílový objekt přetažení zpracovat. Můžete také zkontrolovat, jestli jsou stisknuty nějaké modifikační klávesy, což obvykle značí, jestli uživatel hodlá akci přesunout nebo zkopírovat. Po provedení těchto kontrol nastavíte vlastnost DragEventArgs.Effects, abyste informovali zdroj přetažení, jaký efekt bude mít upuštění dat. Zdroj přetažení obdrží tyto informace v argumentech události GiveFeedback a může nastavit odpovídající kurzor pro poskytnutí zpětné vazby uživateli.

Následující příklad ukazuje obslužnou rutinu události DragOver pro element Ellipse. Tento kód zkontroluje, jestli DataObject přetažená přes elipsu obsahuje řetězcová data, která lze převést na Brush. Pokud ano, nastaví vlastnost DragEventArgs.Effects na Copy. Toto naznačuje zdroji přetažení, že data lze zkopírovat do elipsy. Pokud data nelze převést na Brush, je vlastnost DragEventArgs.Effects nastavena na None. To informuje zdroj přetažení, že elipsa není platným cílem pro přetažení dat.

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

Událost DragLeave nastane, když jsou data přetažena mimo hranici cíle, aniž by došlo k vyřazení. Tuto událost zpracujete a vrátíte zpět vše, co jste udělali v obslužné rutině události DragEnter.

Následující příklad ukazuje obslužnou rutinu DragLeave události pro Ellipse element. Tento kód zruší náhled provedený v obslužné rutině události DragEnter použitím uloženého Brush na elipsu.

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

K události Drop dojde, když se data přehodí přes cíl přetažení; ve výchozím nastavení k tomu dochází při uvolnění tlačítka myši. V obslužné rutině události Drop použijete metodu GetData k extrahování přenášených dat z DataObject a provádění zpracování dat, které vaše aplikace vyžaduje. Událost Drop ukončí operaci přetažení a vložení.

Následující příklad ukazuje obsluhu události Drop pro prvek Ellipse. Tento kód aplikuje efekty operace táhni a pusť a je podobný kódu v obslužné rutině události DragEnter. Zkontroluje, zda DataObject přetahovaný přes elipsu obsahuje řetězcová data, která lze převést na Brush. Pokud ano, použije se Brush na elipsu. Pokud data nelze převést na Brush, neprovádí se žádná akce.

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

Viz také