Přehled přetažení
Toto téma obsahuje přehled podpory přetažení v aplikacích WINDOWS Presentation Foundation (WPF). Přetažení obvykle odkazuje na metodu přenosu dat, která zahrnuje použití myši (nebo jiného odkazujícího zařízení) k výběru jednoho nebo více objektů, přetažení těchto objektů přes požadovaný cíl přetažení v uživatelském rozhraní a jejich vyřazení.
Podpora přetažení ve WPF
Operace přetažení obvykle zahrnují dvě strany: zdroj přetažení, ze kterého pochází přetažený objekt, a cíl přetažení, který přijímá vynechaný objekt. Cílem přetažení zdroje a přetažení může být prvky uživatelského rozhraní ve stejné aplikaci nebo jiné aplikaci.
Typ a počet objektů, se kterými lze manipulovat pomocí přetažení, je zcela libovolný. Například soubory, složky a výběry obsahu jsou některé z nejběžnějších objektů manipulovaných pomocí operací přetažení.
Konkrétní akce prováděné během operace přetažení jsou specifické pro aplikaci a často se určují podle kontextu. Například přetažení výběru souborů z jedné složky do jiné na stejném úložném zařízení přesune soubory ve výchozím nastavení, zatímco přetažení souborů ze sdílené složky UNC (Universal Naming Convention) do místní složky soubory ve výchozím nastavení zkopíruje.
Zařízení podporující přetahování, která poskytuje WPF, jsou navržená tak, aby byla vysoce flexibilní a přizpůsobitelná tak, aby podporovala širokou škálu scénářů přetažení. Přetažení podporuje manipulaci s objekty v rámci jedné aplikace nebo mezi různými aplikacemi. Přetažení mezi aplikacemi WPF a jinými aplikacemi pro Windows je také plně podporováno.
Ve WPF se každý UIElement nebo ContentElement může účastnit přetahování myší. Události a metody vyžadované pro operace přetažení jsou definovány ve DragDrop třídě. ContentElement Třídy UIElement obsahují aliasy pro DragDrop připojené události, aby se události zobrazovaly v seznamu členů třídy, pokud je UIElement prvek nebo ContentElement zděděný jako základní prvek. Obslužné rutiny událostí připojené k těmto událostem jsou připojené k podkladové DragDrop připojené události a přijímají stejnou instanci dat události. Další informace najdete v UIElement.Drop události.
Důležité
Přetažení ole nefunguje v zóně Internetu.
Přenos dat
Přetažení je součástí obecnější oblasti přenosu dat. Přenos dat zahrnuje operace přetažení a kopírování a vložení. Operace přetažení je analogická k operaci kopírování a vložení nebo vyjmutí a vložení, která se používá k přenosu dat z jednoho objektu nebo aplikace do jiné pomocí systémové schránky. Oba typy operací vyžadují:
Zdrojový objekt, který poskytuje data.
Způsob dočasného ukládání přenášených dat.
Cílový objekt, který přijímá data.
V operaci kopírování a vložení se systémová schránka používá k dočasnému ukládání přenášených dat; v operaci DataObject přetažení se používá k ukládání dat. Datový objekt se koncepčně skládá z jedné nebo více dvojic Object , které obsahují skutečná data, a odpovídajícího identifikátoru formátu dat.
Zdroj přetažení zahájí operaci přetažení voláním statické DragDrop.DoDragDrop metody a předáním přenášených dat do ní. Metoda DoDragDrop v případě potřeby automaticky zabalí data.DataObject Pro větší kontrolu nad formátem dat můžete data DataObject před předáním DoDragDrop metodě zabalit. Cíl vyřazení zodpovídá za extrakci dat z objektu DataObject. Další informace o práci s datovými objekty naleznete v tématu Data a datové objekty.
Zdrojem a cílem operace přetažení jsou prvky uživatelského rozhraní; data, která jsou skutečně přenášena, však obvykle nemají vizuální reprezentaci. Můžete napsat kód pro vizuální znázornění dat, která jsou přetažena, například při přetahování souborů v Průzkumníku Windows. Ve výchozím nastavení se uživateli poskytuje zpětná vazba tak, že změníte kurzor tak, aby představoval efekt, který bude mít operace přetažení na data, například jestli se data přesunou nebo zkopírují.
Efekty přetažení
Operace přetažení můžou mít různé účinky na přenášená data. Můžete například zkopírovat data nebo je můžete přesunout. WPF definuje DragDropEffects výčet, který můžete použít k určení efektu operace přetažení. Ve zdroji přetažení můžete určit efekty, které zdroj povolí v DoDragDrop metodě. V cíli přetažení můžete určit účinek, který cíl hodlá ve Effects vlastnosti DragEventArgs třídy. Když cíl přetažení určuje zamýšlený efekt v DragOver události, předají se informace zpět do zdroje přetažení v GiveFeedback události. Zdroj přetažení pomocí těchto informací informuje uživatele, jaký vliv má cíl přetažení na data. Když se data zahodí, cíl přetažení určuje jeho skutečný účinek v Drop události. Informace se předají zpět do zdroje přetažení jako návratová DoDragDrop hodnota metody. Pokud cíl přetažení vrátí efekt, který není v seznamu allowedEffects
zdrojů přetažení , operace přetažení se zruší bez jakéhokoli přenosu dat.
Je důležité si uvědomit, DragDropEffects že ve WPF se hodnoty používají pouze k zajištění komunikace mezi zdrojem přetažení a cílem přetažení, pokud jde o účinky operace přetažení. Skutečný účinek operace přetažení závisí na tom, že v aplikaci napíšete příslušný kód.
Cíl přetažení může například určit, že vlivem vyřazení dat na něj je přesunout data. Pokud však chcete přesunout data, musí se přidat do cílového prvku i odebrat ze zdrojového prvku. Zdrojový prvek může znamenat, že umožňuje přesunout data, ale pokud nezadáte kód pro odebrání dat ze zdrojového prvku, bude konečným výsledkem, že se data zkopírují a nepřesunou se.
Přetahování událostí
Operace přetažení podporují model řízený událostmi. Zdroj přetažení i cíl přetažení používají standardní sadu událostí pro zpracování operací přetažení. Následující tabulky shrnují standardní události přetažení myší. Jedná se o připojené události ve DragDrop třídě. Další informace o připojených událostech naleznete v tématu Přehled připojených událostí.
Přetažení zdrojových událostí
Událost | Shrnutí |
---|---|
GiveFeedback | K této události dochází nepřetržitě během operace přetažení a umožňuje zdroji přetažení poskytnout uživateli informace o zpětné vazbě. Tato zpětná vazba se běžně zobrazuje změnou vzhledu ukazatele myši tak, aby označí efekty povolené cílem přetažení. Jedná se o bublající událost. |
QueryContinueDrag | K této události dochází v případě, že během operace přetažení dojde ke změně stavu klávesnice nebo tlačítka myši a umožní zdroji přetažení zrušit operaci přetažení v závislosti na stavu klávesy nebo tlačítka. Jedná se o bublající událost. |
PreviewGiveFeedback | Verze tunelového propojení .GiveFeedback |
PreviewQueryContinueDrag | Verze tunelového propojení .QueryContinueDrag |
Vyřazení cílových událostí
Událost | Shrnutí |
---|---|
DragEnter | K této události dochází, když je objekt přetažen do hranice cíle přetažení. Jedná se o bublající událost. |
DragLeave | K této události dochází, když je objekt přetažen z hranice cíle přetažení. Jedná se o bublající událost. |
DragOver | K této události dochází nepřetržitě, když je objekt přetažen (přesunut) v rámci hranice cíle přetažení. Jedná se o bublající událost. |
Drop | K této události dochází, když je objekt v cíli přetažení. Jedná se o bublající událost. |
PreviewDragEnter | Verze tunelového propojení .DragEnter |
PreviewDragLeave | Verze tunelového propojení .DragLeave |
PreviewDragOver | Verze tunelového propojení .DragOver |
PreviewDrop | Verze tunelového propojení .Drop |
Chcete-li zpracovat události přetažení pro instance objektu, přidejte obslužné rutiny pro události uvedené v předchozích tabulkách. Chcete-li zpracovat události přetažení na úrovni třídy, přepište odpovídající virtuální metody On*Event a On*PreviewEvent. Další informace naleznete v tématu Zpracování tříd směrovaných událostí podle základních tříd ovládacího prvku.
Implementace přetažení
Prvek uživatelského rozhraní může být zdroj přetažení, cíl přetažení nebo obojí. Pokud chcete implementovat základní přetahování, napíšete kód, který zahájí operaci přetažení a zpracuje zahozená data. Možnosti přetažení můžete vylepšit zpracováním volitelných událostí přetažení.
Pokud chcete implementovat základní přetahování myší, dokončíte následující úlohy:
Identifikujte prvek, který bude zdrojem přetažení. Zdroj přetažení může být nebo UIElementContentElement.
Na zdroji přetažení vytvořte obslužnou rutinu události, která zahájí operaci přetažení. Událost je obvykle MouseMove událostí.
V obslužné rutině události přetažení zdroje zavolejte metodu DoDragDrop , která zahájí operaci přetažení. DoDragDrop Ve volání zadejte zdroj přetažení, data, která se mají přenést, a povolené efekty.
Identifikujte prvek, který bude cílem přetažení. Cíl přetažení může být UIElement nebo ContentElement.
V cíli přetažení nastavte AllowDrop vlastnost na
true
hodnotu .V cíli přetažení vytvořte obslužnou rutinu Drop události pro zpracování vynechaných dat.
V obslužné rutině Drop události extrahujte data z objektu DragEventArgs pomocí GetDataPresent metod a GetData metod.
V obslužné rutině Drop události použijte data k provedení požadované operace přetažení.
Implementaci přetažení můžete vylepšit vytvořením vlastního DataObject objektu a zpracováním volitelných událostí cíle přetažení zdroje a přetažení, jak je znázorněno v následujících úlohách:
Pokud chcete přenést vlastní data nebo více datových položek, vytvořte metoduDoDragDrop, která DataObject se má předat.
Chcete-li provést další akce během přetažení, úchyt DragEnter, DragOvera DragLeave události v cíli přetažení.
Pokud chcete změnit vzhled ukazatele myši, zpracujte GiveFeedback událost ve zdroji přetažení.
Pokud chcete změnit způsob zrušení operace přetažení, zpracujte QueryContinueDrag událost na zdroji přetažení.
Příklad přetažení
Tato část popisuje, jak implementovat přetažení pro Ellipse prvek. Jedná se Ellipse o zdroj přetažení i cíl přetažení. Přenášená data jsou řetězcová reprezentace vlastnosti tří teček Fill . Následující XAML ukazuje Ellipse element a události související s přetažením, které zpracovává. Kompletní kroky implementace přetažení naleznete v části Návod: Povolení přetažení na uživatelském ovládacím prvku.
<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" />
Povolení, aby prvek byl zdrojem přetažení
Objekt, který je zdrojem přetažení, je zodpovědný za:
Identifikace, kdy dojde k přetažení
Inicializování operace přetažení.
Identifikace přenášených dat
Určení efektů, které operace přetažení může mít na přenášených datech.
Zdroj přetažení může také uživateli poskytnout zpětnou vazbu týkající se povolených akcí (přesunutí, kopírování, žádný) a může operaci přetažení zrušit na základě dalšího uživatelského vstupu, například stisknutí klávesy ESC během přetažení.
Je zodpovědností vaší aplikace určit, kdy dojde k přetažení, a pak zahájit operaci přetažení voláním DoDragDrop metody. Obvykle je to v případě, že MouseMove dojde k události nad elementem, který se má přetáhnout, když je stisknuto tlačítko myši. Následující příklad ukazuje, jak zahájit operaci přetažení z MouseMove obslužné rutiny Ellipse události elementu, aby byl zdrojem přetažení. Přenášená data jsou řetězcová reprezentace vlastnosti tří teček Fill .
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
Uvnitř obslužné MouseMove rutiny události zavolejte metodu DoDragDrop , která zahájí operaci přetažení myší. Metoda DoDragDrop přebírá tři parametry:
dragSource
– Odkaz na objekt závislosti, který je zdrojem přenášených dat; to je obvykle zdroj MouseMove události.data
- Objekt, který obsahuje přenášená data zabalená do objektu DataObject.allowedEffects
– Jedna z hodnot výčtu DragDropEffects , která určuje povolené účinky operace přetažení.
Jakýkoli serializovatelný objekt lze předat v parametru data
. Pokud data ještě nejsou zabalená do DataObjectsouboru , automaticky se zabalí do nové DataObject. Pokud chcete předat více datových položek, musíte vytvořit DataObject sami sebe a předat je metodě DoDragDrop . Další informace naleznete v tématu Data a datové objekty.
Parametr allowedEffects
se používá k určení, co zdroj přetažení umožní cíli přetažení dělat s přenášenými daty. Společné hodnoty zdroje přetažení jsou Copy, Movea All.
Poznámka:
Cíl vyřazení také dokáže určit, jaké účinky hodlá v reakci na vyřazená data. Například pokud cíl přetažení nerozpozná datový typ, který má být vyřazen, může odmítnout data nastavením jeho povolených efektů .None Obvykle to dělá v obslužné DragOver rutině události.
Zdroj přetažení může volitelně zpracovat GiveFeedback události a QueryContinueDrag události. Tyto události mají výchozí obslužné rutiny, které se použijí, pokud události označíte jako zpracovávané. Tyto události obvykle budete ignorovat, pokud nemáte konkrétní potřebu změnit jejich výchozí chování.
Událost GiveFeedback je vyvolána nepřetržitě, zatímco je přetahován zdroj přetažení. Výchozí obslužná rutina této události zkontroluje, zda je zdroj přetažení přes platný cíl přetažení. Pokud ano, zkontroluje povolené účinky cíle přetažení. Potom poskytne koncovému uživateli zpětnou vazbu týkající se povolených efektů vyřazení. To se obvykle provádí změnou kurzoru myši na kurzor bez přetažení, kopírování nebo přesunutí kurzoru. Tuto událost byste měli zpracovat pouze v případě, že potřebujete k poskytnutí zpětné vazby uživateli použít vlastní kurzory. Pokud tuto událost zpracujete, nezapomeňte ji označit jako popisovanou, aby výchozí obslužná rutina nepřepsala vaši obslužnou rutinu.
Událost QueryContinueDrag je vyvolána nepřetržitě, zatímco je přetahován zdroj přetažení. Tuto událost můžete zpracovat, abyste zjistili, jaká akce ukončí operaci přetažení na základě stavu kláves ESC, SHIFT, CTRL a ALT a stavu tlačítek myši. Výchozí obslužná rutina pro tuto událost zruší operaci přetažení, pokud je stisknuta klávesa ESC, a v případě uvolnění tlačítka myši zahodí data.
Upozornění
Tyto události se průběžně generují během operace přetažení myší. Proto byste se měli vyhnout úlohám náročným na prostředky v obslužných rutinách událostí. Například místo vytvoření nového kurzoru při každém GiveFeedback vyvolání události použijte kurzor uložený v mezipaměti.
Povolení elementu jako cíle přetažení
Objekt, který je cílem odstranění, zodpovídá za:
Určuje, že se jedná o platný cíl vyřazení.
Odpovídání na zdroj přetažení, když přetáhne přes cíl.
Kontrola, jestli jsou přenášená data ve formátu, který může přijímat.
Zpracování vyřazených dat.
Chcete-li určit, že prvek je cíl přetažení, nastavíte jeho AllowDrop vlastnost na true
. Cílové události vyřaďte na element, abyste je mohli zpracovat. Během operace přetažení probíhá v cíli přetažení následující posloupnost událostí:
K DragEnter události dochází, když jsou data přetažena do hranice cíle přetažení. Tuto událost obvykle zpracováváte, abyste získali náhled efektů operace přetažení, pokud je to vhodné pro vaši aplikaci. Nenastavujte DragEventArgs.Effects vlastnost v DragEnter události, protože bude přepsána DragOver v události.
Následující příklad ukazuje obslužnou Ellipse rutinu DragEnter události pro element. Tento kód zobrazí náhled efektů operace přetažení myší uložením aktuálního Fill štětce. Pak pomocí GetDataPresent metody zkontroluje, zda DataObject přetahování přes tři tečky obsahuje řetězcová data, která lze převést na Brush. Pokud ano, data se extrahují pomocí GetData metody. Potom se převede na Brush tři tečky a použije se na něj. Změna se vrátí v obslužné rutině DragLeave události. Pokud data nelze převést na Brush, neprovádí se žádná akce.
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
K DragOver události dochází nepřetržitě, když jsou data přetažena přes cíl přetažení. Tato událost je spárovaná s událostí GiveFeedback ve zdroji přetažení. V obslužné rutině DragOver události obvykle používáte GetDataPresent a GetData metody ke kontrole, zda jsou přenášená data ve formátu, který může cíl přetažení zpracovat. Můžete také zkontrolovat, jestli jsou stisknuty nějaké modifikační klávesy, což obvykle značí, jestli uživatel hodlá akci přesunout nebo zkopírovat. Po provedení těchto kontrol nastavíte DragEventArgs.Effects vlastnost tak, aby upozorňovat zdroj přetažení, jaký efekt budou mít data. Zdroj přetažení obdrží tyto informace v GiveFeedback args událostí a může nastavit odpovídající kurzor, který uživateli poskytne zpětnou vazbu.
Následující příklad ukazuje obslužnou Ellipse rutinu DragOver události pro element. Tento kód zkontroluje, jestli DataObject přetahování přes tři tečky obsahuje řetězcová data, která lze převést na Brush. Pokud ano, nastaví DragEventArgs.Effects vlastnost na Copy. To značí zdroj přetažení, že lze data zkopírovat do tří teček. Pokud data nelze převést na , BrushDragEventArgs.Effects vlastnost je nastavena na None. To značí zdroj přetažení, že tři tečky nejsou platným cílem přetažení dat.
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
K DragLeave události dochází, když jsou data přetažena mimo hranici cíle bez vyřazení. Tuto událost zpracujete a vrátíte zpět vše, co jste udělali v obslužné rutině DragEnter události.
Následující příklad ukazuje obslužnou Ellipse rutinu DragLeave události pro element. Tento kód vrátí zpět náhled provedený v DragEnter obslužné rutině události použitím uložené Brush na tři tečky.
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
K Drop události dochází, když se data přehodí přes cíl přetažení. Ve výchozím nastavení k tomu dochází při uvolnění tlačítka myši. V obslužné rutině Drop události použijete metodu GetData k extrahování přenášených dat z dat a provádění veškerého DataObject zpracování dat, které vaše aplikace vyžaduje. Událost Drop ukončí operaci přetažení.
Následující příklad ukazuje obslužnou Ellipse rutinu Drop události pro element. Tento kód použije efekty operace přetažení myší a je podobný kódu v obslužné rutině DragEnter události. Kontroluje, zda DataObject přetahování přes tři tečky obsahuje řetězcová data, která lze převést na Brush. Pokud ano, použije se Brush na tři tečky. Pokud data nelze převést na Brush, neprovádí se žádná akce.
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
Viz také
.NET Desktop feedback