Przegląd Przeciąganie i upuszczanie

Ten temat zawiera omówienie obsługi przeciągania i upuszczania w aplikacjach Windows Presentation Foundation (WPF). Przeciąganie i upuszczanie często odwołuje się do metody transferu danych, która polega na użyciu myszy (lub innego urządzenia wskazującego) w celu wybrania jednego lub większej liczby obiektów, przeciągając te obiekty za pośrednictwem żądanego miejsca docelowego upuszczania w interfejsie użytkownika i upuszczając je.

Obsługa przeciągania i upuszczania w WPF

Operacje przeciągania i upuszczania zwykle obejmują dwie strony: źródło przeciągania, z którego pochodzi przeciągany obiekt, oraz obiekt docelowy upuszczania, który odbiera porzucony obiekt. Obiekt docelowy przeciągania źródła i upuszczania może być elementami interfejsu użytkownika w tej samej aplikacji lub innej aplikacji.

Typ i liczba obiektów, którymi można manipulować za pomocą przeciągania i upuszczania, jest całkowicie dowolna. Na przykład pliki, foldery i wybory zawartości to niektóre z bardziej typowych obiektów manipulowanych operacjami przeciągania i upuszczania.

Konkretne akcje wykonywane podczas operacji przeciągania i upuszczania są specyficzne dla aplikacji i często określane przez kontekst. Na przykład przeciągnięcie zaznaczenia plików z jednego folderu do innego na tym samym urządzeniu magazynu domyślnie przenosi pliki, podczas gdy przeciąganie plików z udziału UNC (Universal Naming Convention) do folderu lokalnego kopiuje pliki domyślnie.

Obiekty przeciągania i upuszczania dostarczane przez WPF są zaprojektowane tak, aby zapewnić wysoką elastyczność i możliwość dostosowywania w celu obsługi wielu różnych scenariuszy przeciągania i upuszczania. Przeciąganie i upuszczanie obsługuje manipulowanie obiektami w jednej aplikacji lub między różnymi aplikacjami. Przeciąganie i upuszczanie między aplikacjami WPF i innymi aplikacjami systemu Windows jest również w pełni obsługiwane.

W WPF dowolny UIElement lub ContentElement może uczestniczyć w przeciąganiu i upuszczaniu. Zdarzenia i metody wymagane do operacji przeciągania i upuszczania są definiowane w DragDrop klasie . Klasy UIElement i ContentElement zawierają aliasy dla dołączonych DragDrop zdarzeń, tak aby zdarzenia pojawiały się na liście składowych klasy, gdy element UIElement lub ContentElement jest dziedziczony jako element podstawowy. Programy obsługi zdarzeń dołączone do tych zdarzeń są dołączone do bazowego DragDrop dołączonego zdarzenia i odbierają to samo wystąpienie danych zdarzenia. Aby uzyskać więcej informacji, zobacz UIElement.Drop zdarzenie.

Ważne

Przeciąganie i upuszczanie OLE nie działa w strefie internetowej.

Transfer danych

Przeciąganie i upuszczanie jest częścią bardziej ogólnego obszaru transferu danych. Transfer danych obejmuje operacje przeciągania i upuszczania oraz kopiowania i wklejania. Operacja przeciągania i upuszczania jest analogiczna do operacji kopiowania i wklejania lub wycinania i wklejania, która jest używana do przesyłania danych z jednego obiektu lub aplikacji do innego za pomocą schowka systemowego. Oba typy operacji wymagają:

  • Obiekt źródłowy, który dostarcza dane.

  • Sposób tymczasowego przechowywania przesyłanych danych.

  • Obiekt docelowy, który odbiera dane.

W operacji kopiowania i wklejania schowek systemowy jest używany do tymczasowego przechowywania przesyłanych danych; w operacji przeciągania i upuszczania służy DataObject do przechowywania danych. Koncepcyjnie obiekt danych składa się z co najmniej jednej pary obiektu zawierającego Object rzeczywiste dane i odpowiadającego mu identyfikatora formatu danych.

