Sürükleme ve Bırakmaya 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, sürükle ve bırak'a herhangi biri UIElement veya ContentElement katılabilir. Sürükle ve bırak işlemleri için gereken olaylar ve yöntemler sınıfında DragDrop tanımlanır. UIElement ve ContentElement sınıfları, bir veya ContentElement temel öğesi olarak devralındığında UIElement olayların sınıf üyeleri listesinde görünmesi için ekli olaylar için DragDrop diğer adlar içerir. Bu olaylara eklenen olay işleyicileri, temel alınan DragDrop ekli olaya eklenir ve aynı olay veri örneğini alır. Daha fazla bilgi için olaya bakın UIElement.Drop .

Ö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 kullanılır DataObject . Kavramsal olarak, veri nesnesi gerçek verileri içeren bir Object veya daha fazla çifti ve buna karşılık gelen veri biçimi tanımlayıcısını içerir.

Sürükleme kaynağı, statik DragDrop.DoDragDrop yöntemi ç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 içinde sarmalar. Veri biçimi üzerinde daha fazla denetim için, yöntemine geçirmeden önce verileri bir DataObject içinde DoDragDrop sarmalayabilirsiniz. Bırakma hedefi, içindeki verileri ayıklamaktan DataObjectsorumludur. 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 numaralandırma tanımlar DragDropEffects . Sürükleme kaynağında, kaynağın yöntemde DoDragDrop izin verecek etkilerini belirtebilirsiniz. Bırakma hedefinde, hedefin sınıfın özelliğinde Effects amaçladığınız etkiyi DragEventArgs belirtebilirsiniz. Bırakma hedefi olaydaki hedef etkisini belirttiğinde DragOver , bu bilgiler olaydaki GiveFeedback sürükleme kaynağına geri geçirilir. Sürükleme kaynağı, kullanıcıya bırakma hedefinin veriler üzerindeki etkisini bildirmek için bu bilgileri kullanır. Veriler bırakıldığında, bırakma hedefi olaydaki Drop gerçek etkisini belirtir. Bu bilgiler, yöntemin dönüş değeri DoDragDrop olarak sürükleme kaynağına geri geçirilir. Bırakma hedefi, öğesinin sürükleme kaynakları listesinde allowedEffectsolmayan bir efekt döndürürse, herhangi bir veri aktarımı gerçekleşmeden sürükle ve bırak işlemi iptal edilir.

WPF'de değerlerin yalnızca sürükle ve bırak işleminin DragDropEffects 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, sınıfındaki DragDrop ekli olaylardır. Ekli olaylar hakkında daha fazla bilgi için bkz . Ekli Olaylara Genel Bakış.

Kaynak Olayları Sürükleme

Olay Ö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 'nin GiveFeedbacktünel oluşturma sürümü.
PreviewQueryContinueDrag 'nin QueryContinueDragtünel oluşturma sürümü.

Hedef Olayları Bırak

