Dati e oggetti datiData and Data Objects

I dati trasferiti come parte di un'operazione di trascinamento e rilascio viene archiviati in un oggetto dati.Data that is transferred as part of a drag-and-drop operation is stored in a data object. Concettualmente, un oggetto dati è costituito da uno o più delle seguenti coppie di:Conceptually, a data object consists of one or more of the following pairs:

  • Un Object che contiene i dati effettivi.An Object that contains the actual data.

  • Un identificatore di formato di dati corrispondente.A corresponding data format identifier.

I dati stessi possono contenere qualsiasi elemento che può essere rappresentato come una base Object.The data itself can consist of anything that can be represented as a base Object. Il formato di dati corrispondente è una stringa o Type che fornisce un hint sul formato dei dati è in.The corresponding data format is a string or Type that provides a hint about what format the data is in. Gli oggetti dati supportano l'hosting di più coppie di formato di dati o dati; In questo modo un singolo oggetto dati fornire i dati in più formati.Data objects support hosting multiple data/data format pairs; this enables a single data object to provide data in multiple formats.

Oggetti datiData Objects

Tutti gli oggetti di dati devono implementare il IDataObject interfaccia che fornisce il seguente set standard di metodi che consentono e semplificano il trasferimento dei dati.All data objects must implement the IDataObject interface, which provides the following standard set of methods that enable and facilitate data transfer.

MetodoMethod RiepilogoSummary
GetData Recupera un oggetto dati in un formato dati specificato.Retrieves a data object in a specified data format.
GetDataPresent Controlla se i dati sono disponibili in, o possono essere convertiti nel formato specificato.Checks to see whether the data is available in, or can be converted to, a specified format.
GetFormats Restituisce un elenco di formati di dati nell'oggetto dati viene archiviati in, o possono essere convertiti in.Returns a list of formats that the data in this data object is stored in, or can be converted to.
SetData Archivia i dati specificati nell'oggetto dati.Stores the specified data in this data object.

WPFWPF fornisce un'implementazione di base di IDataObject nella DataObject classe. provides a basic implementation of IDataObject in the DataObject class. L'azione DataObject classe è sufficiente per molti scenari comuni di trasferimento dei dati.The stock DataObject class is sufficient for many common data transfer scenarios.

Esistono vari formati predefiniti, quali bitmap, CSV, file, HTML, RTF, stringa, testo e audio.There are several pre-defined formats, such as bitmap, CSV, file, HTML, RTF, string, text, and audio. Per informazioni sui formati di dati predefiniti forniti con WPFWPF, vedere il DataFormats argomento di riferimento di classe.For information about pre-defined data formats provided with WPFWPF, see the DataFormats class reference topic.

Oggetti dati è in genere includono una funzionalità per convertire automaticamente i dati archiviati in un formato in un formato diverso durante l'estrazione dei dati. Questa funzionalità è detta automaticamente la conversione.Data objects commonly include a facility for automatically converting data stored in one format to a different format while extracting data; this facility is referred to as auto-convert. Quando si eseguono query per i formati di dati disponibili in un oggetto dati, i formati di dati convertibili automaticamente possono essere filtrati da formati dati nativi chiamando il GetFormats(Boolean) o GetDataPresent(String, Boolean) metodo e specificando la autoConvert parametro come false.When querying for the data formats available in a data object, auto-convertible data formats can be filtered from native data formats by calling the GetFormats(Boolean) or GetDataPresent(String, Boolean) method and specifying the autoConvert parameter as false. Quando si aggiungono dati a un oggetto dati con il SetData(String, Object, Boolean) (metodo), la conversione automatica dei dati può essere impedita impostando il autoConvert parametro false.When adding data to a data object with the SetData(String, Object, Boolean) method, auto-conversion of data can be prohibited by setting the autoConvert parameter to false.

Utilizzo di oggetti datiWorking with Data Objects

Questa sezione descrive le tecniche comuni per la creazione e utilizzo di oggetti dati.This section describes common techniques for creating and working with data objects.

Creazione di nuovi oggetti di datiCreating New Data Objects

Il DataObject classe fornisce molti costruttori di overload che agevolano la compilazione di un nuovo DataObject istanza con una coppia di formato singolo dati.The DataObject class provides several overloaded constructors that facilitate populating a new DataObject instance with a single data/data format pair.

Esempio di codice seguente crea un nuovo oggetto dati e viene utilizzato uno dei costruttori di overload DataObject(DataObject(String, Object)) per inizializzare l'oggetto dati con una stringa e un formato dati specificato.The following example code creates a new data object and uses one of the overloaded constructors DataObject(DataObject(String, Object)) to initialize the data object with a string and a specified data format. In questo caso, il formato di dati è specificato da una stringa. la DataFormats classe fornisce un set di stringhe di tipo predefinite.In this case, the data format is specified by a string; the DataFormats class provides a set of pre-defined type strings. Per impostazione predefinita, è consentita la conversione automatica dei dati archiviati.Auto-conversion of the stored data is allowed by default.

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)

Per ulteriori esempi di codice che crea un oggetto dati, vedere creare un oggetto dati.For more examples of code that creates a data object, see Create a Data Object.

