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:

  • Eine Object, die die tatsächlichen Daten enthält.

  • Ein entsprechendes 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 eine Hinweis darauf, in welchem Format die Daten enthalten sind. Datenobjekte unterstützen das Hosten mehrerer Daten/Datenformatpaare; Dadurch kann ein einzelnes Datenobjekt Daten in mehreren Formaten bereitstellen.

Datenobjekte

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

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

WPF stellt eine grundlegende Implementierung IDataObject in der DataObject Klasse bereit. Die Aktienklasse DataObject reicht für viele gängige Datenübertragungsszenarien aus.

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

Datenobjekte umfassen häufig eine Einrichtung 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. Bei der Abfrage der in einem Datenobjekt verfügbaren Datenformate können automatisch konvertierbare Datenformate durch Aufrufen der GetFormats(Boolean)GetDataPresent(String, Boolean) oder Methode gefiltert werden und den autoConvert Parameter als false angeben. Wenn Sie Daten zu einem Datenobjekt mit der SetData(String, Object, Boolean) Methode hinzufügen, kann die automatische Konvertierung von Daten verboten werden, indem Sie den autoConvert Parameter auf false festlegen.

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 Instanz mit einem einzelnen DataObject 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 einen Satz 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, die 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.

Im folgenden Beispiel wird gezeigt, wie Sie die SetData(String, Object) Methode zum Hinzufügen von Daten zu einem Datenobjekt in mehreren Formaten verwenden.

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 Überladung verwendet, um ein Array von Zeichenfolgen abzurufen, das alle Datenformate angibt, die GetFormats in einem Datenobjekt verfügbar sind (sowohl systemeigene 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, die ein Datenobjekt für verfügbare Datenformate abfragen, finden Sie unter Liste 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 Datenobjekt vorhanden 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 zu überprüfen, ob ein bestimmtes Datenformat vorhanden ist. GetData gibt die Daten in einem Object zurück; je nach Datenformat zurück, 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 (systemeigene 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 aus einem Datenobjekt effektiv zu entfernen:

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

  2. "Kopieren" die gewünschten Daten aus dem alten Datenobjekt in das neue Datenobjekt. Verwenden Sie zum Kopieren der Daten eine GetData der Methoden zum Abrufen einer Object Methode, 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.

Hinweis

Die SetData Methoden fügen nur Daten zu einem Datenobjekt hinzu; sie ersetzen keine Daten, auch wenn das Daten- und Datenformat genau dem vorherigen Aufruf entspricht. Das Aufrufen SetData von zweimal für dasselbe Daten- und Datenformat führt dazu, dass das Daten-/Datenformat zweimal im Datenobjekt vorhanden ist.