Omówienie przeciągania i upuszczania
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 cel upuszczania, który odbiera upuszczony obiekt. Elementy źródłowe i docelowe przeciągania i upuszczania mogą być elementami interfejsu użytkownika w tej samej aplikacji lub w 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 pamięci masowej przenosi pliki domyślnie, podczas gdy przeciąganie plików z udziału UNC (Universal Naming Convention) do folderu lokalnego domyślnie kopiuje pliki.
Funkcje przeciągania i upuszczania udostępniane przez WPF są zaprojektowane tak, aby zapewnić wysoką elastyczność i możliwość dostosowania do 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 każdy UIElement lub ContentElement może uczestniczyć w operacji przeciągania i upuszczania. Zdarzenia i metody wymagane do operacji przeciągania i upuszczania są definiowane w klasie DragDrop. Klasy UIElement i ContentElement zawierają aliasy dla zdarzeń dołączonych przez DragDrop, aby zdarzenia mogły się pojawiać na liście składowych klasy, gdy UIElement lub ContentElement jest dziedziczone jako element bazowy. Procedury obsługi zdarzeń dołączone do tych zdarzeń są dołączane do podstawowego dołączonego zdarzenia DragDrop i odbierają ten sam egzemplarz danych zdarzenia. Aby uzyskać więcej informacji, zobacz zdarzenie UIElement.Drop.
Ważny
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 stosuje się mechanizm DataObject do przechowywania danych. Koncepcyjnie obiekt danych składa się z co najmniej jednej pary Object zawierającej rzeczywiste dane oraz odpowiadający mu identyfikator 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 DataObject w razie potrzeby. Aby uzyskać większą kontrolę nad formatem danych, możesz opakowować dane w DataObject przed przekazaniem ich do metody DoDragDrop. Obiekt docelowy upuszczania jest odpowiedzialny za wyodrębnienie danych z DataObject. Aby uzyskać więcej informacji na temat pracy z obiektami danych, zobacz Data and Data Objects.
Ź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 wyliczenie DragDropEffects, które można użyć do określenia efektu operacji przeciągnij-i-upuść. W źródle przeciągania można określić efekty dozwolone przez źródło w metodzie DoDragDrop. W obiekcie docelowym upuszczania można określić efekt, jaki cel zamierza w Effects właściwości klasy DragEventArgs. Gdy cel upuszczania określa zamierzony efekt w zdarzeniu DragOver, informacje te są przekazywane z powrotem do źródła przeciągania w zdarzeniu GiveFeedback. Źródło przeciągania używa tych informacji, aby poinformować użytkownika, jaki wpływ na dane zamierza mieć cel upuszczenia. Gdy dane zostaną porzucone, cel upuszczania określa jego rzeczywisty efekt w zdarzeniu Drop. Te informacje są przekazywane z powrotem do źródła przeciągania jako wartość zwracana przez metodę DoDragDrop. Jeśli obszar docelowy zwraca efekt, który nie znajduje się na liście źródeł przeciągania allowedEffects
, operacja przeciągania i upuszczania zostanie anulowana bez transferu danych.
Należy pamiętać, że w WPF wartości DragDropEffects są używane tylko do umożliwienia komunikacji między źródłem przeciągania a celem upuszczania w odniesieniu do skutków operacji przeciągania i upuszczania. Rzeczywisty wpływ operacji przeciągania i upuszczania zależy od tego, czy napiszesz odpowiedni kod w aplikacji.
Na przykład docelowy obiekt drop może określać, że efekt upuszczania danych na niego 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 klasie DragDrop. Aby uzyskać więcej informacji na temat dołączonych zdarzeń, zobacz Dołączone zdarzenia — omówienie.
Przeciągnij zdarzenia źródłowe
Zdarzenie | Streszczenie |
---|---|
GiveFeedback | To zdarzenie występuje w sposób ciągły podczas operacji przeciągania i upuszczania oraz umożliwia źródłu przeciągania przekazywanie informacji zwrotnej użytkownikowi. Informacja zwrotna jest często przekazywana przez zmianę wyglądu wskaźnika myszy, aby wskazać efekty dozwolone przez cel przeciągania i upuszczania. To jest pełne życia wydarzenie. |
QueryContinueDrag | To zdarzenie występuje, gdy podczas operacji przeciągania i upuszczania następuje zmiana stanów klawiszy lub przycisków myszy i umożliwia źródło przeciągania anulowanie operacji przeciągania i upuszczania w zależności od tych stanów. To jest pełne życia wydarzenie. |
PreviewGiveFeedback | Wersja z tunelowaniem GiveFeedback. |
PreviewQueryContinueDrag | Wersja z tunelowaniem QueryContinueDrag. |
Usuwanie zdarzeń docelowych
Zdarzenie | Streszczenie |
---|---|
DragEnter | To zdarzenie występuje, gdy obiekt jest przeciągany do granicy obiektu docelowego upuszczania. To jest pełne życia wydarzenie. |
DragLeave | To zdarzenie występuje, gdy obiekt jest przeciągany poza granicę celu upuszczania. To jest pełne życia wydarzenie. |
DragOver | To zdarzenie występuje w sposób ciągły, gdy obiekt jest przeciągany lub przenoszony w granicach obszaru docelowego upuszczania. To jest pełne życia wydarzenie. |
Drop | To zdarzenie występuje, gdy obiekt zostanie porzucony w obiekcie docelowym upuszczania. To jest pełne życia wydarzenie. |
PreviewDragEnter | Wersja z tunelowaniem DragEnter. |
PreviewDragLeave | Wersja z tunelowaniem DragLeave. |
PreviewDragOver | Wersja z tunelowaniem DragOver. |
PreviewDrop | Wersja z tunelowaniem 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 Obsługa zdarzeń kierowanych przez klasy bazowe kontrolek.
Implementowanie przeciągania i upuszczania
Element interfejsu użytkownika może być źródłem przeciągania, miejscem docelowym upuszczania lub oba jednocześnie. Aby zaimplementować podstawowe przeciąganie i upuszczanie, napisz kod w celu zainicjowania operacji przeciągania i upuszczania oraz przetwarzania porzuconych danych. Możesz ulepszyć doświadczenie przeciągania i upuszczania, poprzez obsługę opcjonalnych zdarzeń 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ć UIElement lub ContentElement.
Utwórz program obsługi zdarzeń w źródle przeciągania, który zainicjuje operację przeciągania i upuszczania. Zazwyczaj jest to zdarzenie MouseMove.
W procedurze obsługi zdarzeń źródła 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, który będzie celem upuszczania. Obiekt docelowy upuszczania może być UIElement lub ContentElement.
W obiekcie docelowym upuszczania ustaw właściwość AllowDrop na
true
.W miejscu docelowym upuszczania utwórz procedurę obsługi zdarzeń Drop w celu przetworzenia opuszczonych danych.
W procedurze obsługi zdarzeń Drop wyodrębnij dane z DragEventArgs przy użyciu metod GetDataPresent 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 niestandardowy DataObject i obsługując opcjonalne zdarzenia źródłowe i docelowe upuszczania, jak pokazano w następujących zadaniach:
Aby przenieść dane niestandardowe lub wiele elementów danych, utwórz DataObject do przekazania do metody DoDragDrop.
Aby wykonać dodatkowe akcje podczas przeciągania, obsłuż zdarzenia DragEnter, DragOveri DragLeave na elemencie docelowym upuszczania.
Aby zmienić wygląd wskaźnika myszy, obsłuż zdarzenie GiveFeedback na źródle przeciągania.
Aby zmienić sposób, w jaki operacja przeciągania i upuszczania jest anulowana, obsłuż zdarzenie QueryContinueDrag na źródle przeciągania.
Przykład funkcji przeciągnij i upuść
W tej sekcji opisano sposób implementowania przeciągania i upuszczania elementu Ellipse. Ellipse jest zarówno źródłem przeciągania, jak i miejscem docelowym. Przesłane dane to tekstowa reprezentacja właściwości Fill elipsy. Poniższy kod XAML przedstawia element Ellipse oraz zdarzenia związane z przeciąganiem i upuszczaniem, 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" />
Umożliwianie elementowi bycia źródłem przeciągania
Obiekt, który jest źródłem przeciągania, jest odpowiedzialny za:
Identyfikowanie momentu, gdy następuje przeciąganie.
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 ESC podczas przeciągania.
Aplikacja jest odpowiedzialna za określenie, kiedy ma miejsce przeciąganie, a następnie zainicjowanie operacji przeciągania i upuszczania przez wywołanie metody DoDragDrop. Zazwyczaj dzieje się tak, gdy zdarzenie MouseMove występuje nad elementem, który ma zostać przeciągnięty, podczas gdy jest naciśnięty przycisk myszy. W poniższym przykładzie pokazano, jak zainicjować operację przeciągania i upuszczania z programu obsługi zdarzeń MouseMove elementu Ellipse, aby uczynić go źródłem przeciągania. Przesłane dane to tekstowa reprezentacja właściwości Fill 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
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 zdarzenia MouseMove.data
— obiekt, który zawiera przesłane dane, opakowany w DataObject.allowedEffects
— jedna z wartości wyliczenia DragDropEffects, która określa dozwolone efekty operacji przeciągania i upuszczania.
Każdy obiekt z możliwością serializacji można przekazać w parametrze data
. Jeśli dane nie są jeszcze opakowane w DataObject, zostaną one automatycznie opakowane w nowe DataObject. Aby przekazać wiele elementów danych, musisz samodzielnie utworzyć DataObject i przekazać ją do metody DoDragDrop. Aby uzyskać więcej informacji, zobacz Dane i Obiekty Danych.
Parametr allowedEffects
służy do określenia, co źródło przeciągania pozwoli obiektowi docelowemu zrobić z przesyłanymi danymi. Typowe wartości źródła przeciągania to Copy, Movei All.
Notatka
Cel upuszczania może również określić, jakie efekty zamierza w odpowiedzi na upuszczone dane. Jeśli na przykład obiekt docelowy nie rozpoznaje typu danych, który ma zostać upuszczony, może odmówić przyjęcia danych, ustawiając dozwolone efekty na None. Zazwyczaj wykonuje to w programie obsługi zdarzeń DragOver.
Źródło przeciągania może opcjonalnie obsługiwać zdarzenia GiveFeedback i QueryContinueDrag. Te zdarzenia mają domyślne programy obsługi, które są używane, chyba że oznaczysz zdarzenia jako obsługiwane. Zazwyczaj zignoruj te zdarzenia, chyba że trzeba zmienić ich domyślne zachowanie.
Zdarzenie GiveFeedback jest stale wywoływane, 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 poprawnym miejscem docelowego upuszczenia. 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łużone, aby program domyślnej obsługi nie nadpisywał Twojej obsługi.
Zdarzenie QueryContinueDrag jest stale wywoływane, 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 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 ESC i porzuca dane w przypadku zwolnienia przycisku myszy.
Ostrożność
Tego typu zdarzenia są nieprzerwanie 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 jest wywoływane zdarzenie GiveFeedback.
Umożliwienie elementowi bycia celem upuszczania
Obiekt, który jest obiektem docelowym upuszczania, jest odpowiedzialny za:
Określenie, że jest to prawidłowe miejsce docelowe dla upuszczania.
Odpowiadanie na źródło przeciągania, gdy przeciąga się nad obiektem docelowym.
Sprawdzanie, czy przesyłane dane są w formacie, który może odbierać.
Przetwarzanie porzuconych danych.
Aby określić, że element jest obiektem docelowym upuszczania, należy ustawić jego właściwość AllowDrop na true
. Zdarzenia upuszczania docelowego zostaną następnie wywołane w elemencie, aby można było je obsłużyć.
Kiedy oceniany jest cel upuszczania, wykonywany jest test trafienia, aby określić, czy kursor znajduje się nad wizualną reprezentacją elementu. Niektóre elementy sterujące, takie jak Canvas, nie mają reprezentacji wizualnej i nie mogą być używane jako miejsce docelowe dla przeciągania i upuszczania, chyba że zostanie dodana reprezentacja wizualna. Ustaw właściwość Canvas.Background
na dowolny kolor, aby utworzyć wizualizację wypełniającą Canvas
kolorem. Aby zachować przezroczystość Canvas
, ale włączyć je jako miejsce docelowe dla upuszczania, ustaw właściwość Background
na wartość Transparent
.
Podczas operacji przeciągania i upuszczania następuje następująca sekwencja zdarzeń w obiekcie docelowym upuszczania:
Zdarzenie DragEnter występuje, gdy dane są przeciągnięte do granicy obiektu docelowego. 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 należy ustawiać właściwości DragEventArgs.Effects w zdarzeniu DragEnter, ponieważ zostanie ona zastąpiona w zdarzeniu DragOver.
W poniższym przykładzie przedstawiono procedurę obsługi zdarzeń DragEnter dla elementu Ellipse. Ten kod wyświetla podgląd efektów operacji przeciągania i upuszczania przez uprzednie zapisanie bieżącego pędzla Fill. Następnie używa metody GetDataPresent, aby sprawdzić, czy DataObject przeciągnięty na elipsę zawiera dane tekstowe, które można przekonwertować na Brush. Jeśli tak, dane są wyodrębniane przy użyciu metody GetData. Następnie jest konwertowany na Brush i zastosowany na elipsie. Zmiana jest przywracana w procedurze obsługi zdarzeń DragLeave. Jeśli nie można przekonwertować danych na Brush, nie jest wykonywana żadna akcja.
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 zdarzeniem GiveFeedback na źródle przeciągania. W programie obsługi zdarzeń DragOver zazwyczaj używa się metod GetDataPresent i GetData w celu sprawdzenia, 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 zazwyczaj wskazuje, czy użytkownik zamierza przenieść lub skopiować dane. Po wykonaniu tych testów należy ustawić właściwość DragEventArgs.Effects, aby powiadomić źródło przeciągania, jaki będzie efekt upuszczania danych. Źródło przeciągania odbiera te informacje w argumentach zdarzenia GiveFeedback i może ustawić odpowiedni kursor, aby przekazać użytkownikowi informację zwrotną.
W poniższym przykładzie przedstawiono procedurę obsługi zdarzeń DragOver dla elementu Ellipse. Ten kod sprawdza, czy DataObject przeciągnięty przez wielokropek zawiera dane ciągów, które można przekonwertować na Brush. Jeśli tak, ustawia właściwość DragEventArgs.Effects na Copy. To wskazuje źródłu przeciągania, że dane można skopiować do elipsy. Jeśli nie można przekonwertować danych na Brush, właściwość DragEventArgs.Effects jest ustawiona na wartość None. Wskazuje to źródłu przeciągania, że elipsa nie jest prawidłowym miejscem docelowym dla 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 programie obsługi zdarzeń DragEnter.
W poniższym przykładzie przedstawiono procedurę obsługi zdarzeń DragLeave dla elementu Ellipse. Ten kod cofa podgląd wykonany w obsłudze zdarzenia DragEnter, stosując zapisane Brush do elipsy.
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 po zwolnieniu przycisku myszy. W procedurze obsługi zdarzeń Drop należy użyć metody GetData w celu wyodrębnienia przesłanych danych z 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ę obsługi zdarzeń Drop dla elementu Ellipse. Ten kod stosuje efekty operacji przeciągania i upuszczania i jest podobny do kodu w procedurze obsługi zdarzenia DragEnter. Sprawdza, czy DataObject przeciągnięty przez wielokropek zawiera dane ciągów, które można przekonwertować na Brush. Jeśli tak, Brush jest stosowany do elipsy. Jeśli nie można przekonwertować danych na Brush, nie jest wykonywana żadna akcja.
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ż
- Clipboard
- przewodnik : włączanie przeciągania i upuszczania na kontrolki użytkownika
- Tematy poradnikowe
- przeciąganie i upuszczanie
.NET Desktop feedback