Olay Özet
DragEnter Bu olay, bir nesne bırakma hedefinin sınırına sürüklendiğinde gerçekleşir. Bu bir kabarcık olayı.
DragLeave Bu olay, bir nesne bırakma hedefinin sınırından sürüklendiğinde gerçekleşir. Bu bir kabarcık olayı.
DragOver Bu olay, bir nesne bırakma hedefinin sınırına sürüklenirken (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 'nin DragEntertünel oluşturma sürümü.
PreviewDragLeave 'nin DragLeavetünel oluşturma sürümü.
PreviewDragOver 'nin DragOvertünel oluşturma sürümü.
PreviewDrop 'nin Droptünel oluşturma sürümü.

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. Daha fazla bilgi için bkz . Denetim Temeli Sınıflarına Göre Yönlendirilen Olayların Sınıf İşlemesi.

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ğı veya UIElementContentElementolabilir.

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

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

  • Bırakma hedefi olacak öğeyi tanımlayın. Bırakma hedefi veya ContentElementolabilirUIElement.

  • Bırakma hedefinde özelliğini olarak trueayarlayınAllowDrop.

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

  • Olay işleyicisinde Drop ve GetData yöntemlerini kullanarak GetDataPresent dosyasından DragEventArgs verileri ayıklayın.

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

Aşağıdaki görevlerde gösterildiği gibi, özel DataObject bir oluşturma ve isteğe bağlı sürükleme kaynağı ve bırakma 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 yöntemine geçirmek için DoDragDrop bir DataObject oluşturun.

  • Sürükleme sırasında ek eylemler gerçekleştirmek için bırakma hedefinde DragEnter, DragOverve DragLeave olaylarını işleyebilirsiniz.

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

  • Sürükle ve bırak işleminin iptal edilme biçimini değiştirmek için sürükleme kaynağındaki olayı işleyebilir QueryContinueDrag .

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

Bu bölümde, bir Ellipse öğe için sürükle ve bırak'ın nasıl uygulandığı açıklanmaktadır. Ellipse hem sürükleme kaynağı hem de bırakma hedefidir. Aktarılan veriler, üç nokta Fill özelliğinin dize gösterimidir. Aşağıdaki XAML, öğesini ve işlediği sürükle ve bırak ile ilgili olayları gösterir Ellipse . 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'ı 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üklemenin ne zaman gerçekleştiğini 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 yöntemini çağırarak sürükleyip bırakma işlemini başlatmak uygulamanızın sorumluluğundadır DoDragDrop . Genellikle, bir fare düğmesine basıldığında sürüklenecek öğe üzerinde bir MouseMove olay gerçekleştiğinde budur. Aşağıdaki örnekte bir öğenin olay işleyicisinden MouseMoveEllipse sürükleyip bırakma işleminin nasıl başlatılıp sürüklenme kaynağı haline getirilip getirileyği gösterilmektedir. Aktarılan veriler, üç nokta 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

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

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

  • data - Aktarılan verileri içeren, içinde sarmalanmış bir DataObjectnesne.

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

Herhangi bir serileştirilebilir nesne parametresinde data geçirilebilir. Veriler henüz içinde DataObjectsarmalanmadıysa, otomatik olarak yeni DataObjectbir içine sarmalanır. Birden çok veri öğesi geçirmek için kendiniz oluşturmanız DataObject ve yöntemine DoDragDrop geçirmeniz gerekir. Daha fazla bilgi için bkz . Veri ve Veri Nesneleri.

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

Dekont

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 olay işleyicisinde DragOver yapar.

Sürükleme kaynağı isteğe bağlı olarak ve QueryContinueDrag olaylarını GiveFeedback 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 GiveFeedback kaynağı sürüklenirken 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. Bu olayı yalnızca kullanıcıya geri bildirim sağlamak için özel imleçler kullanmanız gerekiyorsa işlemeniz 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 QueryContinueDrag kaynağı sürüklenirken 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, olay her GiveFeedback başlatıldığında 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, öğesinin AllowDrop özelliğini olarak trueayarlarsınız. Ardından bırakma hedefi olayları, işleyebilmeniz için öğesinde oluşturulur. 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

Olay, DragEnter veriler bırakma 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. Olayda DragEventArgs.EffectsDragEnter üzerine yazılacağından, olayda DragOver özelliğini ayarlamayın.

Aşağıdaki örnekte bir Ellipse öğenin olay işleyicisi gösterilmektedirDragEnter. Bu kod, geçerli Fill fırçayı kaydederek sürükle ve bırak işleminin etkilerinin önizlemesini gösterir. Ardından, üç noktanın üzerine sürüklenen öğesinin DataObject içine dönüştürülebilecek dize verileri içerip içermediğini denetlemek için Brushyöntemini kullanırGetDataPresent. Bu durumda veriler yöntemi kullanılarak GetData ayıklanır. Daha sonra a'ya Brush dönüştürülür ve üç noktaya uygulanır. Değişiklik, olay işleyicisinde DragLeave geri döndürülür. Veriler bir Brush'a dö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

Veriler DragOver bırakma hedefinin üzerine sürüklenirken olay sürekli gerçekleşir. Bu olay, sürükleme kaynağındaki GiveFeedback olayla eşleştirilir. Olay işleyicisinde DragOver , aktarılan verilerin bırakma hedefinin GetDataPresent işleyebileceği bir biçimde olup olmadığını denetlemek için genellikle 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, sürükleme kaynağına verileri bırakmanın DragEventArgs.Effects ne gibi bir etkisi olacağını bildirmek için özelliğini ayarlarsınız. Sürükleme kaynağı bu bilgileri olay birleştirmelerinde GiveFeedback alır ve kullanıcıya geri bildirim sağlamak için uygun bir imleç ayarlayabilir.

Aşağıdaki örnekte bir Ellipse öğenin olay işleyicisi gösterilmektedirDragOver. Bu kod, üç noktanın üzerine sürüklenen öğesinin DataObject içine dönüştürülebilecek Brushdize verileri içerip içermediğini denetler. Öyleyse, özelliğini olarak CopyayarlarDragEventArgs.Effects. Bu, sürükleme kaynağına verilerin üç noktaya kopyalanabileceğini gösterir. Veriler bir BrushDragEventArgs.Effects 'a dönüştürülemiyorsa özelliği olarak Noneayarlanır. Bu, sürükleme kaynağına üç noktanın 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 DragLeave bırakılmadan hedefin sınırından sürüklendiğinde olay gerçekleşir. Olay işleyicisinde DragEnter yaptığınız her şeyi geri almak için bu olayı işlersiniz.

Aşağıdaki örnekte bir Ellipse öğenin olay işleyicisi gösterilmektedirDragLeave. Bu kod, kaydedilen Brush öğesini üç noktaya uygulayarak olay işleyicisinde DragEnter gerçekleştirilen önizlemeyi 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

Olay Drop , 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 gerçekleşir. Olay işleyicisinde, dosyasından DropGetData aktarılan verileri DataObject ayıklamak ve uygulamanızın gerektirdiği herhangi bir veri işlemeyi gerçekleştirmek için yöntemini kullanırsınız. Olay Drop sürükle ve bırak işlemini sonlandırır.

Aşağıdaki örnekte bir Ellipse öğenin olay işleyicisi gösterilmektedirDrop. Bu kod sürükle ve bırak işleminin etkilerini uygular ve olay işleyicisindeki DragEnter koda benzer. Üç noktanın üzerine sürüklenen öğesinin DataObject içine dönüştürülebilen Brushdize verileri içerip içermediğini denetler. Öyleyse, Brush üç noktaya uygulanır. Veriler bir Brush'a dö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 bkz.