Źródło przeciągania inicjuje operację przeciągania i upuszczania przez wywołanie metody statycznej DragDrop.DoDragDrop i przekazanie przesłanych do niego danych. Metoda DoDragDrop automatycznie opakowuje dane w razie DataObject potrzeby. Aby uzyskać większą kontrolę nad formatem danych, przed przekazaniem ich do DoDragDrop metody można opakowować dane.DataObject Obiekt docelowy upuszczania jest odpowiedzialny za wyodrębnienie danych z obiektu DataObject. Aby uzyskać więcej informacji na temat pracy z obiektami danych, zobacz Data and Data Objects (Obiekty danych i danych).

Źródło i element docelowy operacji przeciągania i upuszczania to elementy interfejsu użytkownika; jednak dane, które są przesyłane, zwykle nie mają wizualnej reprezentacji. Możesz napisać kod, aby zapewnić wizualną reprezentację przeciąganych danych, na przykład podczas przeciągania plików w Eksploratorze Windows. Domyślnie opinia jest dostarczana użytkownikowi przez zmianę kursora w celu reprezentowania wpływu operacji przeciągania i upuszczania na dane, na przykład tego, czy dane zostaną przeniesione, czy skopiowane.

Efekty przeciągania i upuszczania

Operacje przeciągania i upuszczania mogą mieć różny wpływ na przesyłane dane. Możesz na przykład skopiować dane lub przenieść dane. WPF definiuje DragDropEffects wyliczenie, którego można użyć do określenia efektu operacji przeciągania i upuszczania. W źródle przeciągania można określić efekty, które źródło będzie zezwalać w metodzie DoDragDrop . W obiekcie docelowym upuszczania można określić efekt, jaki cel zamierza we Effects właściwości DragEventArgs klasy. Gdy cel upuszczania określa zamierzony efekt w DragOver zdarzeniu, informacje te są przekazywane z powrotem do źródła przeciągania w GiveFeedback zdarzeniu. Źródło przeciągania używa tych informacji, aby poinformować użytkownika o wpływie obiektu docelowego upuszczania na dane. Gdy dane zostaną porzucone, cel upuszczania określa jego rzeczywisty efekt w Drop zdarzeniu. Te informacje są przekazywane z powrotem do źródła przeciągania jako wartość DoDragDrop zwracana metody. Jeśli cel upuszczania zwraca efekt, który nie znajduje się na liście allowedEffectsźródeł przeciągania , operacja przeciągania i upuszczania zostanie anulowana bez żadnego transferu danych.

Należy pamiętać, DragDropEffects że w WPF wartości są używane tylko do zapewnienia komunikacji między źródłem przeciągania a obiektem docelowym upuszczania w odniesieniu do efektów operacji przeciągania i upuszczania. Rzeczywisty wpływ operacji przeciągania i upuszczania zależy od ciebie, aby napisać odpowiedni kod w aplikacji.

Na przykład docelowy obiekt drop może określać, że wpływ upuszczania danych na nie polega na przeniesieniu danych. Jednak aby przenieść dane, należy je dodać do elementu docelowego i usunąć z elementu źródłowego. Element źródłowy może wskazywać, że umożliwia przenoszenie danych, ale jeśli nie podasz kodu w celu usunięcia danych z elementu źródłowego, wynik końcowy będzie taki, że dane zostaną skopiowane i nie zostaną przeniesione.

Zdarzenia przeciągania i upuszczania

Operacje przeciągania i upuszczania obsługują model sterowany zdarzeniami. Zarówno źródło przeciągania, jak i cel upuszczania używają standardowego zestawu zdarzeń do obsługi operacji przeciągania i upuszczania. W poniższych tabelach podsumowano standardowe zdarzenia przeciągania i upuszczania. Są to dołączone zdarzenia w DragDrop klasie . Aby uzyskać więcej informacji na temat dołączonych zdarzeń, zobacz Omówienie dołączonych zdarzeń.

Przeciągnij zdarzenia źródłowe

