Aracılığıyla paylaş


Sürükle ve Bırak'a Genel Bakış

Bu konu, Windows Presentation Foundation (WPF) uygulamalarında sürükle ve bırak desteğine genel bir bakış sağlar. Sürükle ve bırak genellikle bir veya daha fazla nesne seçmek için fare (veya başka bir işaret cihazı) kullanmayı, bu nesneleri kullanıcı arabiriminde (UI) istenen bırakma hedefinin üzerine sürüklemeyi ve bırakmayı içeren bir veri aktarımı yöntemini ifade eder.

WPF'de Sürükle ve Bırak Desteği

Sürükle ve bırak işlemleri genellikle iki taraf içerir: sürüklenen nesnenin kaynaklandığı bir sürükleme kaynağı ve bırakılan nesneyi alan bir bırakma hedefi. Sürükleme kaynağı ve bırakma hedefi aynı uygulamadaki kullanıcı arabirimi öğeleri veya farklı bir uygulama olabilir.

Sürükle ve bırak ile değiştirilebilen nesnelerin türü ve sayısı tamamen rastgeledir. Örneğin dosyalar, klasörler ve içerik seçimleri, sürükle ve bırak işlemleriyle işlenen daha yaygın nesnelerden bazılarıdır.

Sürükle ve bırak işlemi sırasında gerçekleştirilen belirli eylemler uygulamaya özgü olup genellikle bağlama göre belirlenir. Örneğin, bir dosya seçimini aynı depolama cihazındaki bir klasörden diğerine sürüklemek dosyaları varsayılan olarak taşırken, dosyaları Evrensel Adlandırma Kuralı (UNC) paylaşımından yerel bir klasöre sürüklemek dosyaları varsayılan olarak kopyalar.

WPF tarafından sağlanan sürükle ve bırak özellikleri, çok çeşitli sürükle ve bırak senaryolarını destekleyecek şekilde son derece esnek ve özelleştirilebilir olacak şekilde tasarlanmıştır. Sürükleyip bırakma, nesneleri tek bir uygulama içinde veya farklı uygulamalar arasında düzenlemeyi destekler. WPF uygulamaları ve diğer Windows uygulamaları arasında sürükleyip bırakma işlemi de tam olarak desteklenir.

WPF'de, herhangi bir UIElement veya ContentElement sürükle ve bırak işlemine katılabilir. Sürükle ve bırak işlemleri için gereken olaylar ve yöntemler DragDrop sınıfında tanımlanır. UIElement ve ContentElement sınıfları, DragDrop veya UIElement temel öğe olarak devralındığında, ekli ContentElement olaylarının sınıf üyeleri listesinde görünmesi için bu olaylar için diğer adlar içerir. Bu olaylara eklenen olay işleyicileri, temeldeki DragDrop ekli olaya bağlanır ve aynı olay veri örneğini alır. Daha fazla bilgi için UIElement.Drop olayına bakın.

Önemli

OLE sürükle ve bırak, İnternet bölgesindeyken çalışmaz.

Veri Aktarımı

Sürükle ve bırak, veri aktarımının daha genel bir alanının bir parçasıdır. Veri aktarımı sürükle ve bırak ve kopyala ve yapıştır işlemlerini içerir. Sürükleyip bırakma işlemi, sistem panosu kullanılarak bir nesneden veya uygulamadan diğerine veri aktarmak için kullanılan kopyalama ve yapıştırma veya kesme ve yapıştırma işlemine benzer. Her iki işlem türü de şunları gerektirir:

  • Verileri sağlayan bir kaynak nesnesi.

  • Aktarılan verileri geçici olarak depolamanın bir yolu.

  • Verileri alan hedef nesne.

Kopyalama ve yapıştırma işleminde, sistem panosu aktarılan verileri geçici olarak depolamak için kullanılır; sürükle ve bırak işleminde, verileri depolamak için bir DataObject kullanılır. Kavramsal olarak, veri nesnesi gerçek verileri içeren bir Object bir veya daha fazla çiftini ve buna karşılık gelen veri biçimi tanımlayıcısını içerir.

