Megosztás a következőn keresztül:


Adat- és adatobjektumok

A húzási művelet részeként átvitt adatok egy adatobjektumban lesznek tárolva. Az adatobjektum elméletileg az alábbi párokból áll:

  • A tényleges adatokat tartalmazó Object.

  • Megfelelő adatformátum-azonosító.

Maga az adat állhat bármiből, amely Objectalappal képviselhető. Az adatformátum egy karakterlánc vagy Type, amely utal az adatok formátumára. Az adatobjektumok több adat-/adatformátum-pár üzemeltetését támogatják; ez lehetővé teszi, hogy egyetlen adatobjektum több formátumban adjon meg adatokat.

Adatobjektumok

Minden adatobjektumnak implementálnia kell a IDataObject felületet, amely az alábbi szabványos módszereket biztosítja, amelyek lehetővé teszik és megkönnyítik az adatátvitelt.

Metódus Összefoglalás
GetData Adatobjektumot kér le egy megadott adatformátumban.
GetDataPresent Ellenőrzi, hogy az adatok elérhetőek-e, vagy konvertálhatók-e egy megadott formátumban.
GetFormats Visszaadja azoknak a formátumoknak a listáját, amelyekben az adatobjektumban lévő adatok tárolódnak vagy átalakíthatók.
SetData A megadott adatokat ebben az adatobjektumban tárolja.

A WPF a IDataObject alapszintű implementációját biztosítja a DataObject osztályban. A részvény DataObject osztály számos gyakori adatátviteli forgatókönyvhez elegendő.

Számos előre definiált formátum létezik, például bitkép, CSV, fájl, HTML, RTF, sztring, szöveg és hang. A WPF-hez megadott előre definiált adatformátumokról a DataFormats osztály referenciatémakörében talál további információt.

Az adatobjektumok gyakran tartalmaznak olyan eszközt, amely automatikusan átalakítja az egy formátumban tárolt adatokat egy másik formátumra az adatok kinyerése során; ezt a létesítményt automatikus átalakításnak nevezzük. Az adatobjektumokban elérhető adatformátumok lekérdezésekor az automatikusan konvertálható adatformátumok szűrhetők a natív adatformátumokból a GetFormats(Boolean) vagy GetDataPresent(String, Boolean) metódus meghívásával, valamint a autoConvert paraméter falsemegadásával. Ha SetData(String, Object, Boolean) metódussal ad hozzá adatokat egy adatobjektumhoz, az adatok automatikus konvertálása tiltható, ha a autoConvert paramétert falseértékre állítja.

Adatobjektumok használata

Ez a szakasz az adatobjektumok létrehozásának és használatának gyakori módszereit ismerteti.

Új adatobjektumok létrehozása

A DataObject osztály számos túlterhelt konstruktort biztosít, amelyek megkönnyítik egy új DataObject példány feltöltését egyetlen adat-adatformátum párral.

Az alábbi példakód létrehoz egy új adatobjektumot, és az egyik túlterhelt konstruktort használja DataObject(DataObject(String, Object)) az adatobjektum inicializálásához egy sztringgel és egy megadott adatformátummal. Ebben az esetben az adatformátumot egy sztring adja meg; a DataFormats osztály előre definiált típussztringeket biztosít. A tárolt adatok automatikus konvertálása alapértelmezés szerint engedélyezett.

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)

Az adatobjektumot létrehozó kódra további példákat Adatobjektum létrehozásacímű témakörben talál.

Adatok tárolása több formátumban

Egyetlen adatobjektum több formátumban is képes adatokat tárolni. Több adatformátum stratégiai használata egyetlen adatobjektumon belül potenciálisan azt eredményezi, hogy az adatobjektum a célhelyek szélesebb körében hasznosítható, mintha csak egyetlen adatformátumot lehetne ábrázolni. Vegye figyelembe, hogy a húzási forrásnak általában a lehetséges leesési célok által fogyasztható adatformátumokkal kapcsolatban kell agnosztikusnak lennie.

Az alábbi példa bemutatja, hogyan adhat hozzá adatokat egy adatobjektumhoz a SetData(String, Object) metódussal több formátumban.

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)

Adatobjektum lekérdezése elérhető formátumokhoz

Mivel egyetlen adatobjektum tetszőleges számú adatformátumot tartalmazhat, az adatobjektumok az elérhető adatformátumok listájának lekérésére szolgáló lehetőségeket is tartalmaznak.

Az alábbi példakód a GetFormats túlterhelést használja az adatobjektumokban elérhető összes adatformátumot denotáló sztringek tömbjének lekéréséhez (natív és automatikus konvertálással egyaránt).

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

Az adatobjektumokat lekérdező kódra további példákat az Adatobjektumokadatformátumainak listázása című témakörben talál. Példákért arra, hogyan kérdezhetünk le egy adatobjektumot egy adott adatformátum jelenlétére, tekintse meg a(z) Annak megállapítása, hogy az adatformátum jelen van-e egy adatobjektumbanszakaszt.

Adatok beolvasása adatobjektumból

Egy adott formátumú adatobjektum adatainak lekéréséhez egyszerűen meg kell hívnia az egyik GetData metódust, és meg kell adnia a kívánt adatformátumot. Az GetDataPresent egyik módszere egy adott adatformátum meglétének ellenőrzésére használható. GetData visszaadja az adatokat egy Object-ben; az adatformátumtól függően ez az objektum átkonvertálható egy típusspecifikus tárolóvá.

Az alábbi példakód a GetDataPresent(String) túlterheléssel ellenőrzi, hogy elérhető-e egy megadott adatformátum (natív vagy automatikus konvertálással). Ha a megadott formátum elérhető, a példa a GetData(String) metódussal kéri le az adatokat.

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

További példák az adatobjektumból adatokat lekérő kódra: Adatok lekérése adott adatformátumú.

Adatok eltávolítása adatobjektumból

Az adatok nem távolíthatók el közvetlenül adatobjektumból. Az adatobjektumok adatainak hatékony eltávolításához kövesse az alábbi lépéseket:

  1. Hozzon létre egy új adatobjektumot, amely csak a megőrizni kívánt adatokat tartalmazza.

  2. "Másolja" a kívánt adatokat a régi adatobjektumból az új adatobjektumba. Az adatok másolásához használja az egyik GetData metódust a nyers adatokat tartalmazó Object lekéréséhez, majd az SetData metódusok egyikével adja hozzá az adatokat az új adatobjektumhoz.

  3. Cserélje le a régi adatobjektumot az újra.

Megjegyzés:

A SetData metódusok csak adatokat adnak hozzá egy adatobjektumhoz; nem cserélik le az adatokat, még akkor sem, ha az adatok és az adatformátum pontosan megegyezik az előző hívással. Ha kétszer hívja meg SetData ugyanarra az adat- és adatformátumra, az adat-/adatformátum kétszer jelenik meg az adatobjektumban.