L'archiviazione dei dati in più formatiStoring Data in Multiple Formats

Un singolo oggetto dati è in grado di archiviare dati in più formati.A single data object is able to store data in multiple formats. L'utilizzo di più formati di dati all'interno di un singolo oggetto dati strategico potenzialmente rende l'oggetto dati utilizzabile da un'ampia gamma di obiettivi di rilascio più se solo un unico formato dati potrebbe essere rappresentato.Strategic use of multiple data formats within a single data object potentially makes the data object consumable by a wider variety of drop targets than if only a single data format could be represented. Si noti che, in generale, un'origine di trascinamento deve essere indipendente sui formati di dati che possono essere utilizzati da potenziali obiettivi di rilascio.Note that, in general, a drag source must be agnostic about the data formats that are consumable by potential drop targets.

Nell'esempio seguente viene illustrato come utilizzare il SetData(String, Object) metodo per aggiungere dati a un oggetto dati in più formati.The following example shows how to use the SetData(String, Object) method to add data to a data object in multiple formats.

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)

Esecuzione di query su un oggetto dati per i formati disponibiliQuerying a Data Object for Available Formats

Poiché un singolo oggetto dati può contenere un numero arbitrario di formati di dati, oggetti dati consentono di recuperare un elenco dei formati di dati disponibili.Because a single data object can contain an arbitrary number of data formats, data objects include facilities for retrieving a list of available data formats.

Il codice di esempio seguente usa il GetFormats overload per ottenere una matrice di stringhe che indica tutti i formati di dati disponibili in un oggetto dati (nativo e conversione automatica).The following example code uses the GetFormats overload to get an array of strings denoting all data formats available in a data object (both native and by auto-convert).

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

Per ulteriori esempi di codice che esegue una query di un oggetto dati per i formati dati disponibili, vedere sono elencati i formati di dati in un oggetto dati.For more examples of code that queries a data object for available data formats, see List the Data Formats in a Data Object. Per esempi di query su un oggetto dati per la presenza di un particolare formato dati, vedere determinare se un formato di dati è presente in un oggetto dati.For examples of querying a data object for the presence of a particular data format, see Determine if a Data Format is Present in a Data Object.

Il recupero dei dati da un oggetto datiRetrieving Data from a Data Object

Il recupero dei dati da un oggetto dati in un determinato formato richiede semplicemente la chiamata a uno del GetData metodi e specificare il formato di dati desiderato.Retrieving data from a data object in a particular format simply involves calling one of the GetData methods and specifying the desired data format. Uno del GetDataPresent metodi possono essere usati per verificare la presenza di un particolare formato dati.One of the GetDataPresent methods can be used to check for the presence of a particular data format. GetData Restituisce i dati in un Object; a seconda del formato di dati, questo oggetto può essere convertito in un contenitore specifico del tipo.GetData returns the data in an Object; depending on the data format, this object can be cast to a type-specific container.

Il codice di esempio seguente usa il GetDataPresent(String) overload per controllare se un formato dati specificato è disponibile (nativa o mediante conversione automatica).The following example code uses the GetDataPresent(String) overload to check if a specified data format is available (native or by auto-convert). Se il formato specificato non è disponibile, l'esempio recupera i dati utilizzando il GetData(String) metodo.If the specified format is available, the example retrieves the data by using the GetData(String) method.

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

Per ulteriori esempi di codice che recupera dati da un oggetto dati, vedere recupera i dati in un determinato formato di dati.For more examples of code that retrieves data from a data object, see Retrieve Data in a Particular Data Format.

Rimozione dei dati da un oggetto datiRemoving Data From a Data Object

Impossibile rimuovere dati direttamente da un oggetto dati.Data cannot be directly removed from a data object. Per rimuovere in modo efficace i dati da un oggetto dati, seguire questi passaggi:To effectively remove data from a data object, follow these steps:

  1. Creare un nuovo oggetto dati che conterrà solo i dati di cui che si desidera mantenere.Create a new data object that will contain only the data you want to retain.

  2. "Copia" i dati desiderati dall'oggetto dati precedente al nuovo oggetto dati."Copy" the desired data from the old data object to the new data object. Per copiare i dati, utilizzare uno del GetData metodi per recuperare un Object che contiene i dati non elaborati e quindi utilizzare uno del SetData metodi per aggiungere i dati al nuovo oggetto dati.To copy the data, use one of the GetData methods to retrieve an Object that contains the raw data, and then use one of the SetData methods to add the data to the new data object.

  3. Sostituire l'oggetto dati precedente con quello nuovo.Replace the old data object with the new one.

Nota

Il SetData metodi consentono solo di aggiungere dati a un oggetto dati; non sostituiscono i dati, anche se i dati e il formato dei dati sono esattamente uguali come una chiamata precedente.The SetData methods only add data to a data object; they do not replace data, even if the data and data format are exactly the same as a previous call. La chiamata SetData due volte per gli stessi dati e dati formato comporterà il formato di dati/presenti due volte nell'oggetto dati.Calling SetData twice for the same data and data format will result in the data/data format being present twice in the data object.