Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Den här genomgången visar hur du skapar en anpassad användarkontroll som kan delta i dra och släpp-dataöverföring i Windows Presentation Foundation (WPF).
I den här genomgången skapar du en anpassad WPF UserControl som representerar en cirkelform. Du implementerar funktioner på kontrollen för att aktivera dataöverföring via dra och släpp. Om du till exempel drar från en cirkelkontroll till en annan kopieras Fyllningsfärgdata från källcirkeln till målet. Om du drar från en Cirkel-kontroll till en TextBox kopieras strängrepresentationen av fyllnadsfärgen till TextBox. Du skapar också ett litet program som innehåller två panelkontroller och ett TextBox för att testa dra och släpp-funktionerna. Du kommer att skriva kod som gör det möjligt för panelerna att bearbeta släppta Cirkeldata, vilket gör att du kan flytta eller kopiera Cirklar från en panels barnsamling till en annan.
I den här genomgången tas följande aktiviteter upp:
Skapa en anpassad användarkontroll.
Aktivera användarkontrollen för att den ska bli en dragkälla.
Aktivera användarkontrollen som ett släppmål.
Aktivera en panel för att ta emot data som tagits bort från användarkontrollen.
Förutsättningar
Du behöver Visual Studio för att slutföra den här genomgången.
Skapa programprojektet
I det här avsnittet skapar du programinfrastrukturen, som innehåller en huvudsida med två paneler och en TextBox.
Skapa ett nytt WPF-programprojekt i Visual Basic eller Visual C# med namnet
DragDropExample. Mer information finns i Genomgång: Mitt första WPF-skrivbordsprogram.Öppna MainWindow.xaml.
Lägg till följande markering mellan de inledande och avslutande Grid-taggarna.
Den här markeringen skapar användargränssnittet för testprogrammet.
<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>
Lägga till en ny användarkontroll i projektet
I det här avsnittet lägger du till en ny användarkontroll i projektet.
På Projekt-menyn väljer du Lägg till användarkontroll.
I dialogrutan Lägg till nytt objekt ändrar du namnet till
Circle.xamloch klickar på Lägg till.Circle.xaml och dess kod bakom läggs till i projektet.
Öppna Circle.xaml.
Den här filen innehåller användargränssnittselementen i användarkontrollen.
Lägg till följande markering i roten Grid för att skapa en enkel användarkontroll som har en blå cirkel som användargränssnitt.
<Ellipse x:Name="circleUI" Height="100" Width="100" Fill="Blue" />Öppna Circle.xaml.cs eller Circle.xaml.vb.
I C# lägger du till följande kod efter den parameterlösa konstruktorn för att skapa en kopieringskonstruktor. I Visual Basic lägger du till följande kod för att skapa både en parameterlös konstruktor och en kopieringskonstruktor.
För att tillåta att användarkontrollen kopieras lägger du till en kopieringskonstruktormetod i filen bakom koden. I den förenklade Cirkel-användarkontrollen kopierar du endast fyllningen och storleken på användarkontrollen.
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
Lägg till användarkontrollen i huvudfönstret
Öppna MainWindow.xaml.
Lägg till följande XAML i den inledande Window taggen för att skapa en XML-namnområdesreferens till det aktuella programmet.
xmlns:local="clr-namespace:DragDropExample"I den första StackPanellägger du till följande XAML för att skapa två instanser av circle-användarkontrollen i den första panelen.
<local:Circle Margin="2" /> <local:Circle Margin="2" />Hela XAML för panelen ser ut så hä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>
Implementera dra och släpp-händelser i användarkontrollen
I det här avsnittet åsidosätter OnMouseMove du metoden och initierar dra och släpp-åtgärden.
Om ett drag startas (en musknapp trycks in och musen flyttas) kommer du att paketera data som ska överföras till en DataObject. I det här fallet paketeras tre dataobjekt i circle-kontrollen. en strängrepresentation av dess fyllningsfärg, en dubbel representation av dess höjd och en kopia av sig själv.
Initiera en dra och släpp-operation
Öppna Circle.xaml.cs eller Circle.xaml.vb.
Lägg till följande OnMouseMove åsidosättning för att tillhandahålla klasshantering för MouseMove händelsen.
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 SubDen här OnMouseMove åsidosättningen utför följande uppgifter:
Kontrollerar om den vänstra musknappen trycks in medan musen flyttas.
Paketera Cirkeldata till en DataObject. I det här fallet paketerar Cirkelkontrollen tre dataobjekt: en strängrepresentation av sin fyllningsfärg, ett dubbeltal som representerar dess höjd och en kopia av sig själv.
Anropar den statiska DragDrop.DoDragDrop metoden för att initiera dra och släpp-åtgärden. Du skickar följande tre parametrar till DoDragDrop metoden:
dragSource– En referens till den här kontrollen.data– Den DataObject som skapades i föregående kod.allowedEffects– De tillåtna dra och släpp-åtgärderna, som är Copy eller Move.
Tryck på F5 för att skapa och köra programmet.
Klicka på en av cirkelkontrollerna och dra den över panelerna, den andra cirkeln och TextBox. När du drar över TextBoxändras markören för att indikera en flytt.
När du drar en cirkel över TextBoxtrycker du på Ctrl-tangenten . Observera hur markören ändras för att visa en kopia.
Dra och släpp en cirkel till TextBox. Strängrepresentationen av cirkelns fyllningsfärg läggs till i TextBox.
Som standard ändras markören under en dra-och-släpp-åtgärd för att ange vilken effekt det kommer att få att släppa data. Du kan anpassa feedbacken som ges till användaren genom att hantera GiveFeedback händelsen och ange en annan markör.
Ge feedback till användaren
Öppna Circle.xaml.cs eller Circle.xaml.vb.
Lägg till följande OnGiveFeedback åsidosättning för att tillhandahålla klasshantering för GiveFeedback händelsen.
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 SubDen här OnGiveFeedback åsidosättningen utför följande uppgifter:
Tryck på F5 för att skapa och köra programmet.
Dra en av Circle-kontrollerna över panelerna, den andra Circle och TextBox. Observera att pekarna nu är de anpassade pekare som du angav i åsidosättningen OnGiveFeedback.
Välj texten
greenfrån TextBox.greenDra texten till en cirkelkontroll. Observera att standardmarkörerna visas för att indikera effekterna av dra och släpp-åtgärden. Feedbackmarkören anges alltid av drakällan.
Implementera släppmålhändelser i användarkontrollen
I det här avsnittet anger du att användarkontrollen är ett släppmål, åsidosätter de metoder som gör att användarkontrollen kan vara ett släppmål och bearbetar de data som tas bort på den.
Så här aktiverar du användarkontrollen som ett släppmål
Öppna Circle.xaml.
I den inledande UserControl taggen lägger du till AllowDrop egenskapen och anger den till
true.<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">
Metoden OnDrop anropas när AllowDrop egenskapen är inställd true på och data från dra-källan tas bort i circle-användarkontrollen. I den här metoden bearbetar du de data som togs bort och tillämpar data på cirkeln.
Bearbeta borttagna data
Öppna Circle.xaml.cs eller Circle.xaml.vb.
Lägg till följande OnDrop åsidosättning för att tillhandahålla klasshantering för Drop händelsen.
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 SubDen här OnDrop åsidosättningen utför följande uppgifter:
GetDataPresent Använder metoden för att kontrollera om de data som dras innehåller ett strängobjekt.
GetData Använder metoden för att extrahera strängdata om de finns.
Använder en BrushConverter för att försöka konvertera strängen till en Brush.
Om konverteringen lyckas, tillämpas penseln på Fill i Ellipse som tillhandahåller användargränssnittet för cirkelkontrollen.
Markerar händelsen Drop som hanterad. Du bör markera drop-händelsen som hanterad så att andra element som tar emot den här händelsen vet att Circle-användarkontrollen hanterade den.
Tryck på F5 för att skapa och köra programmet.
Markera texten
greeni TextBox.Dra texten till en cirkelkontroll och släpp den. Cirkeln ändras från blått till grönt.
Skriv texten
greeni TextBox.Markera texten
grei TextBox.Dra den till en cirkelkontroll och släpp den. Observera att markören ändras för att indikera att släppet tillåts, men färgen på cirkeln ändras inte eftersom
greden inte är en giltig färg.Dra från den gröna cirkelkontrollen och släpp på den blå cirkelkontrollen. Cirkeln ändras från blått till grönt. Observera att vilken markör som visas beror på om TextBox eller cirkeln är dragkällan.
Genom att ställa in egenskapen till AllowDrop och bearbeta de släppta data är allt som krävs för att ett element ska kunna fungera som ett släppmål. Men för att ge en bättre användarupplevelse bör du även hantera DragEnterhändelserna , DragLeaveoch DragOver . I dessa händelser kan du utföra kontroller och ge ytterligare feedback till användaren innan data tas bort.
När data dras över circle-användarkontrollen bör kontrollen meddela dragkällan om den kan bearbeta de data som dras. Om kontrollen inte vet hur data ska bearbetas bör den neka att de tas bort. För att göra detta ska du hantera DragOver-händelsen och ställa in Effects-egenskapen.
Så här kontrollerar du att datadroppen är tillåten
Öppna Circle.xaml.cs eller Circle.xaml.vb.
Lägg till följande OnDragOver åsidosättning för att tillhandahålla klasshantering för DragOver händelsen.
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 SubDen här OnDragOver åsidosättningen utför följande uppgifter:
Tryck på F5 för att skapa och köra programmet.
Markera texten
grei TextBox.Dra texten till ett kontrollfönster i form av en cirkel. Observera att markören nu ändras för att indikera att släppet inte är tillåtet eftersom
greinte är en giltig färg.
Du kan förbättra användarupplevelsen ytterligare genom att använda en förhandsversion av släppåtgärden. För användarkontrollen Circle kommer du att åsidosätta metoderna OnDragEnter och OnDragLeave. När data dras över kontrollen sparas den aktuella bakgrunden Fill i en platshållarvariabel. Strängen konverteras sedan till en pensel och appliceras på Ellipse, som tillhandahåller cirkelns användargränssnitt. Om data dras ut ur cirkeln utan att tappas, tillämpas det ursprungliga Fill värdet på cirkeln igen.
Förhandsgranska effekterna av dra och släpp-åtgärden
Öppna Circle.xaml.cs eller Circle.xaml.vb.
I klassen Circle deklarerar du en privat Brush variabel med namnet
_previousFilloch initierar den tillnull.public partial class Circle : UserControl { private Brush _previousFill = null;Public Class Circle Private _previousFill As Brush = NothingLägg till följande OnDragEnter åsidosättning för att tillhandahålla klasshantering för DragEnter händelsen.
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 SubDen här OnDragEnter åsidosättningen utför följande uppgifter:
Lägg till följande OnDragLeave åsidosättning för att tillhandahålla klasshantering för DragLeave händelsen.
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 SubDen här OnDragLeave åsidosättningen utför följande uppgifter:
Tryck på F5 för att skapa och köra programmet.
Markera texten
greeni TextBox.Dra texten över en cirkelkontroll utan att släppa den. Cirkeln ändras från blått till grönt.
Dra bort texten från cirkelkontrollen. Cirkeln ändras från grön tillbaka till blå.
Aktivera en panel för att ta emot borttagna data
I det här avsnittet gör du det möjligt för panelerna som är värdar för Circle-användarkontrollerna att fungera som släppmål för dragna Circle-data. Du implementerar kod som gör att du kan flytta en cirkel från en panel till en annan, eller att göra en kopia av en cirkelkontroll genom att hålla ned Ctrl-tangenten medan du drar och släpper en cirkel.
Öppna MainWindow.xaml.
Som det visas i följande XAML, lägg till hanterare för StackPanel och DragOver händelserna i var och en av Drop kontrollerna. Döp händelsehanteraren DragOver till
panel_DragOver, och döp händelsehanteraren Drop tillpanel_Drop.Som standard är panelerna inte släppmål. Om du vill aktivera dem lägger du till egenskapen i AllowDrop båda panelerna och anger värdet till
true.<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>Öppna MainWindows.xaml.cs eller MainWindow.xaml.vb.
Lägg till följande kod för DragOver händelsehanteraren.
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 SubDen här DragOver händelsehanteraren utför följande uppgifter:
Kontrollerar att de data som dras innehåller objektdata som paketerats i DataObject av circle-användarkontrollen och som skickades i anropet till DoDragDrop.
Om "Objekt"-data finns kontrollerar du om Ctrl-tangenten är nedtryckt.
Om Ctrl-tangenten trycks ned, ställs Effects egenskapen in på Copy. Annars anger du egenskapen Effects till Move.
Lägg till följande kod för Drop händelsehanteraren.
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 SubDen här Drop händelsehanteraren utför följande uppgifter:
Kontrollerar om händelsen Drop redan har hanterats. Om en cirkel till exempel släpps Drop på en annan cirkel som hanterar händelsen, vill du inte att panelen som innehåller den första cirkeln också ska hantera händelsen.
Om händelsen Drop inte hanteras kontrollerar du om Ctrl-tangenten är nedtryckt.
Om Ctrl-tangenten trycks ned när det Drop händer gör du en kopia av cirkelkontrollen och lägger till den i Children samlingen av .StackPanel
Om Ctrl-tangenten inte trycks ned flyttar du Cirkeln från samlingen för den Children överordnade panelen till samlingen Children av panelen som den släpptes på.
Anger egenskapen Effects för att meddela DoDragDrop metoden om en flytt- eller kopieringsåtgärd utfördes.
Tryck på F5 för att skapa och köra programmet.
Välj texten
greenfrån TextBox.Dra texten över en cirkelkontroll och släpp den.
Dra en Cirkel-kontroll från den vänstra panelen till den högra panelen och släpp den. Cirkeln tas bort från samlingen Children i den vänstra panelen och läggs till i samlingen Children i den högra panelen.
Dra en Cirkel-kontroll från panelen som den är i till den andra panelen och släpp den medan du trycker på Ctrl-tangenten. Cirkeln kopieras och kopian läggs till i Children samlingen i den mottagande panelen.
Se även
.NET Desktop feedback