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 false
angibt. 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 false
festgelegt 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:
Erstellen Sie ein neues Datenobjekt, das nur die Daten enthält, die Sie aufbewahren möchten.
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.
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.
.NET Desktop feedback