Data a datové objekty
Data přenášená jako součást operace přetažení jsou uložena v datovém objektu. Datový objekt se koncepčně skládá z jedné nebo několika následujících dvojic:
Jedna Object, která obsahuje skutečná data.
Odpovídající identifikátor formátu dat.
Samotná data se mohou skládat z čehokoli, co lze reprezentovat jako základní Object. Odpovídající formát dat je řetězec nebo Type, který poskytuje nápovědu k tomu, v jakém formátu jsou data. Datové objekty podporují hostování více dvojic datových a datových formátů; to umožňuje jednomu datovému objektu poskytovat data ve více formátech.
Datové objekty
Všechny datové objekty musí implementovat IDataObject rozhraní, které poskytuje následující standardní sadu metod, které umožňují a usnadňují přenos dat.
Metoda | Shrnutí |
---|---|
GetData | Načte datový objekt v zadaném formátu dat. |
GetDataPresent | Zkontroluje, jestli jsou data dostupná v zadaném formátu nebo je možné je převést na zadaný formát. |
GetFormats | Vrátí seznam formátů, ve které jsou data v tomto datovém objektu uložena, nebo je možné je převést na. |
SetData | Uloží zadaná data v tomto datovém objektu. |
WPF poskytuje základní implementaci IDataObject ve třídě DataObject. Skladová DataObject třída je dostatečná pro mnoho běžných scénářů přenosu dat.
Existuje několik předdefinovaných formátů, jako je rastrový obrázek, CSV, soubor, HTML, RTF, řetězec, text a zvuk. Informace o předdefinovaných datových formátech, které jsou součástí WPF, naleznete v referenčním tématu DataFormats třídy.
Datové objekty běžně zahrnují zařízení pro automatické převody dat uložených v jednom formátu do jiného formátu při extrahování dat; tato zařízení se označuje jako automatický převod. Při dotazování na formáty dat dostupné v datovém objektu lze automaticky konvertibilní datové formáty filtrovat z nativních datových formátů voláním GetFormats(Boolean) nebo GetDataPresent(String, Boolean) metodou a zadáním parametru autoConvert
jako false
. Při přidávání dat do datového objektu pomocí metody SetData(String, Object, Boolean) lze automatický převod dat zakázat nastavením parametru autoConvert
na false
.
Práce s datovými objekty
Tato část popisuje běžné techniky vytváření a práce s datovými objekty.
Vytváření nových datových objektů
Třída DataObject poskytuje několik přetížených konstruktorů, které snáze naplní novou instanci DataObject jednou dvojicí dat a formátu dat.
Následující příklad kódu vytvoří nový datový objekt a použije jeden z přetížených konstruktorů DataObject(DataObject(String, Object)) k inicializaci datového objektu pomocí řetězce a zadaného formátu dat. V tomto případě je formát dat určen řetězcem; třída DataFormats poskytuje sadu předdefinovaných řetězců typů. Ve výchozím nastavení je povolený automatický převod uložených dat.
string stringData = "Some string data to store...";
string dataFormat = DataFormats.UnicodeText;
DataObject dataObject = new DataObject(dataFormat, stringData);
Dim stringData As String = "Some string data to store..."
Dim dataFormat As String = DataFormats.UnicodeText
Dim dataObject As New DataObject(dataFormat, stringData)
Další příklady kódu, který vytváří datový objekt, najdete v tématu Vytvoření datového objektu.
Ukládání dat ve více formátech
Jeden datový objekt může ukládat data ve více formátech. Strategické použití více datových formátů v rámci jednoho datového objektu potenciálně učiní datový objekt přístupným širší škálou cílů vložení, než kdyby bylo možné reprezentovat pouze jeden datový formát. Obecně platí, že zdroj přetažení musí být nezávislý na formátech dat, které jsou využitelné potenciálními cíli poklesu.
Následující příklad ukazuje, jak pomocí SetData(String, Object) metody přidat data do datového objektu ve více formátech.
DataObject dataObject = new DataObject();
string sourceData = "Some string data to store...";
// Encode the source string into Unicode byte arrays.
byte[] unicodeText = Encoding.Unicode.GetBytes(sourceData); // UTF-16
byte[] utf8Text = Encoding.UTF8.GetBytes(sourceData);
byte[] utf32Text = Encoding.UTF32.GetBytes(sourceData);
// The DataFormats class does not provide data format fields for denoting
// UTF-32 and UTF-8, which are seldom used in practice; the following strings
// will be used to identify these "custom" data formats.
string utf32DataFormat = "UTF-32";
string utf8DataFormat = "UTF-8";
// Store the text in the data object, letting the data object choose
// the data format (which will be DataFormats.Text in this case).
dataObject.SetData(sourceData);
// Store the Unicode text in the data object. Text data can be automatically
// converted to Unicode (UTF-16 / UCS-2) format on extraction from the data object;
// Therefore, explicitly converting the source text to Unicode is generally unnecessary, and
// is done here as an exercise only.
dataObject.SetData(DataFormats.UnicodeText, unicodeText);
// Store the UTF-8 text in the data object...
dataObject.SetData(utf8DataFormat, utf8Text);
// Store the UTF-32 text in the data object...
dataObject.SetData(utf32DataFormat, utf32Text);
Dim dataObject As New DataObject()
Dim sourceData As String = "Some string data to store..."
' Encode the source string into Unicode byte arrays.
Dim unicodeText() As Byte = Encoding.Unicode.GetBytes(sourceData) ' UTF-16
Dim utf8Text() As Byte = Encoding.UTF8.GetBytes(sourceData)
Dim utf32Text() As Byte = Encoding.UTF32.GetBytes(sourceData)
' The DataFormats class does not provide data format fields for denoting
' UTF-32 and UTF-8, which are seldom used in practice; the following strings
' will be used to identify these "custom" data formats.
Dim utf32DataFormat As String = "UTF-32"
Dim utf8DataFormat As String = "UTF-8"
' Store the text in the data object, letting the data object choose
' the data format (which will be DataFormats.Text in this case).
dataObject.SetData(sourceData)
' Store the Unicode text in the data object. Text data can be automatically
' converted to Unicode (UTF-16 / UCS-2) format on extraction from the data object;
' Therefore, explicitly converting the source text to Unicode is generally unnecessary, and
' is done here as an exercise only.
dataObject.SetData(DataFormats.UnicodeText, unicodeText)
' Store the UTF-8 text in the data object...
dataObject.SetData(utf8DataFormat, utf8Text)
' Store the UTF-32 text in the data object...
dataObject.SetData(utf32DataFormat, utf32Text)
Dotazování datového objektu pro dostupné formáty
Vzhledem k tomu, že jeden datový objekt může obsahovat libovolný počet datových formátů, datové objekty zahrnují zařízení pro načtení seznamu dostupných formátů dat.
Následující příklad kódu používá přetížení GetFormats k získání pole řetězců, které označují všechny formáty dat dostupné v datovém objektu (jak nativní, tak automatickým převodem).
DataObject dataObject = new DataObject("Some string data to store...");
// Get an array of strings, each string denoting a data format
// that is available in the data object. This overload of GetDataFormats
// returns all available data formats, native and auto-convertible.
string[] dataFormats = dataObject.GetFormats();
// Get the number of data formats present in the data object, including both
// auto-convertible and native data formats.
int numberOfDataFormats = dataFormats.Length;
// To enumerate the resulting array of data formats, and take some action when
// a particular data format is found, use a code structure similar to the following.
foreach (string dataFormat in dataFormats)
{
if (dataFormat == DataFormats.Text)
{
// Take some action if/when data in the Text data format is found.
break;
}
else if(dataFormat == DataFormats.StringFormat)
{
// Take some action if/when data in the string data format is found.
break;
}
}
Dim dataObject As New DataObject("Some string data to store...")
' Get an array of strings, each string denoting a data format
' that is available in the data object. This overload of GetDataFormats
' returns all available data formats, native and auto-convertible.
Dim dataFormats() As String = dataObject.GetFormats()
' Get the number of data formats present in the data object, including both
' auto-convertible and native data formats.
Dim numberOfDataFormats As Integer = dataFormats.Length
' To enumerate the resulting array of data formats, and take some action when
' a particular data format is found, use a code structure similar to the following.
For Each dataFormat As String In dataFormats
If dataFormat = System.Windows.DataFormats.Text Then
' Take some action if/when data in the Text data format is found.
Exit For
ElseIf dataFormat = System.Windows.DataFormats.StringFormat Then
' Take some action if/when data in the string data format is found.
Exit For
End If
Next dataFormat
Další příklady kódu, který dotazuje datový objekt pro dostupné formáty dat, naleznete v tématu Seznam datových formátů v datovém objektu. Příklady dotazování datového objektu na přítomnost konkrétního formátu dat najdete v tématu Určení, zda datový formát je k dispozici v datovém objektu.
Načítání dat z datového objektu
Načítání dat z datového objektu v určitém formátu jednoduše zahrnuje volání jedné z GetData metod a určení požadovaného formátu dat. Jednu z GetDataPresent metod lze použít ke kontrole přítomnosti konkrétního formátu dat. GetData vrátí data v Object; v závislosti na formátu dat lze tento objekt přetypovat do kontejneru specifického typu.
Následující ukázkový kód používá přetížení GetDataPresent(String) ke kontrole, jestli je k dispozici zadaný formát dat (nativní nebo automatickým převodem). Pokud je zadaný formát k dispozici, příklad načte data pomocí metody GetData(String).
DataObject dataObject = new DataObject("Some string data to store...");
string desiredFormat = DataFormats.UnicodeText;
byte[] data = null;
// Use the GetDataPresent method to check for the presence of a desired data format.
// This particular overload of GetDataPresent looks for both native and auto-convertible
// data formats.
if (dataObject.GetDataPresent(desiredFormat))
{
// If the desired data format is present, use one of the GetData methods to retrieve the
// data from the data object.
data = dataObject.GetData(desiredFormat) as byte[];
}
Dim dataObject As New DataObject("Some string data to store...")
Dim desiredFormat As String = DataFormats.UnicodeText
Dim data() As Byte = Nothing
' Use the GetDataPresent method to check for the presence of a desired data format.
' This particular overload of GetDataPresent looks for both native and auto-convertible
' data formats.
If dataObject.GetDataPresent(desiredFormat) Then
' If the desired data format is present, use one of the GetData methods to retrieve the
' data from the data object.
data = TryCast(dataObject.GetData(desiredFormat), Byte())
End If
Další příklady kódu, který načítá data z datového objektu, najdete v tématu Načtení dat v konkrétním formátu dat.
Odebrání dat z datového objektu
Data nelze přímo odebrat z datového objektu. Chcete-li efektivně odebrat data z datového objektu, postupujte takto:
Vytvořte nový datový objekt, který bude obsahovat pouze data, která chcete zachovat.
"Zkopírujte" požadovaná data ze starého datového objektu do nového datového objektu. Pokud chcete data zkopírovat, použijte jednu z GetData metod k načtení Object, která obsahuje nezpracovaná data, a pak pomocí jedné z SetData metod přidejte data do nového datového objektu.
Nahraďte starý datový objekt novým objektem.
.NET Desktop feedback