czwartek, 3 stycznia 2013

70-511 Rozdział 10 - Drag & Drop

Drag & Drop - przeciągnij i upuść pozwala na wykonywanie określonych operacji w graficznym interfejsie za pomocą myszki.
Proces ten, oparty jest na zdarzeniach. Opis dla elementu źródłowego jak i docelowego:
Element źródłowy:
  • MouseDown - w zdarzeniu tym wywołujemy metodę DoDragDrop
  • GiveFeedBack - daje możliwość zmiany wyglądu kursora myszy
  • QueryContinueDrag - możliwość anulowania przeciągania
Element docelowy:
  • DragEnter - zdarzenie wywoływane, w momencie, gdy kontrolka daje możliwość upuszczenia danych
  • DragOver - wywoływane gdy dane znajdują się nad kontrolką docelową
  • DragDrop - w momencie puszczenia przycisku myszy
  • DragLeave - wywoływane gdy myszka opuszcza kontrolkę docelową
Kolejność wywoływanych zdarzeń podczas operacji przeciągnij i upuść (opis dla Windows Forms, wersja dla WPF w nawiasach):
  1. Operacja zaczyna się od wywołania metody DoDragDrop (DragDrop.DoDragDrop) na kontrolce źródłowej. Metoda ta najczęściej jest wywoływana w zdarzeniu MouseDown - kopiowane są dane, oraz ustawiane zachowanie dla skopiowanych danych.
  2. Zostają wywołane zdarzenia GiveFeedBack oraz QueryContinueDrag. Pierwsze zdarzenie umożliwia zmianę wizerunku kursora myszy, drugie mówi o tym czy przenoszenie ma być kontynuowane czy też przerwane. 
  3. Kursor myszy zostaje przesunięty nad kontrolkę docelową. Każda kontrolka, która ma ustawioną flagę AllowDrop, jest potencjalnym elementem do "umieszczenia" danych. Zostaje w tym momencie wywołane zdarzenie DragEnter. Możemy w tym momencie zdecydować czy odebrać dane, czy też odrzucić. 
  4. Użytkownik puszcza przycisk myszy. Zostaje wywołane zdarzenie DragDrop, w którym możemy zdecydować co zrobimy z "przyniesionymi" danymi.
Możliwe tryby przenoszenia (DragDropEffects):
  • All - dane są kopiowane, usuwane z źródła i umieszczane w kontrolce docelowej
  • Copy - dane są kopiowane do celu
  • Link - dane są podlinkowywane do celu
  • Move - dane zostaną przeniesione do celu
  • None - cel nie przyjmie danych
  • Scroll - przewijanie w kontrolce docelowej
Przykładowa implementacja Drag & Drop:

Code:
        private void TbSource_OnMouseDown(object sender, MouseButtonEventArgs e)
        {
            DragDrop.DoDragDrop(tbSource, tbSource.Text, DragDropEffects.Copy);
        }

        private void TvDestination_OnDragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.Text))
            {
                e.Effects = DragDropEffects.Copy;
            }
        }

        private void TvDestination_OnDrop(object sender, DragEventArgs e)
        {
            var position = e.GetPosition(tvDestination);
            var textBlock = tvDestination.InputHitTest(position);
            var data = e.Data.GetData(DataFormats.Text);
            if (textBlock != null && textBlock is TextBlock)
            {
                var node = (TreeViewItem)GetParentByType((Visual)textBlock, typeof(TreeViewItem));
                node.Items.Add(data);
            }
            else
            {
                tvDestination.Items.Add(data);
            }
        }

        public Visual GetParentByType(Visual startPoint, Type searchingType)
        {
            while (startPoint.GetType() != searchingType)
            {
                startPoint = (Visual)VisualTreeHelper.GetParent(startPoint);
            }

            return startPoint;
        }


Efekt:



Drag & Drop pomiędzy aplikacjami .NET jest wspierane przez system. Jedynymi wymogami są:
  • Kontrolka docelowa musi pozwalać na efekt ustawiony w metodzie DoDragDrop
  • Kontrolka docelowa musi akceptować format danych ustawiony w metodzie DoDragDrop


Kod do pobrania: http://sdrv.ms/TjCDz3

Brak komentarzy:

Prześlij komentarz