Sürükleme kaynağı, statik DragDrop.DoDragDrop yöntemini çağırarak ve aktarılan verileri ona geçirerek bir sürükle ve bırak işlemi başlatır. DoDragDrop yöntemi gerekirse verileri otomatik olarak bir DataObject sarmalar. Veri biçimi üzerinde daha fazla denetim sağlamak için, verileri DataObject yöntemine geçirmeden önce bir DoDragDrop sarmalayabilirsiniz. Bırakma hedefi nesnesi, DataObjectöğesinden verileri ayıklamaktan sorumludur. Veri nesneleriyle çalışma hakkında daha fazla bilgi için bkz. Veri ve Veri Nesneleri.

Sürükle ve bırak işleminin kaynağı ve hedefi kullanıcı arabirimi öğeleridir; ancak, aslında aktarılmakta olan verilerin genellikle görsel bir gösterimi yoktur. Sürüklenen verilerin görsel bir gösterimini sağlamak için kod yazabilirsiniz; örneğin, Windows Gezgini'nde dosyaları sürüklerken meydana gelir. Varsayılan olarak, imleci sürükleyip bırakma işleminin veriler üzerindeki etkisini (verilerin taşınıp taşınmaması veya kopyalanması gibi) temsil edecek şekilde değiştirilerek kullanıcıya geri bildirim sağlanır.

Sürükleyip Bırakma Efektleri

Sürükle ve bırak işlemlerinin aktarılan veriler üzerinde farklı etkileri olabilir. Örneğin, verileri kopyalayabilir veya taşıyabilirsiniz. WPF, sürükle ve bırak işleminin etkisini belirtmek için kullanabileceğiniz bir DragDropEffects numaralandırması tanımlar. Sürükleme kaynağında, kaynağın izin vereceği etkileri DoDragDrop yönteminde belirtebilirsiniz. Bırakma hedefinde, hedefin amaçladığı etkiyi Effects sınıfının DragEventArgs özelliğinde belirtebilirsiniz. Bırakma hedefi DragOver olayında hedeflenen etkisini belirttiğinde, bu bilgi GiveFeedback olayında sürükleme kaynağına geri iletilir. Sürükleme kaynağı, kullanıcıya bırakılacak hedefin veri üzerindeki etkisi hakkında bilgi vermek için bu bilgileri kullanır. Veriler bırakıldığında, bırakma hedefi Drop olayındaki gerçek etkisini tanımlar. Bu bilgiler, DoDragDrop yönteminin dönüş değeri olarak sürükleme kaynağına geri geçirilir. Bırakma hedefi, allowedEffectssürükleme kaynakları listesinde olmayan bir etki döndürürse, sürükle ve bırak işlemi herhangi bir veri aktarımı gerçekleşmeden iptal edilir.

WPF'de DragDropEffects değerlerinin yalnızca sürükle ve bırak işleminin etkileri ile ilgili olarak sürükleme kaynağı ile bırakma hedefi arasında iletişim sağlamak için kullanıldığını unutmayın. Sürükle ve bırak işleminin gerçek etkisi, uygulamanıza uygun kodu yazmanıza bağlıdır.

Örneğin, bırakma hedefi verileri bırakmanın etkisinin verileri taşımak olduğunu belirtebilir. Ancak, verileri taşımak için hem hedef öğeye eklenmeli hem de kaynak öğeden kaldırılmalıdır. Kaynak öğe, verilerin taşınmasına izin verdiği anlamına gelebilir, ancak kaynak öğeden verileri kaldırmak için kod sağlamazsanız, sonuç verilerin kopyalanması ve taşınmaması olur.

Sürükleyip Bırakma Olayları

Sürükle ve bırak işlemleri olay temelli modeli destekler. Hem sürükleme kaynağı hem de bırakma hedefi, sürükle ve bırak işlemlerini işlemek için standart bir olay kümesi kullanır. Aşağıdaki tablolar standart sürükle ve bırak olaylarını özetler. Bunlar DragDrop sınıfındaki ekli olaylardır. Ekli olaylar hakkında daha fazla bilgi için bkz. Ekli Olaylara Genel Bakış.

Kaynak Olayları Sürükleme

