Dati e oggetti dati
I dati trasferiti durante un'operazione di trascinamento vengono archiviati in un oggetto dati. Concettualmente, un oggetto dati è costituito da una o più delle coppie seguenti:
Oggetto Object contenente i dati effettivi.
Un identificatore del formato dati corrispondente.
I dati stessi possono essere costituiti da qualsiasi elemento che possa essere rappresentato come un Object di base. Il formato dati corrispondente è una stringa o un Type che fornisce indicazioni sul formato. Gli oggetti dati supportano l'hosting di più coppie di dati/formato dati; in questo modo, un singolo oggetto dati può fornire dati in più formati.
Oggetti dati
Tutti gli oggetti dati devono implementare l'interfaccia IDataObject che fornisce l'insieme standard di metodi seguente necessario per l'abilitazione e l'esecuzione del trasferimento dei dati.
Metodo |
Riepilogo |
---|---|
Recupera un oggetto dati in un formato dati specificato. |
|
Verifica se i dati sono disponibili o se possono essere convertiti in un formato specificato. |
|
Restituisce un elenco di formati in cui sono archiviati i dati di questo oggetto o in cui possono essere convertiti. |
|
Archivia i dati specificati in questo oggetto dati. |
WPF fornisce un'implementazione di base di IDataObject nella classe DataObject. La classe DataObject predefinita è sufficiente per la maggior parte degli scenari di trasferimento dei dati.
Vi sono vari formati predefiniti, tra cui CSV, file, HTML, RTF, stringa, testo e audio. Per informazioni sui formati dati predefiniti forniti con WPF, vedere l'argomento di riferimento della classe DataFormats.
Gli oggetti dati includono in genere una funzionalità per la conversione automatica dei dati archiviati in un formato in un altro formato durante l'estrazione. Quando si eseguono query per conoscere i formati dati disponibili in un oggetto dati, i formati dati convertibili automaticamente possono essere filtrati da formati dati nativi chiamando il metodo GetFormats o GetDataPresent e impostando il parametro autoConvert su false. Quando si aggiungono dati a un oggetto dati con il metodo SetData, auto-la conversione automatica dei dati può essere impedita impostando il parametro autoConvert su false.
Utilizzo di oggetti dati
In questa sezione vengono illustrate le tecniche comuni per la creazione e l'utilizzo di oggetti dati.
Creazione di nuovi oggetti dati
Tramite la classe DataObject sono disponibili molti costruttori di overload che agevolano la compilazione di una nuova istanza di DataObject con una coppia di singoli dati/formato dati.
Nell'esempio di codice riportato di seguito viene creato un nuovo oggetto dati e viene utilizzato uno dei costruttori di overload DataObject(DataObject) per inizializzare l'oggetto dati con una stringa e un formato dati specificato. In questo caso, il formato dati è specificato da una stringa; la classe DataFormats fornisce un insieme di stringhe di tipo predefinite. La conversione automatica dei dati archiviati è consentita per impostazione predefinita.
Dim stringData As String = "Some string data to store..."
Dim dataFormat As String = DataFormats.UnicodeText
Dim dataObject As New DataObject(dataFormat, stringData)
string stringData = "Some string data to store...";
string dataFormat = DataFormats.UnicodeText;
DataObject dataObject = new DataObject(dataFormat, stringData);
Per ulteriori esempi di codice per la creazione di un oggetto dati, vedere Procedura: creare un oggetto dati.
Archiviazione di dati in più formati
È possibile archiviare dati in più formati in un singolo oggetto dati. L'utilizzo strategico di più formati dati all'interno di un singolo oggetto dati rende l'oggetto dati potenzialmente utilizzabile da molte più destinazioni di rilascio rispetto ai casi in cui è possibile rappresentare un solo formato dati. In generale, un'origine del trascinamento non deve essere consapevole dei formati dati utilizzabili da potenziali destinazioni di rilascio.
Nell'esempio riportato di seguito viene illustrato come utilizzare il metodo SetData per aggiungere dati a un oggetto dati in più formati.
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)
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);
Esecuzione di una query di un oggetto dati per i formati disponibili
Poiché un singolo oggetto dati può contenere un numero arbitrario di formati dati, gli oggetti dati consentono di recuperare un elenco di formati dati disponibili.
Nell'esempio di codice riportato di seguito viene utilizzato l'overload di GetFormats per ottenere una matrice di stringhe contenente l'indicazione di tutti i formati dati disponibili in un oggetto dati (nativo e a conversione automatica).
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
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;
}
}
Per ulteriori esempi di codice per l'esecuzione di query di un oggetto dati per conoscere i formati dati disponibili, vedere Procedura: elencare i formati dati in un oggetto dati. Per esempi di query di un oggetto dati per stabilire la presenza di un determinato formato dati, vedere Procedura: determinare se un formato di dati è presente in un oggetto dati.
Recupero di dati da un oggetto dati
Il recupero di dati da un oggetto dati in un determinato formato richiede semplicemente la chiamata a uno dei metodi GetData e l'indicazione del formato dati desiderato. Uno dei metodi GetDataPresent può essere utilizzato per determinare la presenza di un particolare formato dati. GetData restituisce i dati in Object; a seconda del formato dati, è possibile eseguire il cast di questo oggetto a un contenitore specifico del tipo.
Nell'esempio di codice riportato di seguito viene utilizzato l'overload di GetDataPresent per determinare la disponibilità di un determinato formato dati (in modo nativo o tramite conversione automatica). Se il formato specificato è disponibile, nell'esempio vengono recuperati i dati utilizzando il metodo GetData.
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
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[];
}
Per ulteriori esempi di codice per il recupero di dati da un oggetto dati, vedere Procedura: recuperare dati in un formato dati particolare.
Rimozione di dati da un oggetto dati
Non è possibile rimuovere direttamente i dati da un oggetto dati. Per rimuovere efficacemente i dati da un oggetto dati, seguire i passaggi riportati di seguito:
Creare un nuovo oggetto dati che dovrà contenere solo i dati che si desidera conservare.
"Copiare" i dati desiderati dall'oggetto dati precedente a quello nuovo. Per copiare i dati, utilizzare uno dei metodi GetData per recuperare un Object che contiene i dati non elaborati, quindi utilizzare uno dei metodi SetData per aggiungere i dati al nuovo oggetto dati.
Sostituire l'oggetto dati precedente con quello nuovo.
Nota |
---|
I metodi SetData consentono unicamente di aggiungere dati a un oggetto dati, ma non di sostituirli, anche se i dati e il formato dati sono esattamente gli stessi della chiamata precedente.Se si chiama due volte SetData per gli stessi dati e formato dati, i dati e il formato dati saranno presenti due volte nell'oggetto dati. |
Cronologia delle modifiche
Data |
Cronologia |
Motivo |
---|---|---|
Aprile 2011 |
Argomento aggiunto. |
Commenti e suggerimenti dei clienti. |