İzlenecek yol: Kullanıcı Denetiminde Sürükleme ve Bırakmayı Etkinleştirme
Bu kılavuzda, Windows Presentation Foundation'da (WPF) sürükle ve bırak veri aktarımına katılabilen özel bir kullanıcı denetiminin nasıl oluşturulacağı gösterilmektedir.
Bu kılavuzda, daire şeklini temsil eden özel bir WPF UserControl oluşturacaksınız. Sürükle ve bırak yoluyla veri aktarımını etkinleştirmek için denetimde işlevsellik uygulayacaksınız. Örneğin, bir Daire denetiminden diğerine sürüklerseniz, Dolgu rengi verileri kaynak Daire'den hedefe kopyalanır. Daire denetiminden öğesine TextBoxsürüklerseniz, Dolgu renginin dize gösterimi öğesine TextBoxkopyalanır. Ayrıca sürükle ve bırak işlevini test etmek için iki panel denetimi ve bir TextBox içeren küçük bir uygulama oluşturacaksınız. Panellerin bırakılan Circle verilerini işlemesine olanak tanıyan bir kod yazacaksınız. Bu kod, Daireleri bir panelin Alt öğeler koleksiyonundan diğerine taşımanıza veya kopyalamanıza olanak tanır.
Bu izlenecek yol aşağıdaki görevleri gösterir:
Özel bir kullanıcı denetimi oluşturun.
Kullanıcı denetimini sürükleme kaynağı olarak etkinleştirin.
Kullanıcı denetimini bırakma hedefi olarak etkinleştirin.
Kullanıcı denetiminden bırakılan verileri almak için paneli etkinleştirin.
Ön koşullar
Bu kılavuzu tamamlamak için Visual Studio'ya ihtiyacınız vardır.
Uygulama Projesi Oluşturma
Bu bölümde, iki panel ve TextBoxbir içeren bir ana sayfa içeren uygulama altyapısını oluşturacaksınız.
Visual Basic veya Visual C# içinde adlı
DragDropExample
yeni bir WPF Uygulaması projesi oluşturun. Daha fazla bilgi için bkz . İzlenecek yol: İlk WPF masaüstü uygulamam.MainWindow.xaml dosyasını açın.
Açma ve kapatma Grid etiketleri arasına aşağıdaki işaretlemeyi ekleyin.
Bu işaretleme, test uygulaması için kullanıcı arabirimini oluşturur.
<Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <StackPanel Grid.Column="0" Background="Beige"> <TextBox Width="Auto" Margin="2" Text="green"/> </StackPanel> <StackPanel Grid.Column="1" Background="Bisque"> </StackPanel>
Projeye Yeni Kullanıcı Denetimi Ekleme
Bu bölümde projeye yeni bir kullanıcı denetimi ekleyeceğiz.
Proje menüsünde Kullanıcı Denetimi Ekle'yi seçin.
Yeni Öğe Ekle iletişim kutusunda, adı olarak
Circle.xaml
değiştirin ve Ekle'ye tıklayın.Circle.xaml ve arka planı projeye eklenir.
Circle.xaml dosyasını açın.
Bu dosya, kullanıcı denetiminin kullanıcı arabirimi öğelerini içerir.
Kullanıcı arabirimi olarak mavi daire içeren basit bir kullanıcı denetimi oluşturmak için köke Grid aşağıdaki işaretlemeyi ekleyin.
<Ellipse x:Name="circleUI" Height="100" Width="100" Fill="Blue" />
Circle.xaml.cs veya Circle.xaml.vb dosyasını açın.
C# dilinde aşağıdaki kodu parametresiz oluşturucunun arkasına ekleyerek bir kopya oluşturucu oluşturun. Visual Basic'te, hem parametresiz oluşturucu hem de kopya oluşturucu oluşturmak için aşağıdaki kodu ekleyin.
Kullanıcı denetiminin kopyalanmasını sağlamak için arka planda kod dosyasına bir kopya oluşturucu yöntemi eklersiniz. Basitleştirilmiş Circle kullanıcı denetiminde, yalnızca Dolgu'yu ve kullanıcı denetiminin boyutunu kopyalayacaksınız.
public Circle(Circle c) { InitializeComponent(); this.circleUI.Height = c.circleUI.Height; this.circleUI.Width = c.circleUI.Height; this.circleUI.Fill = c.circleUI.Fill; }
Public Sub New() ' This call is required by the designer. InitializeComponent() End Sub Public Sub New(ByVal c As Circle) InitializeComponent() Me.circleUI.Height = c.circleUI.Height Me.circleUI.Width = c.circleUI.Height Me.circleUI.Fill = c.circleUI.Fill End Sub
Kullanıcı denetimini ana pencereye ekleme
MainWindow.xaml dosyasını açın.
Geçerli uygulamaya bir XML ad alanı başvurusu oluşturmak için aşağıdaki XAML'yi açılış Window etiketine ekleyin.
xmlns:local="clr-namespace:DragDropExample"
İlk StackPanelpanelde Circle kullanıcı denetiminin iki örneğini oluşturmak için aşağıdaki XAML'yi ekleyin.
<local:Circle Margin="2" /> <local:Circle Margin="2" />
Panelin tam XAML'i aşağıdaki gibi görünür.
<StackPanel Grid.Column="0" Background="Beige"> <TextBox Width="Auto" Margin="2" Text="green"/> <local:Circle Margin="2" /> <local:Circle Margin="2" /> </StackPanel> <StackPanel Grid.Column="1" Background="Bisque"> </StackPanel>
Kullanıcı Denetiminde Sürükleme Kaynağı Olaylarını Uygulama
Bu bölümde yöntemini geçersiz kılacak OnMouseMove ve sürükle ve bırak işlemini başlatacaksınız.
Sürükleme başlatılırsa (fare düğmesine basılır ve fare taşınırsa), verileri içine DataObjectaktarılacak şekilde paketleyeceksiniz. Bu durumda, Daire denetimi üç veri öğesini paketler; Dolgu renginin dize gösterimi, yüksekliğinin çift gösterimi ve kendisinin bir kopyası.
Sürükle ve bırak işlemini başlatmak için
Circle.xaml.cs veya Circle.xaml.vb dosyasını açın.
Olay için sınıf işleme sağlamak için aşağıdaki OnMouseMove geçersiz kılmayı MouseMove ekleyin.
protected override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); if (e.LeftButton == MouseButtonState.Pressed) { // Package the data. DataObject data = new DataObject(); data.SetData(DataFormats.StringFormat, circleUI.Fill.ToString()); data.SetData("Double", circleUI.Height); data.SetData("Object", this); // Initiate the drag-and-drop operation. DragDrop.DoDragDrop(this, data, DragDropEffects.Copy | DragDropEffects.Move); } }
Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Input.MouseEventArgs) MyBase.OnMouseMove(e) If e.LeftButton = MouseButtonState.Pressed Then ' Package the data. Dim data As New DataObject data.SetData(DataFormats.StringFormat, circleUI.Fill.ToString()) data.SetData("Double", circleUI.Height) data.SetData("Object", Me) ' Inititate the drag-and-drop operation. DragDrop.DoDragDrop(Me, data, DragDropEffects.Copy Or DragDropEffects.Move) End If End Sub
Bu OnMouseMove geçersiz kılma aşağıdaki görevleri gerçekleştirir:
Fare hareket ederken sol fare düğmesine basılıp basılmadığını denetler.
Circle verilerini içine DataObjectpaketler. Bu durumda, Daire denetimi üç veri öğesini paketler; Dolgu renginin dize gösterimi, yüksekliğinin çift gösterimi ve kendisinin bir kopyası.
Sürükle ve bırak işlemini başlatmak için statik DragDrop.DoDragDrop yöntemi çağırır. yöntemine aşağıdaki üç parametreyi DoDragDrop geçirirsiniz:
dragSource
– Bu denetime bir başvuru.data
– Önceki DataObject kodda oluşturulan.allowedEffects
– veya olan izin verilen sürükle ve bırak işlemleri.CopyMove
Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın.
Daire denetimlerinden birine tıklayın ve panellerin, diğer Circle'ın ve öğesinin TextBoxüzerine sürükleyin. öğesinin TextBoxüzerine sürüklerken, imleç bir taşımayı gösterecek şekilde değişir.
Daireyi TextBoxüzerine sürüklerken Ctrl tuşuna basın. İmlecin kopyayı gösterecek şekilde nasıl değiştiğine dikkat edin.
Daireyi sürükleyip üzerine TextBoxbırakın. Dairenin dolgu renginin dize gösterimi sonuna TextBoxeklenir.
Varsayılan olarak, sürükle ve bırak işlemi sırasında imleç, verileri bırakmanın hangi etkiyi oluşturacağını belirtmek için değişir. Olayı işleyip GiveFeedback farklı bir imleç ayarlayarak kullanıcıya verilen geri bildirimi özelleştirebilirsiniz.
Kullanıcıya geri bildirimde bulunmak
Circle.xaml.cs veya Circle.xaml.vb dosyasını açın.
Olay için sınıf işleme sağlamak için aşağıdaki OnGiveFeedback geçersiz kılmayı GiveFeedback ekleyin.
protected override void OnGiveFeedback(GiveFeedbackEventArgs e) { base.OnGiveFeedback(e); // These Effects values are set in the drop target's // DragOver event handler. if (e.Effects.HasFlag(DragDropEffects.Copy)) { Mouse.SetCursor(Cursors.Cross); } else if (e.Effects.HasFlag(DragDropEffects.Move)) { Mouse.SetCursor(Cursors.Pen); } else { Mouse.SetCursor(Cursors.No); } e.Handled = true; }
Protected Overrides Sub OnGiveFeedback(ByVal e As System.Windows.GiveFeedbackEventArgs) MyBase.OnGiveFeedback(e) ' These Effects values are set in the drop target's ' DragOver event handler. If e.Effects.HasFlag(DragDropEffects.Copy) Then Mouse.SetCursor(Cursors.Cross) ElseIf e.Effects.HasFlag(DragDropEffects.Move) Then Mouse.SetCursor(Cursors.Pen) Else Mouse.SetCursor(Cursors.No) End If e.Handled = True End Sub
Bu OnGiveFeedback geçersiz kılma aşağıdaki görevleri gerçekleştirir:
Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın.
Daire denetimlerinden birini paneller, diğer Daire ve öğesinin TextBoxüzerine sürükleyin. İmleçlerin artık geçersiz kılmada OnGiveFeedback belirttiğiniz özel imleçler olduğuna dikkat edin.
içinden metni
green
TextBoxseçin.green
Metni Daire denetimine sürükleyin. Sürükle ve bırak işleminin etkilerini göstermek için varsayılan imleçlerin gösterildiğine dikkat edin. Geri bildirim imleci her zaman sürükleme kaynağı tarafından ayarlanır.
Kullanıcı Denetiminde Bırakma Hedefi Olayları Uygulama
Bu bölümde, kullanıcı denetiminin bir bırakma hedefi olduğunu belirtecek, kullanıcı denetiminin bırakma hedefi olmasını sağlayan yöntemleri geçersiz kılacak ve üzerine bırakılan verileri işleyeceksiniz.
Kullanıcı denetiminin bırakma hedefi olmasını sağlamak için
Circle.xaml dosyasını açın.
Açılış UserControl etiketinde özelliğini ekleyin AllowDrop ve olarak
true
ayarlayın.<UserControl x:Class="DragDropWalkthrough.Circle" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300" AllowDrop="True">
OnDrop özelliği olarak ayarlandığında true
ve sürükleme kaynağındaki veriler Circle kullanıcı denetimine bırakıldığında AllowDrop yöntemi çağrılır. Bu yöntemde bırakılan verileri işleyecek ve circle'a uygulayacaksınız.
Bırakılan verileri işlemek için
Circle.xaml.cs veya Circle.xaml.vb dosyasını açın.
Olay için sınıf işleme sağlamak için aşağıdaki OnDrop geçersiz kılmayı Drop ekleyin.
protected override void OnDrop(DragEventArgs e) { base.OnDrop(e); // 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); circleUI.Fill = newFill; // Set Effects to notify the drag source what effect // the drag-and-drop operation had. // (Copy if CTRL is pressed; otherwise, move.) if (e.KeyStates.HasFlag(DragDropKeyStates.ControlKey)) { e.Effects = DragDropEffects.Copy; } else { e.Effects = DragDropEffects.Move; } } } e.Handled = true; }
Protected Overrides Sub OnDrop(ByVal e As System.Windows.DragEventArgs) MyBase.OnDrop(e) ' If the DataObject contains string data, extract it. If e.Data.GetDataPresent(DataFormats.StringFormat) Then Dim dataString As String = e.Data.GetData(DataFormats.StringFormat) ' If the string can be converted into a Brush, ' convert it and apply it to the ellipse. Dim converter As New BrushConverter If converter.IsValid(dataString) Then Dim newFill As Brush = converter.ConvertFromString(dataString) circleUI.Fill = newFill ' Set Effects to notify the drag source what effect ' the drag-and-drop operation had. ' (Copy if CTRL is pressed; otherwise, move.) If e.KeyStates.HasFlag(DragDropKeyStates.ControlKey) Then e.Effects = DragDropEffects.Copy Else e.Effects = DragDropEffects.Move End If End If End If e.Handled = True End Sub
Bu OnDrop geçersiz kılma aşağıdaki görevleri gerçekleştirir:
Sürüklenen GetDataPresent verilerin dize nesnesi içerip içermediğini denetlemek için yöntemini kullanır.
GetData Varsa dize verilerini ayıklamak için yöntemini kullanır.
dizesini öğesine dönüştürmeyi denemek için kullanır BrushConverterBrush.
Dönüştürme başarılı olursa, fırçayı FillEllipse Daire denetiminin kullanıcı arabirimini sağlayan öğesine uygular.
Drop Olayı işlenmiş olarak işaretler. Bu olayı alan diğer öğelerin Circle kullanıcı denetiminin bunu işlediğini bilmesi için bırakma olayını işlenmiş olarak işaretlemeniz gerekir.
Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın.
içindeki TextBoxmetni
green
seçin.Metni Daire denetimine sürükleyip bırakın. Daire maviden yeşile dönüşür.
içindeki metni
green
TextBoxyazın.içindeki TextBoxmetni
gre
seçin.Daire denetimine sürükleyip bırakın. İmlecin bırakma işlemine izin verildiğini gösterecek şekilde değiştiğine, ancak geçerli bir renk olmadığından Dairenin renginin değişmediğini
gre
fark edin.Yeşil Daire denetiminden sürükleyin ve mavi Daire denetimine bırakın. Daire maviden yeşile dönüşür. Hangi imlecin gösterileceğinin, dairenin TextBox veya sürükleme kaynağı olmasına bağlı olduğuna dikkat edin.
Özelliğini true
olarak AllowDrop ayarlamak ve bırakılan verileri işlemek, bir öğenin bırakma hedefi olmasını sağlamak için gereken tek şey. Ancak, daha iyi bir kullanıcı deneyimi sağlamak için , DragLeaveve DragOver olaylarını DragEnterda işlemeniz gerekir. Bu olaylarda, denetimler gerçekleştirebilir ve veriler bırakılmadan önce kullanıcıya ek geri bildirim sağlayabilirsiniz.
Veriler Circle kullanıcı denetiminin üzerine sürüklendiğinde, denetim sürüklenen verileri işleyip işleyemeyeceğini sürükleme kaynağına bildirmelidir. Denetim verilerin nasıl işlenip işlenmediğini bilmiyorsa bırakma işlemini reddetmelidir. Bunu yapmak için olayı işleyecek DragOver ve özelliğini ayarlayacaksınız Effects .
Veri bırakma işlemine izin verildiğini doğrulamak için
Circle.xaml.cs veya Circle.xaml.vb dosyasını açın.
Olay için sınıf işleme sağlamak için aşağıdaki OnDragOver geçersiz kılmayı DragOver ekleyin.
protected override void OnDragOver(DragEventArgs e) { base.OnDragOver(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 or moving. BrushConverter converter = new BrushConverter(); if (converter.IsValid(dataString)) { // Set Effects to notify the drag source what effect // the drag-and-drop operation will have. These values are // used by the drag source's GiveFeedback event handler. // (Copy if CTRL is pressed; otherwise, move.) if (e.KeyStates.HasFlag(DragDropKeyStates.ControlKey)) { e.Effects = DragDropEffects.Copy; } else { e.Effects = DragDropEffects.Move; } } } e.Handled = true; }
Protected Overrides Sub OnDragOver(ByVal e As System.Windows.DragEventArgs) MyBase.OnDragOver(e) e.Effects = DragDropEffects.None ' If the DataObject contains string data, extract it. If e.Data.GetDataPresent(DataFormats.StringFormat) Then Dim dataString As String = e.Data.GetData(DataFormats.StringFormat) ' If the string can be converted into a Brush, allow copying or moving. Dim converter As New BrushConverter If converter.IsValid(dataString) Then ' Set Effects to notify the drag source what effect ' the drag-and-drop operation will have. These values are ' used by the drag source's GiveFeedback event handler. ' (Copy if CTRL is pressed; otherwise, move.) If e.KeyStates.HasFlag(DragDropKeyStates.ControlKey) Then e.Effects = DragDropEffects.Copy Else e.Effects = DragDropEffects.Move End If End If End If e.Handled = True End Sub
Bu OnDragOver geçersiz kılma aşağıdaki görevleri gerçekleştirir:
Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın.
içindeki TextBoxmetni
gre
seçin.Metni Daire denetimine sürükleyin. İmlecin artık geçerli bir renk olmadığından bırakma işlemine izin verilmediğini
gre
gösterecek şekilde değiştiğine dikkat edin.
Bırakma işleminin önizlemesini uygulayarak kullanıcı deneyimini daha da geliştirebilirsiniz. Circle kullanıcı denetimi için ve OnDragLeave yöntemlerini geçersiz kılacaksınızOnDragEnter. Veriler denetimin üzerine sürüklendiğinde, geçerli arka plan Fill bir yer tutucu değişkene kaydedilir. Dize daha sonra bir fırçaya dönüştürülür ve Dairenin kullanıcı arabirimini Ellipse sağlayan öğesine uygulanır. Veriler bırakılmadan Daire'nin dışına sürüklenirse, özgün Fill değer Daireye yeniden uygulanır.
Sürükle ve bırak işleminin etkilerini önizlemek için
Circle.xaml.cs veya Circle.xaml.vb dosyasını açın.
Circle sınıfında adlı
_previousFill
bir özel Brush değişken bildirin ve olaraknull
başlatın.public partial class Circle : UserControl { private Brush _previousFill = null;
Public Class Circle Private _previousFill As Brush = Nothing
Olay için sınıf işleme sağlamak için aşağıdaki OnDragEnter geçersiz kılmayı DragEnter ekleyin.
protected override void OnDragEnter(DragEventArgs e) { base.OnDragEnter(e); // Save the current Fill brush so that you can revert back to this value in DragLeave. _previousFill = circleUI.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.ToString()); circleUI.Fill = newFill; } } }
Protected Overrides Sub OnDragEnter(ByVal e As System.Windows.DragEventArgs) MyBase.OnDragEnter(e) _previousFill = circleUI.Fill ' If the DataObject contains string data, extract it. If e.Data.GetDataPresent(DataFormats.StringFormat) Then Dim dataString As String = 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 = converter.ConvertFromString(dataString) circleUI.Fill = newFill End If End If e.Handled = True End Sub
Bu OnDragEnter geçersiz kılma aşağıdaki görevleri gerçekleştirir:
Olay için sınıf işleme sağlamak için aşağıdaki OnDragLeave geçersiz kılmayı DragLeave ekleyin.
protected override void OnDragLeave(DragEventArgs e) { base.OnDragLeave(e); // Undo the preview that was applied in OnDragEnter. circleUI.Fill = _previousFill; }
Protected Overrides Sub OnDragLeave(ByVal e As System.Windows.DragEventArgs) MyBase.OnDragLeave(e) ' Undo the preview that was applied in OnDragEnter. circleUI.Fill = _previousFill End Sub
Bu OnDragLeave geçersiz kılma aşağıdaki görevleri gerçekleştirir:
Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın.
içindeki TextBoxmetni
green
seçin.Metni bırakmadan Daire denetiminin üzerine sürükleyin. Daire maviden yeşile dönüşür.
Metni Daire denetiminden uzağa sürükleyin. Daire yeşilden maviye döner.
Bırakılan Verileri Almak için Panel Etkinleştirme
Bu bölümde, Circle kullanıcı denetimlerini barındıran panellerin sürüklenen Circle verileri için bırakma hedefleri olarak davranmasını sağlarsınız. Daireyi bir panelden diğerine taşımanıza veya daireyi sürükleyip bırakırken Ctrl tuşunu basılı tutarak Daire denetiminin bir kopyasını oluşturmanıza olanak tanıyan kodu uygulayacaksınız.
MainWindow.xaml dosyasını açın.
Aşağıdaki XAML'de gösterildiği gibi, denetimlerin StackPanel her birinde ve Drop olayları için DragOver işleyiciler ekleyin. Olay işleyicisini DragOver ve
panel_DragOver
olay işleyicisinipanel_Drop
olarak adlandırınDrop.Varsayılan olarak, paneller hedef bırakmaz. Bunları etkinleştirmek için özelliğini her iki panele de ekleyin AllowDrop ve değerini olarak
true
ayarlayın.<StackPanel Grid.Column="0" Background="Beige" AllowDrop="True" DragOver="panel_DragOver" Drop="panel_Drop"> <TextBox Width="Auto" Margin="2" Text="green"/> <local:Circle Margin="2" /> <local:Circle Margin="2" /> </StackPanel> <StackPanel Grid.Column="1" Background="Bisque" AllowDrop="True" DragOver="panel_DragOver" Drop="panel_Drop"> </StackPanel>
MainWindows.xaml.cs veya MainWindow.xaml.vb dosyasını açın.
Olay işleyicisi DragOver için aşağıdaki kodu ekleyin.
private void panel_DragOver(object sender, DragEventArgs e) { if (e.Data.GetDataPresent("Object")) { // These Effects values are used in the drag source's // GiveFeedback event handler to determine which cursor to display. if (e.KeyStates == DragDropKeyStates.ControlKey) { e.Effects = DragDropEffects.Copy; } else { e.Effects = DragDropEffects.Move; } } }
Private Sub panel_DragOver(ByVal sender As System.Object, ByVal e As System.Windows.DragEventArgs) If e.Data.GetDataPresent("Object") Then ' These Effects values are used in the drag source's ' GiveFeedback event handler to determine which cursor to display. If e.KeyStates = DragDropKeyStates.ControlKey Then e.Effects = DragDropEffects.Copy Else e.Effects = DragDropEffects.Move End If End If End Sub
Bu DragOver olay işleyicisi aşağıdaki görevleri gerçekleştirir:
Sürüklenen verilerin Circle kullanıcı denetimi tarafından içinde DataObject paketlenmiş ve çağrısına geçirilen "Nesne" verilerini içerdiğini DoDragDropdenetler.
"Nesne" verileri varsa, Ctrl tuşuna basılıp basılmadığını denetler.
Ctrl tuşuna basıldığında özelliği olarak CopyayarlanırEffects. Aksi takdirde özelliğini olarak MoveayarlayınEffects.
Olay işleyicisi Drop için aşağıdaki kodu ekleyin.
private void panel_Drop(object sender, DragEventArgs e) { // If an element in the panel has already handled the drop, // the panel should not also handle it. if (e.Handled == false) { Panel _panel = (Panel)sender; UIElement _element = (UIElement)e.Data.GetData("Object"); if (_panel != null && _element != null) { // Get the panel that the element currently belongs to, // then remove it from that panel and add it the Children of // the panel that its been dropped on. Panel _parent = (Panel)VisualTreeHelper.GetParent(_element); if (_parent != null) { if (e.KeyStates == DragDropKeyStates.ControlKey && e.AllowedEffects.HasFlag(DragDropEffects.Copy)) { Circle _circle = new Circle((Circle)_element); _panel.Children.Add(_circle); // set the value to return to the DoDragDrop call e.Effects = DragDropEffects.Copy; } else if (e.AllowedEffects.HasFlag(DragDropEffects.Move)) { _parent.Children.Remove(_element); _panel.Children.Add(_element); // set the value to return to the DoDragDrop call e.Effects = DragDropEffects.Move; } } } } }
Private Sub panel_Drop(ByVal sender As System.Object, ByVal e As System.Windows.DragEventArgs) ' If an element in the panel has already handled the drop, ' the panel should not also handle it. If e.Handled = False Then Dim _panel As Panel = sender Dim _element As UIElement = e.Data.GetData("Object") If _panel IsNot Nothing And _element IsNot Nothing Then ' Get the panel that the element currently belongs to, ' then remove it from that panel and add it the Children of ' the panel that its been dropped on. Dim _parent As Panel = VisualTreeHelper.GetParent(_element) If _parent IsNot Nothing Then If e.KeyStates = DragDropKeyStates.ControlKey And _ e.AllowedEffects.HasFlag(DragDropEffects.Copy) Then Dim _circle As New Circle(_element) _panel.Children.Add(_circle) ' set the value to return to the DoDragDrop call e.Effects = DragDropEffects.Copy ElseIf e.AllowedEffects.HasFlag(DragDropEffects.Move) Then _parent.Children.Remove(_element) _panel.Children.Add(_element) ' set the value to return to the DoDragDrop call e.Effects = DragDropEffects.Move End If End If End If End If End Sub
Bu Drop olay işleyicisi aşağıdaki görevleri gerçekleştirir:
Olayın zaten işlenip işlenmediğini Drop denetler. Örneğin, bir Daire olayı işleyen başka bir Daireye Drop bırakılırsa, Daire içeren panelin de bunu işlemesini istemezsiniz.
Drop Olay işlenmezse, Ctrl tuşuna basılıp basılmadığını denetler.
Olduğunda Ctrl tuşuna basılırsaDrop, Daire denetiminin bir kopyasını alır ve koleksiyonuna ChildrenStackPanelekleyin.
Ctrl tuşuna basılmazsa, Daireyi üst panelinin Children koleksiyonundan Children bırakıldığı panelin koleksiyonuna taşır.
Effects Bir taşıma veya kopyalama işleminin gerçekleştirilip gerçekleştirilmediğini yöntemine DoDragDrop bildirmek için özelliğini ayarlar.
Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın.
içinden metni
green
TextBoxseçin.Metni Daire denetiminin üzerine sürükleyip bırakın.
Sol panelden bir Daire denetimini sağ panele sürükleyip bırakın. Daire, sol panelin Children koleksiyonundan kaldırılır ve sağ panelin Alt öğeler koleksiyonuna eklenir.
Bir Daire denetimini, içinde olduğu panelden diğer panele sürükleyin ve Ctrl tuşuna basarken bırakın. Daire kopyalanır ve kopya alıcı panelin Children koleksiyonuna eklenir.
Ayrıca bkz.
.NET Desktop feedback
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin