Control.DragOver Zdarzenie
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Występuje, gdy obiekt jest przeciągany przez granice kontrolki.
public:
event System::Windows::Forms::DragEventHandler ^ DragOver;
public event System.Windows.Forms.DragEventHandler DragOver;
public event System.Windows.Forms.DragEventHandler? DragOver;
member this.DragOver : System.Windows.Forms.DragEventHandler
Public Custom Event DragOver As DragEventHandler
Typ zdarzenia
Przykłady
Poniższy przykład kodu przedstawia operację przeciągania i upuszczania między dwoma ListBox kontrolkami. Przykład wywołuje metodę DoDragDrop po uruchomieniu akcji przeciągania. Akcja przeciągania rozpoczyna się, jeśli mysz przeniosła się więcej niż SystemInformation.DragSize z lokalizacji myszy podczas MouseDown zdarzenia. Metoda IndexFromPoint służy do określania indeksu elementu do przeciągania podczas MouseDown
zdarzenia.
W przykładzie pokazano również użycie niestandardowych kursorów dla operacji przeciągania i upuszczania. Przykład wymaga, aby dwa pliki 3dwarro.cur
kursorów i 3dwno.cur
, istniały w katalogu aplikacji, odpowiednio dla niestandardowego przeciągania i nie upuszczania kursorów. Niestandardowe kursory będą używane, jeśli UseCustomCursorsCheck
CheckBox jest zaznaczone. Niestandardowe kursory są ustawiane w procedurze obsługi zdarzeń GiveFeedback .
Stan klawiatury jest oceniany w procedurze DragOver obsługi zdarzeń po prawej stronie ListBox
, aby określić, jaka operacja przeciągania będzie oparta na stanie klawiszy SHIFT, CTRL, ALT lub CTRL+ALT. Lokalizacja, w ListBox
której wystąpi spadek, jest również określana podczas DragOver
zdarzenia. Jeśli dane do upuszczania nie są wartością String
, DragEventArgs.Effect parametr jest ustawiony na None
wartość .DragDropEffects Na koniec stan upuszczania jest wyświetlany w elemecie DropLocationLabel
Label.
Dane do upuszczania po prawej stronie ListBox
są określane w DragDrop procedurze obsługi zdarzeń, a String
wartość jest dodawana w odpowiednim miejscu w obiekcie ListBox
. Jeśli operacja przeciągania przesuwa się poza granice formularza, operacja przeciągania i upuszczania zostanie anulowana w procedurze obsługi zdarzeń QueryContinueDrag .
Ten fragment kodu pokazuje użycie DragOver zdarzenia. Zobacz metodę DoDragDrop kompletnego przykładu kodu.
void ListDragTarget_DragOver( Object^ /*sender*/, System::Windows::Forms::DragEventArgs^ e )
{
// Determine whether string data exists in the drop data. If not, then
// the drop effect reflects that the drop cannot occur.
if ( !e->Data->GetDataPresent( System::String::typeid ) )
{
e->Effect = DragDropEffects::None;
DropLocationLabel->Text = "None - no string data.";
return;
}
// Set the effect based upon the KeyState.
if ( (e->KeyState & (8 + 32)) == (8 + 32) && ((e->AllowedEffect & DragDropEffects::Link) == DragDropEffects::Link) )
{
// KeyState 8 + 32 = CTRL + ALT
// Link drag-and-drop effect.
e->Effect = DragDropEffects::Link;
}
else
if ( (e->KeyState & 32) == 32 && ((e->AllowedEffect & DragDropEffects::Link) == DragDropEffects::Link) )
{
// ALT KeyState for link.
e->Effect = DragDropEffects::Link;
}
else
if ( (e->KeyState & 4) == 4 && ((e->AllowedEffect & DragDropEffects::Move) == DragDropEffects::Move) )
{
// SHIFT KeyState for move.
e->Effect = DragDropEffects::Move;
}
else
if ( (e->KeyState & 8) == 8 && ((e->AllowedEffect & DragDropEffects::Copy) == DragDropEffects::Copy) )
{
// CTRL KeyState for copy.
e->Effect = DragDropEffects::Copy;
}
else
if ( (e->AllowedEffect & DragDropEffects::Move) == DragDropEffects::Move )
{
// By default, the drop action should be move, if allowed.
e->Effect = DragDropEffects::Move;
}
else
e->Effect = DragDropEffects::None;
// Get the index of the item the mouse is below.
// The mouse locations are relative to the screen, so they must be
// converted to client coordinates.
indexOfItemUnderMouseToDrop = ListDragTarget->IndexFromPoint( ListDragTarget->PointToClient( Point(e->X,e->Y) ) );
// Updates the label text.
if ( indexOfItemUnderMouseToDrop != ListBox::NoMatches )
{
DropLocationLabel->Text = String::Concat( "Drops before item # ", (indexOfItemUnderMouseToDrop + 1) );
}
else
DropLocationLabel->Text = "Drops at the end.";
}
private void ListDragTarget_DragOver(object sender, DragEventArgs e)
{
// Determine whether string data exists in the drop data. If not, then
// the drop effect reflects that the drop cannot occur.
if (!e.Data.GetDataPresent(typeof(System.String)))
{
e.Effect = DragDropEffects.None;
DropLocationLabel.Text = "None - no string data.";
return;
}
// Set the effect based upon the KeyState.
if ((e.KeyState & (8 + 32)) == (8 + 32) &&
(e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link)
{
// KeyState 8 + 32 = CTRL + ALT
// Link drag-and-drop effect.
e.Effect = DragDropEffects.Link;
}
else if ((e.KeyState & 32) == 32 &&
(e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link)
{
// ALT KeyState for link.
e.Effect = DragDropEffects.Link;
}
else if ((e.KeyState & 4) == 4 &&
(e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move)
{
// SHIFT KeyState for move.
e.Effect = DragDropEffects.Move;
}
else if ((e.KeyState & 8) == 8 &&
(e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy)
{
// CTRL KeyState for copy.
e.Effect = DragDropEffects.Copy;
}
else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move)
{
// By default, the drop action should be move, if allowed.
e.Effect = DragDropEffects.Move;
}
else
{
e.Effect = DragDropEffects.None;
}
// Get the index of the item the mouse is below.
// The mouse locations are relative to the screen, so they must be
// converted to client coordinates.
indexOfItemUnderMouseToDrop =
ListDragTarget.IndexFromPoint(ListDragTarget.PointToClient(new Point(e.X, e.Y)));
// Updates the label text.
if (indexOfItemUnderMouseToDrop != ListBox.NoMatches)
{
DropLocationLabel.Text = "Drops before item #" + (indexOfItemUnderMouseToDrop + 1);
}
else
{
DropLocationLabel.Text = "Drops at the end.";
}
}
Private Sub ListDragTarget_DragOver(ByVal sender As Object, ByVal e As DragEventArgs) Handles ListDragTarget.DragOver
' Determine whether string data exists in the drop data. If not, then
' the drop effect reflects that the drop cannot occur.
If Not (e.Data.GetDataPresent(GetType(System.String))) Then
e.Effect = DragDropEffects.None
DropLocationLabel.Text = "None - no string data."
Return
End If
' Set the effect based upon the KeyState.
If ((e.KeyState And (8 + 32)) = (8 + 32) And
(e.AllowedEffect And DragDropEffects.Link) = DragDropEffects.Link) Then
' KeyState 8 + 32 = CTRL + ALT
' Link drag-and-drop effect.
e.Effect = DragDropEffects.Link
ElseIf ((e.KeyState And 32) = 32 And
(e.AllowedEffect And DragDropEffects.Link) = DragDropEffects.Link) Then
' ALT KeyState for link.
e.Effect = DragDropEffects.Link
ElseIf ((e.KeyState And 4) = 4 And
(e.AllowedEffect And DragDropEffects.Move) = DragDropEffects.Move) Then
' SHIFT KeyState for move.
e.Effect = DragDropEffects.Move
ElseIf ((e.KeyState And 8) = 8 And
(e.AllowedEffect And DragDropEffects.Copy) = DragDropEffects.Copy) Then
' CTRL KeyState for copy.
e.Effect = DragDropEffects.Copy
ElseIf ((e.AllowedEffect And DragDropEffects.Move) = DragDropEffects.Move) Then
' By default, the drop action should be move, if allowed.
e.Effect = DragDropEffects.Move
Else
e.Effect = DragDropEffects.None
End If
' Gets the index of the item the mouse is below.
' The mouse locations are relative to the screen, so they must be
' converted to client coordinates.
indexOfItemUnderMouseToDrop =
ListDragTarget.IndexFromPoint(ListDragTarget.PointToClient(New Point(e.X, e.Y)))
' Updates the label text.
If (indexOfItemUnderMouseToDrop <> ListBox.NoMatches) Then
DropLocationLabel.Text = "Drops before item #" & (indexOfItemUnderMouseToDrop + 1)
Else
DropLocationLabel.Text = "Drops at the end."
End If
End Sub
Uwagi
Zdarzenie DragOver jest wywoływane, gdy kursor myszy przesuwa się w granicach kontrolki podczas operacji przeciągania i upuszczania.
Poniżej opisano, jak i kiedy są wywoływane zdarzenia związane z operacjami przeciągania i upuszczania.
Metoda DoDragDrop określa kontrolkę pod bieżącą lokalizacją kursora. Następnie sprawdza, czy kontrolka jest prawidłowym celem upuszczania.
Jeśli kontrolka jest prawidłowym elementem docelowym upuszczania, GiveFeedback zdarzenie jest wywoływane z określonym efektem przeciągania i upuszczania. Aby uzyskać listę efektów przeciągania i upuszczania, zobacz wyliczenie DragDropEffects .
Zmiany położenia kursora myszy, stanu klawiatury i stanu przycisku myszy są śledzone.
Jeśli użytkownik zostanie przeniesiony z okna, DragLeave zdarzenie zostanie podniesione.
Jeśli mysz wprowadzi inną kontrolkę, zostanie podniesiona kontrolka DragEnter dla tej kontrolki.
Jeśli mysz porusza się, ale pozostaje w tej samej kontrolce, DragOver zdarzenie zostanie podniesione.
Jeśli istnieje zmiana stanu klawiatury lub przycisku myszy, QueryContinueDrag zdarzenie jest wywoływane i określa, czy kontynuować przeciąganie, upuszczać dane, czy anulować operację na podstawie wartości Action właściwości zdarzenia QueryContinueDragEventArgs.
Jeśli wartość wartości DragAction to
Continue
, DragOver zdarzenie jest wywoływane, aby kontynuować operację, a GiveFeedback zdarzenie jest wywoływane z nowym efektem, aby można było ustawić odpowiednią opinię wizualną. Aby uzyskać listę prawidłowych efektów upuszczania, zobacz wyliczenie DragDropEffects .Uwaga
Zdarzenia DragOver i GiveFeedback są sparowane tak, aby gdy mysz przesuwa się przez cel upuszczania, użytkownik otrzymuje najbardziej aktualne opinie na temat położenia myszy.
Jeśli wartość DragAction to
Drop
, wartość efektu upuszczania jest zwracana do źródła, aby aplikacja źródłowa mogła wykonać odpowiednią operację na danych źródłowych, na przykład wyciąć dane, jeśli operacja została przeniesiona.Jeśli wartość DragAction to
Cancel
, DragLeave zdarzenie jest zgłaszane.Uwaga
Właściwości XDragEventArgs i Y znajdują się we współrzędnych ekranu, a nie współrzędnych klienta. Następujący wiersz kodu w języku C# konwertuje właściwości na klienta Point:
Punkt clientPoint = targetControl.PointToClient(new Point(de. X, de. Y));
Aby uzyskać więcej informacji na temat obsługi zdarzeń, zobacz Obsługa i podnoszenie zdarzeń.
Dotyczy
Zobacz też
Opinia
https://aka.ms/ContentUserFeedback.
Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see:Prześlij i wyświetl opinię dla