Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento názorný postup ukazuje, jak vytvořit vlastní uživatelský ovládací prvek, který se může účastnit přenosu dat přetažením ve Windows Presentation Foundation (WPF).
V tomto průvodci vytvoříte vlastní WPF UserControl, který představuje kruhový obrazec. Na ovládacím prvku implementujete funkce pro povolení přenosu dat přetažením. Pokud například přetáhnete z jednoho ovládacího prvku Kruh do druhého, zkopírují se barevná data výplně ze zdrojového kruhu do cíle. Pokud přetáhnete ovládací prvek Kruh z TextBox na TextBox, zkopíruje se textové vyjádření barvy výplně. Vytvoříte také malou aplikaci, která obsahuje dva ovládací prvky panelu a TextBox k otestování funkce přetažení. Napíšete kód, který umožní panelům zpracovávat upuštěná data Circle, což vám umožní přesunout nebo zkopírovat Circle z kolekce Děti jednoho panelu do druhého.
Tento návod popisuje následující kroky:
Vytvořte vlastní uživatelský ovládací prvek.
Umožněte, aby uživatelský ovládací prvek sloužil jako zdroj přetažení.
Povolte uživatelskému ovládacímu prvku stát se cílem přetažení.
Umožňuje panelu přijímat data přenesená z ovládacího prvku.
Požadavky
K dokončení tohoto návodu potřebujete Visual Studio.
Vytvoření projektu aplikace
V této části vytvoříte infrastrukturu aplikace, která obsahuje hlavní stránku se dvěma panely a .TextBox
Vytvořte nový projekt aplikace WPF v jazyce Visual Basic nebo Visual C# s názvem
DragDropExample. Další informace naleznete v tématu Návod: Moje první desktopová aplikace WPF.Otevřete MainWindow.xaml.
Přidejte následující kód mezi otevírací a uzavírací Grid značky.
Tento kód vytvoří uživatelské rozhraní pro testovací aplikaci.
<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>
Přidání nového uživatelského ovládacího prvku do projektu
V této části přidáte do projektu nový uživatelský ovládací prvek.
V nabídce Projekt vyberte Přidat uživatelský ovládací prvek.
V dialogovém okně Přidat novou položku změňte název na
Circle.xamla klepněte na tlačítko Přidat.Do projektu je přidáno Circle.xaml a jeho související kód.
Otevřete Circle.xaml.
Tento soubor bude obsahovat prvky uživatelského rozhraní ovládacích prvků.
Přidáním následujícího kódu do kořenového adresáře Grid vytvořte jednoduchý uživatelský ovládací prvek, který má modrý kruh jako uživatelské rozhraní.
<Ellipse x:Name="circleUI" Height="100" Width="100" Fill="Blue" />Otevřete Circle.xaml.cs nebo Circle.xaml.vb.
V jazyce C# přidejte následující kód za konstruktor bez parametrů, abyste vytvořili konstruktor kopírování. V jazyce Visual Basic přidejte následující kód pro vytvoření konstruktoru bez parametrů i konstruktoru kopírování.
Chcete-li povolit kopírování uživatelského ovládacího prvku, přidáte do souboru kódu metodu konstruktoru kopírování. Ve zjednodušeném uživatelském ovládacím prvku Circle zkopírujete pouze výplň a velikost uživatelského ovládacího prvku.
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
Přidání uživatelského ovládacího prvku do hlavního okna
Otevřete MainWindow.xaml.
Přidejte následující kód XAML do počáteční Window značky a vytvořte odkaz na obor názvů XML pro aktuální aplikaci.
xmlns:local="clr-namespace:DragDropExample"V prvním StackPanelkroku přidejte následující XAML pro vytvoření dvou instancí uživatelského ovládacího prvku Circle na prvním panelu.
<local:Circle Margin="2" /> <local:Circle Margin="2" />Úplný kód XAML pro panel vypadá následovně.
<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>
Implementace událostí zdroje přetahování v uživatelském ovládacím prvku
V této části přepíšete metodu OnMouseMove a zahájíte operaci přetažení.
Pokud se spustí přetažení (stisknete tlačítko myši a přesune se myš), zabalíte data, která se mají přenést do objektu DataObject. V tomto případě bude ovládací prvek Circle zabalovat tři datové položky; řetězcové znázornění barvy výplně, dvojité znázornění jeho výšky a kopie sebe sama.
Jak zahájit operaci přetažení
Otevřete Circle.xaml.cs nebo Circle.xaml.vb.
Přidejte následující OnMouseMove přepsání, které zajistí zpracování tříd pro MouseMove událost.
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 SubToto OnMouseMove překrytí provádí následující úkoly:
Zkontroluje, jestli je levé tlačítko myši při přesouvání stisknuto.
Zabaluje data kruhu do DataObject. V tomto případě ovládací prvek Circle zabalí tři datové položky; řetězcové znázornění barvy výplně, dvojité znázornění jeho výšky a kopie sebe sama.
Statickou metodu DragDrop.DoDragDrop zavolá, aby zahájila operaci drag-and-drop. Metodě předáte následující tři parametry DoDragDrop :
dragSource– Odkaz na tento ovládací prvek.data– Vytvořeno DataObject v předchozím kódu.allowedEffects– Povolené operace přetažení jsou Copy nebo Move.
Stisknutím klávesy F5 sestavte a spusťte aplikaci.
Klikněte na jeden z ovládacích prvků Kruh a přetáhněte ho přes panely, druhý kruh a TextBoxtlačítko . Když ho TextBoxpřetáhnete, kurzor se změní tak, aby označil přesunutí.
Při přetahování kruhu přes TextBox, stiskněte klávesu Ctrl. Všimněte si, jak se kurzor změní, aby označí kopii.
Přetáhněte objekt Kruh na TextBox. Řetězcová reprezentace barvy výplně kruhu je připojena k TextBox.
Ve výchozím nastavení se kurzor během operace přetažení změní, aby indikoval, jaký efekt bude mít upuštění dat. Zpětnou vazbu, kterou uživatel poskytl, můžete přizpůsobit zpracováním GiveFeedback události a nastavením jiného kurzoru.
Pošlete uživateli zpětnou vazbu
Otevřete Circle.xaml.cs nebo Circle.xaml.vb.
Přidejte následující OnGiveFeedback přepsání, které zajistí zpracování tříd pro GiveFeedback událost.
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 SubToto OnGiveFeedback překrytí provádí následující úkoly:
Stisknutím klávesy F5 sestavte a spusťte aplikaci.
Přetáhněte jeden z ovládacích prvků Kruh přes panely, druhý kruh a TextBoxtlačítko . Všimněte si, že kurzory jsou teď vlastními kurzory, které jste zadali v přepsání OnGiveFeedback .
Vyberte text
greenz pole TextBox.Přetáhněte text
greendo ovládacího prvku kruh. Všimněte si, že se zobrazí výchozí kurzory, které označují účinky operace přetažení myší. Kurzor zpětné vazby je vždy nastaven zdrojem přetažení.
Implementace událostí na cílovém objektu přetažení v uživatelském ovládacím prvku
V této části určíte, že uživatelský ovládací prvek je cílem přetažení, přepíšete metody tak, aby umožnily, aby uživatelský ovládací prvek byl cílem přetažení, a zpracujete data, která jsou na něj přetažena.
Povolení, aby uživatelský ovládací prvek byl cílem pro vyřazení
Otevřete Circle.xaml.
Do počáteční UserControl značky přidejte AllowDrop vlastnost a nastavte ji na
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">
Metoda OnDrop se volá, když je vlastnost AllowDrop nastavena na true a data ze zdroje přetažení jsou umístěna do uživatelského ovládacího prvku Circle. V této metodě zpracujete data, která byla vyřazena, a použijete je na Kroužek.
Ke zpracování ztracených dat
Otevřete Circle.xaml.cs nebo Circle.xaml.vb.
Přidejte následující OnDrop přepsání, které zajistí zpracování tříd pro Drop událost.
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 SubToto OnDrop překrytí provádí následující úkoly:
GetDataPresent Pomocí metody zkontroluje, jestli přetažená data obsahují objekt řetězce.
Používá metodu GetData k extrahování řetězcových dat, pokud jsou k dispozici.
Používá BrushConverter k pokusu o převod řetězce na Brush.
Pokud je převod úspěšný, použije štětec na FillEllipse, který poskytuje uživatelské rozhraní kruhového ovladače.
Drop Označí událost jako zpracovanou. Událost přetažení byste měli označit jako zpracovanou, aby ostatní prvky, které tuto událost obdrží, věděly, že uživatelské ovládání Circle ji zpracovalo.
Stisknutím klávesy F5 sestavte a spusťte aplikaci.
Vyberte text
greenv TextBox.Přetáhněte text do ovládacího prvku kruh a pusťte ho. Kruh se změní z modré na zelenou.
Zadejte text
greendo pole TextBox.Vyberte text
grev TextBox.Přetáhněte ho do ovládacího prvku "Kruh" a pusťte ho. Všimněte si, že kurzor se změní tak, aby značil, že je povolené přetažení, ale barva kruhu se nezmění, protože
grenení platná barva.Přetáhněte ze zeleného ovládacího prvku Kruh a pusťte ho na modrý ovládací prvek Kruh. Kruh se změní z modré na zelenou. Všimněte si, že zobrazený kurzor závisí na tom, zda je zdrojem přetažení TextBox nebo Kruh.
Nastavení vlastnosti AllowDrop na true a zpracování přetažených dat je vše, co je nutné k tomu, aby byl element povolen jako cíl přetažení. Chcete-li však zajistit lepší uživatelské prostředí, měli byste také zpracovat DragEnter, DragLeavea DragOver události. V těchto událostech můžete před vyřazením dat provést kontroly a poskytnout uživateli další zpětnou vazbu.
Když jsou data přetažena přes uživatelský ovládací prvek Circle, měl by ovládací prvek upozornit zdroj přetažení, zda může zpracovávat data, která jsou přetažena. Pokud ovládací prvek neví, jak zpracovat data, měl by odmítnout pokles. Provedete to tak, že zpracujete DragOver událost a nastavíte Effects vlastnost.
Ověření, že je povolené vyřazení dat
Otevřete Circle.xaml.cs nebo Circle.xaml.vb.
Přidejte následující OnDragOver přepsání, které zajistí zpracování tříd pro DragOver událost.
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 SubToto OnDragOver překrytí provádí následující úkoly:
Stisknutím klávesy F5 sestavte a spusťte aplikaci.
Vyberte text
grev TextBox.Přetáhněte text do ovládacího prvku Kruh. Všimněte si, že kurzor se teď změní a naznačuje, že přetažení není povoleno, protože
grenení platná barva.
Uživatelské prostředí můžete dále vylepšit použitím náhledu operace vyřazení. U uživatelského ovládacího prvku Circle přepíšete metody OnDragEnter a OnDragLeave. Když jsou data přetažena přes ovládací prvek, aktuální pozadí Fill se uloží do zástupné proměnné. Řetězec se pak převede na štětec a aplikuje se na Ellipse, který zajišťuje uživatelské rozhraní Kruhu. Pokud jsou data přetažena z Kruhu, aniž by byla upuštěna, původní Fill hodnota se znovu aplikuje na Kruh.
Zobrazit náhled efektů operace přetažení
Otevřete Circle.xaml.cs nebo Circle.xaml.vb.
Ve třídě Circle deklarujte privátní Brush proměnnou s názvem
_previousFilla inicializujete ji nanull.public partial class Circle : UserControl { private Brush _previousFill = null;Public Class Circle Private _previousFill As Brush = NothingPřidejte následující OnDragEnter přepsání, které zajistí zpracování tříd pro DragEnter událost.
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 SubToto OnDragEnter překrytí provádí následující úkoly:
Přidejte následující OnDragLeave přepsání, které zajistí zpracování tříd pro DragLeave událost.
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 SubToto OnDragLeave překrytí provádí následující úkoly:
Stisknutím klávesy F5 sestavte a spusťte aplikaci.
Vyberte text
greenv TextBox.Přetáhněte text přes ovládací prvek kruh, aniž byste ho upustili. Kruh se změní z modré na zelenou.
Přetáhněte text mimo ovládací prvek Kruh. Kruh se změní ze zelené na modrou.
Povolení panelu pro příjem přetažených dat
V této části povolíte panely, které hostují uživatelské ovládací prvky Circle, aby fungovaly jako cílové destinace pro přetažení dat Circle. Implementujete kód, který vám umožní přesunout kruh z jednoho panelu do druhého nebo vytvořit kopii ovládacího prvku Kruh podržením klávesy Ctrl a přetažením kruhu.
Otevřete MainWindow.xaml.
Jak je znázorněno v následujícím kódu XAML, v každém z ovládacích prvků StackPanel přidejte obslužné rutiny pro události DragOver a Drop. Pojmenujte obslužnou rutinu DragOver,
panel_DragOverudálosti a pojmenujte obslužnou rutinu Drop,panel_Dropudálosti.Výchozí nastavení neumožňuje, aby panely byly cílovými oblastmi pro přesun. Chcete-li je povolit, přidejte AllowDrop vlastnost na oba panely a nastavte hodnotu na
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>Otevřete MainWindows.xaml.cs nebo MainWindow.xaml.vb.
Přidejte následující kód pro obslužnou rutinu DragOver události.
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 SubTato DragOver obslužná rutina události provádí následující úlohy:
Kontroluje, zda přetažená data obsahují data "Object", která byla zabalena v DataObject uživatelském ovládacím prvku Circle a předána DoDragDropvolání .
Pokud jsou k dispozici data "Objekt", zkontroluje, zda je stisknuta klávesa Ctrl .
Pokud je stisknuta klávesa Ctrl , nastaví Effects vlastnost na Copyhodnotu . V opačném případě nastavte Effects vlastnost na Movehodnotu .
Přidejte následující kód pro obslužnou rutinu Drop události.
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 SubTato Drop obslužná rutina události provádí následující úlohy:
Zkontroluje, jestli Drop už byla událost zpracována. Pokud je například kruh vyřazen do jiného kruhu, který zpracovává Drop událost, nechcete, aby panel obsahující kruh také zpracovával.
Drop Pokud se událost nezpracuje, zkontroluje, jestli je stisknutá klávesa Ctrl.
Pokud je klávesa Ctrl stisknuta, když dojde k Drop, vytvoří se kopie ovládacího prvku Circle a přidá se do kolekce Children objektu StackPanel.
Pokud není stisknutá klávesa Ctrl , přesune kruh z Children kolekce nadřazeného panelu do Children kolekce panelu, na který byl vyřazen.
Effects Nastaví vlastnost tak, aby upozornila metodu DoDragDrop, zda byla provedena operace přesunutí nebo kopírování.
Stisknutím klávesy F5 sestavte a spusťte aplikaci.
Vyberte text
greenz pole TextBox.Přetáhněte text přes ovládací prvek Kruh a pusťte ho.
Přetáhněte ovládací prvek Kruh z levého panelu do pravého panelu a pusťte ho. Kruh je odstraněn z kolekce levého panelu a přidán do kolekce Děti pravého panelu.
Přetáhněte ovládací prvek Kruh z panelu, který je na druhém panelu, a podržte stisknutou klávesu Ctrl. Kruh se zkopíruje a kopie se přidá do Children kolekce přijímajícího panelu.
Viz také
.NET Desktop feedback