Wydarzenie Podsumowanie
GiveFeedback To zdarzenie występuje w sposób ciągły podczas operacji przeciągania i upuszczania oraz umożliwia źródło upuszczania przekazywanie informacji zwrotnych użytkownikowi. Ta opinia jest często podawana przez zmianę wyglądu wskaźnika myszy, aby wskazać efekty dozwolone przez cel upuszczania. To jest bulgocząca impreza.
QueryContinueDrag To zdarzenie występuje, gdy podczas operacji przeciągania i upuszczania następuje zmiana stanu klawiatury lub przycisku myszy i umożliwia źródło upuszczania anulowanie operacji przeciągania i upuszczania w zależności od stanów klawisza/przycisku. To jest bulgocząca impreza.
PreviewGiveFeedback Wersja tunelowania programu GiveFeedback.
PreviewQueryContinueDrag Wersja tunelowania programu QueryContinueDrag.

Usuwanie zdarzeń docelowych

Wydarzenie Podsumowanie
DragEnter To zdarzenie występuje, gdy obiekt jest przeciągany do granicy obiektu docelowego upuszczania. To jest bulgocząca impreza.
DragLeave To zdarzenie występuje, gdy obiekt jest przeciągany z granicy obiektu docelowego upuszczania. To jest bulgocząca impreza.
DragOver To zdarzenie występuje w sposób ciągły, gdy obiekt jest przeciągany (przenoszony) w granicach obiektu docelowego upuszczania. To jest bulgocząca impreza.
Drop To zdarzenie występuje, gdy obiekt zostanie porzucony w obiekcie docelowym upuszczania. To jest bulgocząca impreza.
PreviewDragEnter Wersja tunelowania programu DragEnter.
PreviewDragLeave Wersja tunelowania programu DragLeave.
PreviewDragOver Wersja tunelowania programu DragOver.
PreviewDrop Wersja tunelowania programu Drop.

Aby obsłużyć zdarzenia przeciągania i upuszczania dla wystąpień obiektu, dodaj programy obsługi dla zdarzeń wymienionych w poprzednich tabelach. Aby obsłużyć zdarzenia przeciągania i upuszczania na poziomie klasy, zastąpij odpowiednie metody virtual On*Event i On*PreviewEvent. Aby uzyskać więcej informacji, zobacz Class Handling of Routed Events by Control Base Classes (Obsługa klas trasowanych według klas bazowych kontrolek).

Implementowanie przeciągania i upuszczania

Element interfejsu użytkownika może być źródłem przeciągania, obiektem docelowym upuszczania lub obydwoma elementami. Aby zaimplementować podstawowe przeciąganie i upuszczanie, napisz kod w celu zainicjowania operacji przeciągania i upuszczania oraz przetwarzania porzuconych danych. Możesz ulepszyć środowisko przeciągania i upuszczania, obsługując opcjonalne zdarzenia przeciągania i upuszczania.

Aby zaimplementować podstawowe przeciąganie i upuszczanie, wykonaj następujące zadania:

  • Zidentyfikuj element, który będzie źródłem przeciągania. Źródło przeciągania może być elementem UIElement lub ContentElement.

  • Utwórz program obsługi zdarzeń w źródle przeciągania, który zainicjuje operację przeciągania i upuszczania. Zdarzenie jest zwykle zdarzeniem MouseMove .

  • W procedurze obsługi zdarzeń źródłowych przeciągania wywołaj metodę DoDragDrop , aby zainicjować operację przeciągania i upuszczania. W wywołaniu DoDragDrop określ źródło przeciągania, dane, które mają być przesyłane, oraz dozwolone efekty.

  • Zidentyfikuj element docelowy. Element docelowy upuszczania może mieć wartość UIElement lub ContentElement.

  • W miejscu docelowym upuszczania ustaw AllowDrop właściwość na true.

  • W miejscu docelowym upuszczania utwórz procedurę Drop obsługi zdarzeń, aby przetworzyć usunięte dane.

  • W procedurze obsługi zdarzeń Drop wyodrębnij dane z obiektu DragEventArgs przy użyciu GetDataPresent metod i GetData .

  • W procedurze obsługi zdarzeń Drop użyj danych, aby wykonać żądaną operację przeciągania i upuszczania.