Etkinlik Özet
GiveFeedback Bu olay sürükle ve bırak işlemi sırasında sürekli olarak gerçekleşir ve bırakma kaynağının kullanıcıya geri bildirim bilgileri vermesini sağlar. Bu geri bildirim genellikle fare işaretçisinin görünümünü bırakma hedefinin izin verdiği etkileri gösterecek şekilde değiştirerek verilir. Bu bir kabarcık olayı.
QueryContinueDrag Bu olay, sürükle ve bırak işlemi sırasında klavye veya fare düğmesi durumlarında bir değişiklik olduğunda gerçekleşir ve bırakma kaynağının tuş/düğme durumlarına bağlı olarak sürükleyip bırakma işlemini iptal edebilmesini sağlar. Bu bir kabarcık olayı.
PreviewGiveFeedback GiveFeedback'nin tünel versiyonu.
PreviewQueryContinueDrag QueryContinueDrag'nin tünel versiyonu.

Hedef Olayları Bırak

Etkinlik Özet
DragEnter Bu olay, bir nesne bırakma hedefinin sınırına sürüklendiği zaman gerçekleşir. Bu bir kabarcık olayı.
DragLeave Bu olay, bir nesne bırakma hedefinin sınırları dışına sürüklendiğinde gerçekleşir. Bu bir kabarcık olayı.
DragOver Bu olay, bir nesne bırakma hedefi sınırları içinde sürüklenip taşınırken sürekli olarak gerçekleşir. Bu bir kabarcık olayı.
Drop Bu olay, bırakma hedefinde bir nesne bırakıldığında oluşur. Bu bir kabarcık olayı.
PreviewDragEnter DragEnter'nin tünel versiyonu.
PreviewDragLeave DragLeave'nin tünel versiyonu.
PreviewDragOver DragOver'nin tünel versiyonu.
PreviewDrop Drop'nin tünel versiyonu.

Bir nesnenin örnekleri için sürükle ve bırak olaylarını işlemek için, önceki tablolarda listelenen olaylara yönelik işleyiciler ekleyin. Sürükle ve bırak olaylarını sınıf düzeyinde işlemek için ilgili sanal On*Event ve On*PreviewEvent yöntemlerini geçersiz kılın.

Sürükle ve Bırak'ı Uygulama

Ui öğesi bir sürükleme kaynağı, bırakma hedefi veya her ikisi de olabilir. Temel sürükle ve bırak işlemini uygulamak için sürükle ve bırak işlemini başlatmak ve bırakılan verileri işlemek için kod yazarsınız. İsteğe bağlı sürükleyip bırakma olaylarını işleyerek sürükleyip bırakma deneyimini geliştirebilirsiniz.

Temel sürükleyip bırakma işlemini uygulamak için aşağıdaki görevleri tamamlayacaksınız:

  • Sürükleme kaynağı olacak öğeyi tanımlayın. Sürükleme kaynağı bir UIElement veya ContentElementolabilir.

  • Sürükle ve bırak işlemini başlatacak sürükleme kaynağında bir olay işleyicisi oluşturun. Olay genellikle MouseMove etkinliğidir.

  • Sürükleme kaynağı olay işleyicisinde, sürükle ve bırak işlemini başlatmak için DoDragDrop yöntemini çağırın. DoDragDrop çağrısında sürükleme kaynağını, aktarılacak verileri ve izin verilen efektleri belirtin.

  • Bırakılacak hedef öğeyi tanımlayın. Bırakma hedefi UIElement veya ContentElementolabilir.

  • Bırakma hedefinde AllowDrop özelliğini true'e ayarlayın.

  • Bırakma hedefinde, bırakılan verileri işlemek için bir Drop olay işleyicisi oluşturun.

  • Drop olay işleyicisinde, DragEventArgs ve GetDataPresent yöntemlerini kullanarak GetData verilerini ayıklayın.

  • Drop olay işleyicisinde, istenen sürükle ve bırak işlemini gerçekleştirmek için verileri kullanın.

