Freigeben über


Daten und Datenobjekte

Daten, die als Teil eines Drag-and-Drop-Vorgangs übertragen werden, werden in einem Datenobjekt gespeichert. Konzeptionell besteht ein Datenobjekt aus einem oder mehreren der folgenden Paare:

  • Ein Object-Element, das die tatsächlichen Daten enthält.

  • Ein entsprechender Datenformatbezeichner.

Die Daten selbst können aus allen Elementen bestehen, die als Basis Objectdargestellt werden können. Das entsprechende Datenformat ist eine Zeichenfolge oder Type mit einem Hinweis darauf, in welchem Format die Daten enthalten sind. Datenobjekte unterstützen das Hosten mehrerer Daten-/Datenformatpaare; Auf diese Weise kann ein einzelnes Datenobjekt Daten in mehreren Formaten bereitstellen.

Datenobjekte

Alle Datenobjekte müssen die IDataObject Schnittstelle implementieren, die den folgenden Standardsatz von Methoden bereitstellt, die die Datenübertragung ermöglichen und vereinfachen.

Methode Zusammenfassung
GetData Ruft ein Datenobjekt in einem angegebenen Datenformat ab.
GetDataPresent Überprüft, ob die Daten verfügbar sind oder in ein angegebenes Format konvertiert werden können.
GetFormats Gibt eine Liste von Formaten zurück, in denen die Daten in diesem Datenobjekt gespeichert sind oder in die konvertiert werden können.
SetData Speichert die angegebenen Daten in diesem Datenobjekt.

WPF stellt eine grundlegende Implementierung von IDataObject in der DataObject-Klasse bereit. Die Bestandsklasse DataObject reicht für viele gängige Datenübertragungsszenarios aus.

Es gibt mehrere vordefinierte Formate, z. B. Bitmap, CSV, Datei, HTML, RTF, Zeichenfolge, Text und Audio. Informationen zu vordefinierten Datenformaten, die mit WPF bereitgestellt werden, finden Sie im DataFormats-Kursreferenzthema.

Datenobjekte enthalten häufig eine Möglichkeit zum automatischen Konvertieren von Daten, die in einem Format gespeichert sind, in ein anderes Format, während Daten extrahiert werden; diese Einrichtung wird als automatische Konvertierung bezeichnet. Beim Abfragen der in einem Datenobjekt verfügbaren Datenformate können automatisch konvertierbare Datenformate von nativen Datenformaten gefiltert werden, indem man die GetFormats(Boolean)- oder GetDataPresent(String, Boolean)-Methode aufruft und den autoConvert-Parameter als falseangibt. Beim Hinzufügen von Daten zu einem Datenobjekt mit der SetData(String, Object, Boolean) Methode kann die automatische Konvertierung von Daten untersagt werden, indem der parameter autoConvert auf falsefestgelegt wird.

Arbeiten mit Datenobjekten

In diesem Abschnitt werden allgemeine Techniken zum Erstellen und Arbeiten mit Datenobjekten beschrieben.

Erstellen neuer Datenobjekte

Die DataObject-Klasse bietet mehrere überladene Konstruktoren, die das Auffüllen einer neuen DataObject-Instanz mit einem einzelnen Daten-/Datenformatpaar erleichtern.

Der folgende Beispielcode erstellt ein neues Datenobjekt und verwendet einen der überladenen Konstruktoren DataObject(DataObject(String, Object)) zum Initialisieren des Datenobjekts mit einer Zeichenfolge und einem angegebenen Datenformat. In diesem Fall wird das Datenformat durch eine Zeichenfolge angegeben; die DataFormats Klasse stellt eine Reihe vordefinierter Typzeichenfolgen bereit. Die automatische Konvertierung der gespeicherten Daten ist standardmäßig zulässig.

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)

Weitere Beispiele für Code, der ein Datenobjekt erstellt, finden Sie unter Erstellen eines Datenobjekts.