Implementację przeciągania i upuszczania można ulepszyć, tworząc niestandardową DataObject i obsługą opcjonalnych zdarzeń docelowych przeciągania i upuszczania, jak pokazano w następujących zadaniach:

  • Aby przenieść dane niestandardowe lub wiele elementów danych, utwórz element DataObject , aby przekazać do DoDragDrop metody .

  • Aby wykonać dodatkowe akcje podczas przeciągania, obsłuż zdarzenia DragEnter, DragOveri DragLeave w obiekcie docelowym upuszczania.

  • Aby zmienić wygląd wskaźnika myszy, obsłuż GiveFeedback zdarzenie na źródle przeciągania.

  • Aby zmienić sposób anulowania operacji przeciągania i upuszczania, obsłuż QueryContinueDrag zdarzenie w źródle przeciągania.

Przykład przeciągania i upuszczania

W tej sekcji opisano sposób implementowania przeciągania i upuszczania elementu Ellipse . Obiekt Ellipse jest zarówno źródłem przeciągania, jak i obiektem docelowym upuszczania. Przesłane dane to reprezentacja ciągu właściwości wielokropka Fill . Poniższy kod XAML przedstawia Ellipse element oraz zdarzenia związane z przeciągnięciem i upuszczanie, które obsługuje. Aby uzyskać szczegółowe instrukcje dotyczące implementowania przeciągania i upuszczania, zobacz Przewodnik: włączanie przeciągania i upuszczania w kontrolce użytkownika.

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

Włączanie elementu jako źródła przeciągania

Obiekt, który jest źródłem przeciągania, jest odpowiedzialny za:

  • Identyfikowanie czasu przeciągania.

  • Inicjowanie operacji przeciągania i upuszczania.

  • Identyfikowanie danych, które mają być przesyłane.

  • Określenie efektów, jakie może mieć operacja przeciągania i upuszczania na przesyłanych danych.

Źródło przeciągania może również przekazać użytkownikowi opinię dotyczącą dozwolonych akcji (przenoszenie, kopiowanie, brak) i może anulować operację przeciągania i upuszczania na podstawie dodatkowych danych wejściowych użytkownika, takich jak naciśnięcie klawisza ESC podczas przeciągania.

Aplikacja odpowiada za określenie, kiedy ma miejsce przeciąganie, a następnie zainicjowanie operacji przeciągania i upuszczania przez wywołanie DoDragDrop metody . Zazwyczaj dzieje się tak, gdy MouseMove zdarzenie występuje na elemecie, który ma zostać przeciągnięty, gdy jest naciśnięty przycisk myszy. W poniższym przykładzie pokazano, jak zainicjować operację przeciągania i upuszczania z MouseMove programu obsługi Ellipse zdarzeń elementu w celu utworzenia źródła przeciągania. Przesłane dane to reprezentacja ciągu właściwości wielokropka Fill .

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

Wewnątrz programu obsługi zdarzeń MouseMove wywołaj metodę DoDragDrop , aby zainicjować operację przeciągania i upuszczania. Metoda DoDragDrop przyjmuje trzy parametry:

  • dragSource — odwołanie do obiektu zależności, który jest źródłem przesyłanych danych; jest to zazwyczaj źródło MouseMove zdarzenia.

  • data - Obiekt, który zawiera przesłane dane, opakowany w DataObjectobiekt .

  • allowedEffects - Jedna z DragDropEffects wartości wyliczenia, która określa dozwolone skutki operacji przeciągania i upuszczania.

W parametrze data można przekazać dowolny obiekt z możliwością serializacji. Jeśli dane nie są jeszcze opakowane w obiekcie DataObject, zostaną one automatycznie opakowane w nowy DataObjectelement . Aby przekazać wiele elementów danych, musisz utworzyć DataObject je samodzielnie i przekazać je do DoDragDrop metody . Aby uzyskać więcej informacji, zobacz Data and Data Objects (Obiekty danych i danych).