Özel bir DataObject oluşturarak ve aşağıdaki görevlerde gösterildiği gibi isteğe bağlı sürükle ve bırak hedef olaylarını işleyerek sürükle ve bırak uygulamanızı geliştirebilirsiniz:

  • Özel verileri veya birden çok veri öğesini aktarmak için DataObject yöntemine geçirmek üzere bir DoDragDrop oluşturun.

  • Ek işlemler gerçekleştirmek için, bırakma hedefinde DragEnter, DragOverve DragLeave olaylarını ele alın.

  • Fare imlecinin görünümünü değiştirmek için sürükleme kaynağındaki GiveFeedback olayını işleyebilirsiniz.

  • Sürükleyip bırakma işleminin iptal edilme biçimini değiştirmek için, sürükleme kaynağındaki QueryContinueDrag olayını işleyin.

Sürükle ve Bırak Örneği

Bu bölümde, bir Ellipse öğesi için sürükleyip bırakmanın nasıl uygulandığı açıklanmaktadır. Ellipse hem sürükleme kaynağı, hem de bırakma hedefidir. Aktarılan veriler, elips'in Fill özelliğinin dize gösterimidir. Aşağıdaki XAML, Ellipse öğesini ve işlediği sürükle ve bırak ile ilgili olayları gösterir. Sürükle ve bırak özelliğini uygulamayla ilgili tam adımlar için bkz. İzlenecek Yol: Kullanıcı Denetiminde Sürükle ve Bırak özelliğini etkinleştirme.

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

Öğeyi Sürükleme Kaynağı Olarak Etkinleştirme

Sürükleme kaynağı olan bir nesne aşağıdakiler için sorumludur:

  • Sürükleme işleminin gerçekleştiği zamanı belirleme.

  • Sürükle ve bırak işlemi başlatılıyor.

  • Aktarılacak verileri tanımlama.

  • Sürükle ve bırak işleminin aktarılan veriler üzerinde sahip olması için izin verilen etkileri belirtme.

Sürükleme kaynağı ayrıca kullanıcıya izin verilen eylemlerle ilgili geri bildirimde bulunabilir (taşıma, kopyalama, yok) ve sürükleme sırasında ESC tuşuna basma gibi ek kullanıcı girişlerine göre sürükle ve bırak işlemini iptal edebilir.

Bir sürüklemenin ne zaman gerçekleşeceğini belirlemek ve ardından DoDragDrop yöntemini çağırarak sürükleyip bırakma işlemini başlatmak uygulamanızın sorumluluğundadır. Genellikle, bir fare düğmesine basılı tutulduğunda ve sürüklenecek öğe üzerinde bir MouseMove olayı meydana geldiğinde bu durum ortaya çıkar. Aşağıdaki örnek, bir MouseMove öğesinin Ellipse olay işleyicisinden sürükleme kaynağı haline getirilmesi için sürükleyip bırakma işleminin nasıl başlatılacağını gösteriyor. Aktarılan veriler, elips'in Fill özelliğinin dize gösterimidir.

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

MouseMove olay işleyicisinin içinde, sürükle ve bırak işlemini başlatmak için DoDragDrop yöntemini çağırın. DoDragDrop yöntemi üç parametre alır:

  • dragSource – Aktarılan verilerin kaynağı olan bağımlılık nesnesine başvuru; bu genellikle MouseMove olayının kaynağıdır.

  • data - DataObjectiçinde sarmalanmış, aktarılan verileri içeren bir nesne.

  • allowedEffects - Sürükle ve bırak işleminin izin verilen etkilerini belirten DragDropEffects numaralandırma değerlerinden biri.

Serileştirilebilir herhangi bir nesne data parametresinde geçirilebilir. Veriler henüz bir DataObjectiçinde sarmalanmamışsa, otomatik olarak yeni bir DataObjectiçinde sarmalanır. Birden çok veri öğesini geçirmek için, DataObject'ı kendi başınıza oluşturmanız ve DoDragDrop yöntemine geçirmeniz gerekir. Daha fazla bilgi için bkz. Veri ve Veri Nesneleri.

allowedEffects parametresi, sürükleme kaynağının aktarılan verilerle bırakma hedefinin ne yapmaya izin vereceğini belirtmek için kullanılır. Sürükleme kaynağının ortak değerleri Copy, Moveve All'dır.

Uyarı