Speichern von Daten in mehreren Formaten

Ein einzelnes Datenobjekt kann Daten in mehreren Formaten speichern. Die strategische Verwendung mehrerer Datenformate innerhalb eines einzelnen Datenobjekts macht das Datenobjekt potenziell durch eine breitere Vielzahl von Dropzielen verfügbar, als wenn nur ein einzelnes Datenformat dargestellt werden könnte. Beachten Sie, dass im Allgemeinen eine Drag-Quelle über die Datenformate agnostisch sein muss, die von potenziellen Drop-Zielen verwendet werden.

Das folgende Beispiel zeigt, wie Sie mithilfe der SetData(String, Object)-Methode Daten zu einem Datenobjekt in mehreren Formaten hinzufügen.

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)

Abfragen eines Datenobjekts für verfügbare Formate

Da ein einzelnes Datenobjekt eine beliebige Anzahl von Datenformaten enthalten kann, enthalten Datenobjekte Einrichtungen zum Abrufen einer Liste der verfügbaren Datenformate.

Im folgenden Beispielcode wird die GetFormats-Überladung verwendet, um ein Array von Zeichenfolgen abzurufen, das alle Datenformate angibt, die in einem Datenobjekt verfügbar sind (sowohl nativ als auch durch automatische Konvertierung).

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

Weitere Beispiele für Code, der ein Datenobjekt auf verfügbare Datenformate abfragt, finden Sie unter Auflisten der Datenformate in einem Datenobjekt. Beispiele zum Abfragen eines Datenobjekts für das Vorhandensein eines bestimmten Datenformats finden Sie unter Ermitteln, ob ein Datenformat in einem Datenobjektvorhanden ist.

Abrufen von Daten aus einem Datenobjekt

Das Abrufen von Daten aus einem Datenobjekt in einem bestimmten Format umfasst einfach das Aufrufen einer der GetData Methoden und das Angeben des gewünschten Datenformats. Eine der GetDataPresent Methoden kann verwendet werden, um das Vorhandensein eines bestimmten Datenformats zu überprüfen. GetData gibt die Daten in einem Object-Element zurück; je nach Datenformat kann dieses Objekt in einen typspezifischen Container gecastet werden.

Im folgenden Beispielcode wird die GetDataPresent(String)-Überladung verwendet, um zu überprüfen, ob ein angegebenes Datenformat verfügbar ist (nativ oder durch automatische Konvertierung). Wenn das angegebene Format verfügbar ist, ruft das Beispiel die Daten mithilfe der GetData(String)-Methode ab.

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

Weitere Beispiele für Code, der Daten aus einem Datenobjekt abruft, finden Sie unter Abrufen von Daten in einem bestimmten Datenformat.

Entfernen von Daten aus einem Datenobjekt

Daten können nicht direkt aus einem Datenobjekt entfernt werden. Führen Sie die folgenden Schritte aus, um Daten effektiv aus einem Datenobjekt zu entfernen:

  1. Erstellen Sie ein neues Datenobjekt, das nur die Daten enthält, die Sie aufbewahren möchten.

  2. Kopieren Sie die gewünschten Daten aus dem alten Datenobjekt in das neue Datenobjekt. Verwenden Sie zum Kopieren der Daten eine der GetData Methoden, um eine Object abzurufen, die die Rohdaten enthält, und verwenden Sie dann eine der SetData Methoden, um die Daten dem neuen Datenobjekt hinzuzufügen.

  3. Ersetzen Sie das alte Datenobjekt durch das neue.

Anmerkung

Die SetData Methoden fügen nur Daten zu einem Datenobjekt hinzu; Sie ersetzen keine Daten, auch wenn die Daten und das Datenformat exakt mit einem vorherigen Aufruf identisch sind. Das zweimalige Aufrufen von SetData für dieselben Daten und dasselbe Datenformat führt dazu, dass die Daten/das Datenformat zweimal im Datenobjekt vorhanden ist.