Parametr allowedEffects służy do określania, co źródło przeciągania pozwoli obiektowi docelowemu upuszczania na przesyłanie danych. Typowe wartości dla źródła przeciągania to Copy, Movei All.

Uwaga

Cel upuszczania jest również w stanie określić, jakie efekty zamierza w odpowiedzi na porzucone dane. Jeśli na przykład obiekt docelowy upuszczania nie rozpoznaje typu danych, który ma zostać porzucony, może odrzucić dane, ustawiając jego dozwolone skutki na Nonewartość . Zazwyczaj wykonuje to w procedurze DragOver obsługi zdarzeń.

Źródło przeciągania może opcjonalnie obsługiwać GiveFeedback zdarzenia i QueryContinueDrag . Te zdarzenia mają domyślne programy obsługi, które są używane, chyba że zdarzenia są oznaczone jako obsługiwane. Zazwyczaj zignoruj te zdarzenia, chyba że trzeba zmienić ich domyślne zachowanie.

Zdarzenie GiveFeedback jest wywoływane w sposób ciągły, gdy źródło przeciągania jest przeciągane. Domyślna procedura obsługi tego zdarzenia sprawdza, czy źródło przeciągania znajduje się nad prawidłowym elementem docelowym upuszczania. Jeśli tak jest, sprawdza dozwolone skutki celu upuszczania. Następnie przekazuje opinię użytkownikowi końcowemu dotyczące dozwolonych efektów upuszczania. Zazwyczaj odbywa się to przez zmianę kursora myszy na kursor bez upuszczania, kopiowania lub przenoszenia kursora. To zdarzenie powinno być obsługiwane tylko wtedy, gdy musisz użyć niestandardowych kursorów, aby przekazać opinię użytkownikowi. Jeśli obsłużysz to zdarzenie, pamiętaj, aby oznaczyć je jako obsługiwane, aby program obsługi domyślnej nie przesłaniał programu obsługi.

Zdarzenie QueryContinueDrag jest wywoływane w sposób ciągły, gdy źródło przeciągania jest przeciągane. To zdarzenie można obsłużyć, aby określić, która akcja kończy operację przeciągania i upuszczania na podstawie stanu klawiszy ESC, SHIFT, CTRL i ALT, a także stanu przycisków myszy. Domyślna procedura obsługi tego zdarzenia anuluje operację przeciągania i upuszczania w przypadku naciśnięcia klawisza ESC i porzuca dane w przypadku zwolnienia przycisku myszy.

Uwaga

Te zdarzenia są ciągle wywoływane podczas operacji przeciągania i upuszczania. W związku z tym należy unikać zadań intensywnie korzystających z zasobów w programach obsługi zdarzeń. Na przykład użyj buforowanego kursora zamiast tworzyć nowy kursor za każdym razem, gdy zdarzenie jest wywoływane GiveFeedback .

Włączanie elementu jako elementu docelowego upuszczania

Obiekt, który jest obiektem docelowym upuszczania, jest odpowiedzialny za:

  • Określenie, że jest to prawidłowy cel upuszczania.

  • Odpowiadanie na źródło przeciągania podczas przeciągania obiektu docelowego.

  • Sprawdzanie, czy przesyłane dane są w formacie, który może odbierać.

  • Przetwarzanie porzuconych danych.

Aby określić, że element jest elementem docelowym upuszczania, należy ustawić jego AllowDrop właściwość na truewartość . Zdarzenia docelowe upuszczania zostaną następnie podniesione na elemecie, aby można było je obsłużyć. Podczas operacji przeciągania i upuszczania następuje następująca sekwencja zdarzeń w obiekcie docelowym upuszczania:

  1. DragEnter

  2. DragOver

  3. DragLeave lub Drop

Zdarzenie DragEnter występuje, gdy dane są przeciągane do granicy miejsca docelowego upuszczania. Zazwyczaj obsługujesz to zdarzenie, aby udostępnić podgląd efektów operacji przeciągania i upuszczania, jeśli jest to odpowiednie dla aplikacji. Nie ustawiaj DragEventArgs.Effects właściwości w DragEnter zdarzeniu, ponieważ zostanie ona zastąpiona DragOver w zdarzeniu.