Bırakma hedefi, bırakılan verilere yanıt olarak hangi etkileri hedeflediğini de belirtebilir. Örneğin, bırakma hedefi bırakılacak veri türünü tanımıyorsa, izin verilen etkilerini Noneolarak ayarlayarak verileri reddedebilir. Bunu genellikle DragOver olay işleyicisinde yapar.

Sürükleme kaynağı isteğe bağlı olarak GiveFeedback ve QueryContinueDrag olaylarını işleyebilir. Bu olaylar, olayları işlenmiş olarak işaretlemediğiniz sürece kullanılan varsayılan işleyicilere sahiptir. Varsayılan davranışlarını değiştirmeniz gerekmediği sürece genellikle bu olayları yoksayarsınız.

sürükleme kaynağı sürüklenirken GiveFeedback olayı sürekli tetiklenir. Bu olayın varsayılan işleyicisi, sürükleme kaynağının geçerli bir bırakma hedefinin üzerinde olup olmadığını denetler. Bu durumda, bırakma hedefinin izin verilen etkilerini denetler. Ardından son kullanıcıya izin verilen bırakma efektleriyle ilgili geri bildirimde bulunur. Bu genellikle fare imlecini bırakma, kopyalama veya taşıma imlecine değiştirerek yapılır. Kullanıcıya geri bildirim sağlamak için özel imleçler kullanmanız gerektiğinde bu olayı yalnızca ele almanız gerekir. Bu olayı işlerseniz, varsayılan işleyicinin işleyicinizi geçersiz kılmaması için işlenmiş olarak işaretlediğinizden emin olun.

sürükleme kaynağı sürüklenirken QueryContinueDrag olayı sürekli tetiklenir. Esc, SHIFT, CTRL ve ALT tuşlarının ve fare düğmelerinin durumuna bağlı olarak sürükle ve bırak işleminin hangi eylemin sona erdiğini belirlemek için bu olayı işleyebilirsiniz. Bu olayın varsayılan işleyicisi, ESC tuşuna basıldığında sürükle ve bırak işlemini iptal eder ve fare düğmesi serbest bırakılırsa verileri bırakır.

Dikkat

Bu olaylar sürükle ve bırak işlemi sırasında sürekli olarak tetiklenir. Bu nedenle, olay işleyicilerinde yoğun kaynak kullanımlı görevlerden kaçınmanız gerekir. Örneğin, GiveFeedback olayı her tetiklendiğinde yeni bir imleç oluşturmak yerine önbelleğe alınmış bir imleç kullanın.

Bir Öğenin Bırakma Hedefi Olmasını Etkinleştirme

Bırakma hedefi olan bir nesne aşağıdakiler için sorumludur:

  • Geçerli bir bırakma hedefi olduğunu belirtme.

  • Sürükleme kaynağı hedefin üzerine sürüklendiğinde yanıt verme.

  • Aktarılan verilerin alabileceği biçimde olup olmadığını denetleme.

  • Bırakılan veriler işleniyor.

Bir öğenin bırakma hedefi olduğunu belirtmek için AllowDrop özelliğini trueolarak ayarlarsınız. Ardından, bırakma hedefiyle ilgili olaylar, işleyebilmeniz için öğede tetiklenecek.

Bırakma hedefi değerlendirildiğinde, imlecin öğenin görselinin üzerinde olup olmadığını belirlemek için bir isabet testi gerçekleştirilir. Bazı denetimler, Canvas gibi, görseli olmadığı için görsel eklenmedikçe bırakma hedefi olarak kullanılamaz. Canvas.Background öğesini renkle dolduran Canvas bir görsel oluşturmak için özelliğini herhangi bir renge ayarlayın. Canvas'yi saydam tutmak ancak bir bırakma hedefi olarak etkinleştirmek için Background özelliğini Transparent olarak ayarlayın.

Sürükle ve bırak işlemi sırasında, bırakma hedefinde aşağıdaki olay dizisi gerçekleşir:

  1. DragEnter

  2. DragOver

  3. DragLeave veya Drop

DragEnter olayı, veriler düşürme hedefinin sınırına sürüklendiğinde gerçekleşir. Bu olayı genellikle uygulamanız için uygunsa sürükle ve bırak işleminin etkilerinin önizlemesini sağlamak için işlersiniz. DragEventArgs.Effects özelliğini DragEnter olayında ayarlamayın, çünkü DragOver olayında üzerine yazılacaktır.

