Поделиться через


Данные и объекты данных

Данные, которые передаются как часть операции перетаскивания, хранятся в объекте данных. Концептуально объект данных состоит из одной или нескольких пар, перечисленных ниже.

  • Объект Object, который содержит фактические данные.

  • Соответствующий идентификатор формата данных.

Сами данные могут состоять из всего, что может быть представлено как базовый Object. Соответствующий формат данных является строкой или типом Type, который предоставляет подсказку, в каком формате представлены данные. Объекты данных поддерживают размещение нескольких пар "данные-формат данных"; это позволяет одному объекту данных предоставлять данные в нескольких форматах.

Объекты данных

Все объекты данных должны реализовывать интерфейс IDataObject, предоставляющий следующий стандартный набор методов для включения и упрощения передачи данных.

Метод

Сводка

GetData

Извлекает объект данных в указанном формате данных.

GetDataPresent

Проверяет, доступны ли данные в указанном формате, или возможность их преобразования в указанный формат.

GetFormats

Возвращает список форматов, в которых данные хранятся в этом объекте данных или в которые их можно преобразовать.

SetData

Сохраняет указанные данные в объекте данных.

WPF предоставляет базовую реализацию интерфейса IDataObject в классе DataObject. Для многих распространенных сценариев передачи данных достаточно автоматически инициализируемого класса DataObject.

Имеется несколько предварительно определенных форматов, таких как bitmap, CSV, file, HTML, RTF, string, text, и audio. Сведения о предопределенных форматах данных, предоставляемых системой WPF, см. в разделе с описанием класса DataFormats.

Данные объекты обычно включают средства для автоматического преобразования данных, хранящихся в одном формате, в другой формат во время извлечения данных; их обычно называют средствами автоматического преобразования. При запросе форматов данных, доступных в объекте данных, с помощью фильтрации можно отделить автоматически преобразуемые форматы данных от собственных форматов данных, вызвав метод GetFormats или GetDataPresent и задав для параметра autoConvert значение false. При добавлении данных к объекту данных с помощью метода SetData автоматическое преобразование данных может быть запрещено путем задания значения false для параметра autoConvert.

Работа с объектами данных

В этом разделе описаны общие методы создания и работы с объектами данных.

Создание новых объектов данных

Класс DataObject предоставляет несколько перегруженных конструкторов, облегчающих заполнение нового экземпляра DataObject одной парой "данные-формат данных".

В следующем примере создается новый объект данных и используется один из перегруженных конструкторов DataObject(DataObject) для инициализации объекта данных строкой и указанным форматом данных. В этом случае формат данных определяется строкой. Класс DataFormats предоставляет набор строк предопределенных типов. Автоматическое преобразование сохраненных данных по умолчанию разрешено.

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);

Дополнительные примеры кода, создающего объект данных см. в разделе Как создать объект данных.

Хранение данных в нескольких форматах

В одном объекте данных могут храниться данные в нескольких форматах. Использование нескольких форматов данных внутри одного объекта делает объект данных более доступным для различных приемников, в отличие от представления данных в одном формате. Обратите внимание, что в общем случае источник перетаскивания должен знать о форматах данных, которые потенциально поддерживаются приемником.

В следующем примере показано использование метода SetData для добавления данных в нескольких форматах в объект данных.

                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);

Запрос к объекту данных для получения доступных форматов

Поскольку один объект данных может содержать произвольное число форматов данных, объекты данных включают средства для получения списка доступных форматов данных.

В следующем примере кода используется перегрузка GetFormats для получения массива строк, обозначающих все форматы данных, доступные в объекте данных (как собственные, так и автоматически преобразуемые).

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;
    }
}

Дополнительные примеры кода, которые запрашивают доступные форматы данных у объекта данных см. в разделе Практическое руководство. Перечисление форматов данных в объекте данных. Примеры запросов объектов данных на наличие определенного формата см. в разделе Практическое руководство. Определение присутствия формата данных в объекте данных.

Извлечение данных из объекта данных

Для извлечения данных в определенном формате из объекта данных необходимо просто вызвать один из методов GetData и задать необходимый формат данных. Один из методов GetDataPresent можно использовать для проверки наличия определенного формата данных. Метод GetData возвращает данные объекта Object. В зависимости от формата данных, этот объект может быть приведен к контейнеру определенного типа.

В следующем примере кода используется перегрузка GetDataPresent для проверки доступности указанного формата данных (собственного или автоматически преобразованного). Если указанный формат доступен, в примере извлекаются данные с помощью метода 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[];
}

Дополнительные примеры кода, которые извлекают данные из объекта данных, см. в разделе Практическое руководство. Получение данных в определенном формате данных.

Удаление данных из объекта данных

Данные не могут быть удалены напрямую из объекта данных. Для эффективного удаления данных из объекта данных выполните следующие действия.

  1. Создайте новый объект данных, который будет содержать только данные, которые требуется сохранить.

  2. Скопируйте необходимые данные из старых объектов данных в новый объект данных (с помощью команды "Копировать"). Чтобы скопировать данные, следует использовать один из методов GetData для извлечения Object, содержащего фрагмент данных, и один из методов SetData для добавления данных в новый объект данных.

  3. Замените старый объект данных новым.

ПримечаниеПримечание

Методы SetData только добавляют данные к объекту данных. Они не заменяют данные даже при их совпадении с данными и форматом данных в предыдущем вызове.Двукратный вызов метода SetData для одной пары "данные-формат данных" приведет к повторяющемуся отображению данных и формата данных в объекте.

Журнал изменений

Дата

Журнал

Причина

Апрель 2011

Добавлен раздел.

Обратная связь от клиента.