W poniższym przykładzie przedstawiono procedurę DragEnter obsługi zdarzeń dla Ellipse elementu. Ten kod wyświetla podgląd efektów operacji przeciągania i upuszczania przez zapisanie bieżącego Fill pędzla. Następnie używa GetDataPresent metody , aby sprawdzić, czy DataObject przeciągnięty wielokropek zawiera dane ciągów, które można przekonwertować na Brush. Jeśli tak, dane są wyodrębniane przy użyciu GetData metody . Następnie jest konwertowany na element Brush i stosowany do wielokropka. Zmiana zostanie przywrócona w procedurze obsługi zdarzeń DragLeave . Jeśli nie można przekonwertować danych na element , nie jest wykonywana żadna Brushakcja.

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

Zdarzenie DragOver występuje w sposób ciągły, gdy dane są przeciągane przez miejsce docelowe upuszczania. To zdarzenie jest sparowane ze GiveFeedback zdarzeniem w źródle przeciągania. W procedurze DragOver obsługi zdarzeń zazwyczaj używa GetDataPresent się metod i GetData , aby sprawdzić, czy przesyłane dane są w formacie, który może przetwarzać obiekt docelowy. Można również sprawdzić, czy są naciskane jakiekolwiek klawisze modyfikujące, co zwykle wskazuje, czy użytkownik zamierza przenieść, czy akcję kopiowania. Po wykonaniu DragEventArgs.Effects tych testów należy ustawić właściwość, aby powiadomić źródło przeciągania, jaki będzie efekt upuszczania danych. Źródło przeciągania odbiera te informacje w GiveFeedback args zdarzenia i może ustawić odpowiedni kursor, aby przekazać opinię użytkownikowi.

W poniższym przykładzie przedstawiono procedurę DragOver obsługi zdarzeń dla Ellipse elementu. Ten kod sprawdza, czy DataObject przeciągnięty wielokropek zawiera dane ciągów, które można przekonwertować na Brushelement . Jeśli tak, ustawia DragEventArgs.Effects właściwość na Copy. Wskazuje to na źródło przeciągania, że dane można skopiować do wielokropka. Jeśli nie można przekonwertować danych na Brushobiekt , właściwość jest ustawiona DragEventArgs.Effects na Nonewartość . Wskazuje to źródło przeciągania, że wielokropek nie jest prawidłowym elementem docelowym upuszczania danych.

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

Zdarzenie DragLeave występuje, gdy dane są przeciągane z granicy obiektu docelowego bez porzucania. To zdarzenie jest obsługiwane w celu cofnięcia wszystkiego, co zrobiliśmy w procedurze obsługi zdarzeń DragEnter .

W poniższym przykładzie przedstawiono procedurę DragLeave obsługi zdarzeń dla Ellipse elementu. Ten kod cofa podgląd wykonywany w procedurze DragEnter obsługi zdarzeń przez zastosowanie zapisanego Brush w wielokropka.

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

Zdarzenie Drop występuje, gdy dane są porzucane przez miejsce docelowe upuszczania. Domyślnie dzieje się tak, gdy przycisk myszy zostanie zwolniony. W procedurze Drop obsługi zdarzeń użyjesz GetData metody w celu wyodrębnienia przesłanych danych z obiektu DataObject i wykonania dowolnego przetwarzania danych wymaganego przez aplikację. Zdarzenie Drop kończy operację przeciągania i upuszczania.

W poniższym przykładzie przedstawiono procedurę Drop obsługi zdarzeń dla Ellipse elementu. Ten kod stosuje efekty operacji przeciągania i upuszczania i jest podobny do kodu w procedurze obsługi zdarzeń DragEnter . Sprawdza, czy DataObject przeciągnięty wielokropek zawiera dane ciągów, które można przekonwertować na Brushelement . Jeśli tak, Brush element jest stosowany do wielokropka. Jeśli nie można przekonwertować danych na element , nie jest wykonywana żadna Brushakcja.

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

Zobacz też