Aşağıdaki örnekte bir DragEnter öğesi için Ellipse olay işleyicisi gösterilmektedir. Bu kod, geçerli Fill fırçasını kaydederek sürükle ve bırak işleminin etkilerinin önizlemesini gösterir. Daha sonra elips üzerinde sürüklenen GetDataPresent'in bir DataObject'ye dönüştürülebilecek dize verileri içerip içermediğini denetlemek için Brush yöntemini kullanır. Bu durumda veriler GetData yöntemi kullanılarak ayıklanır. Daha sonra bir Brush'a dönüştürülür ve elipse uygulanır. Değişiklik, DragLeave olay işleyicisinde geri döndürülür. Veriler Brushdönüştürülemiyorsa hiçbir eylem gerçekleştirilmez.

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

Verinin bırakma hedefinin üzerine sürüklenmesi sırasında DragOver olayı sürekli meydana gelir. Bu olay, sürükleme kaynağındaki GiveFeedback olayıyla eşleştirilir. DragOver olay işleyicisinde, aktarılan verilerin bırakma hedefinin işleyebileceği bir biçimde olup olmadığını denetlemek için genellikle GetDataPresent ve GetData yöntemlerini kullanırsınız. Ayrıca, herhangi bir değiştirici tuşa basılıp basılmadığını da denetleyebilirsiniz; bu da genellikle kullanıcının taşıma veya kopyalama eylemini amaçlayıp amaçlamadığını gösterir. Bu denetimler gerçekleştirildikten sonra, DragEventArgs.Effects özelliğini sürükleme kaynağına verilerin bırakılmasının hangi etkiye sahip olacağını bildirecek şekilde ayarlarsınız. Sürükleme kaynağı bu bilgileri GiveFeedback olay birleştirmelerinde alır ve kullanıcıya geri bildirim sağlamak için uygun bir imleç ayarlayabilir.

Aşağıdaki örnekte bir DragOver öğesi için Ellipse olay işleyicisi gösterilmektedir. Bu kod, elips üzerinde sürüklenen DataObject'ın, bir Brush'e dönüştürülebilecek dize verilerini içerip içermediğini denetler. Bu durumda, DragEventArgs.Effects özelliğini Copyolarak ayarlar. Bu, sürükleme kaynağına verilerin elips içine kopyalanabileceğini gösterir. Veriler bir Brushdönüştürülemiyorsa, DragEventArgs.Effects özelliği Noneolarak ayarlanır. Bu, sürükleme kaynağına elipsin veriler için geçerli bir bırakma hedefi olmadığını gösterir.

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

Veriler hedefin sınırından bırakılmadan sürüklendiğinde DragLeave olayı gerçekleşir. DragEnter olay işleyicisinde yaptığınız her şeyi geri almak için bu olayı işlersiniz.

Aşağıdaki örnekte bir DragLeave öğesi için Ellipse olay işleyicisi gösterilmektedir. Bu kod, DragEnter olay işleyicisinde gerçekleştirilen önizlemeyi, kaydedilen Brush'i elipse uygulayarak geri alır.

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

Drop olayı, veriler bırakma hedefinin üzerine bırakıldığında gerçekleşir; varsayılan olarak, fare düğmesi serbest bırakıldığında bu durum ortaya çıkar. Drop olay işleyicisinde, GetData aktarılan verileri ayıklamak ve uygulamanızın gerektirdiği tüm veri işleme işlemlerini gerçekleştirmek için DataObject yöntemini kullanırsınız. Drop olayı sürükle ve bırak işlemini sonlandırır.

Aşağıdaki örnekte bir Drop öğesi için Ellipse olay işleyicisi gösterilmektedir. Bu kod sürükle ve bırak işleminin etkilerini uygular ve DragEnter olay işleyicisindeki koda benzer. DataObject'ın elipsin üzerinde sürüklenirken, bir Brush'e dönüştürülebilecek dize verisi içerip içermediğini denetler. Bu durumda, Brush elipse uygulanır. Veriler Brushdönüştürülemiyorsa hiçbir eylem gerçekleştirilmez.

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

Ayrıca bakınız