Данные и объекты данных
Данные, передаваемые как часть операции перетаскивания и вставки хранятся в объекте данных. Концептуально объект данных состоит из одного или нескольких из следующих пар:
Object , Содержит фактические данные.
Соответствующий идентификатор формата данных.
Сами данные могут состоять из всего, который может быть представлен в качестве основы Object. Соответствующий формат данных является строкой или Type , предоставляет подсказку о формате в. Объекты данных поддерживают размещение нескольких пар формат данных/данные; Это позволяет один объект данных для предоставления данных в нескольких форматах.
Объекты данных
Все объекты данных должны реализовывать IDataObject интерфейс, который предоставляет следующий стандартный набор методов для включения и упрощения передачи данных.
Метод | Сводка |
---|---|
GetData | Извлекает объект данных в указанном формате данных. |
GetDataPresent | Проверяет наличие данных в, или можно преобразовать в указанный формат. |
GetFormats | Возвращает список форматов, которые хранятся в данные в этом объекте данных, или может быть преобразован в. |
SetData | Сохраняет указанные данные в этом объекте данных. |
WPF Предоставляет базовую реализацию IDataObject в DataObject класса. Акции DataObject класс является достаточным для многих распространенных сценариев передачи данных.
Существует несколько предварительно определенных форматов, таких как растровое изображение, CSV, файл, HTML, RTF, строки, текст и аудио. Сведения о преопределенных форматах данных в состав WPF, см. в разделе DataFormats класс справочном разделе.
Объекты данных обычно включают средства для автоматического преобразования данных, хранящихся в одного формата в другой формат при извлечении данных; Это средство называется автоматический переход. При запросе форматов данных, доступных в объекте данных, автоматически преобразуемые форматы могут фильтроваться из собственных форматов данных, вызвав GetFormats(Boolean) или GetDataPresent(String, Boolean) и задав autoConvert
параметра в виде false
. При добавлении данных в объект данных с SetData(String, Object, Boolean) метод, автоматическое преобразование данных может быть запрещено, задав autoConvert
параметр false
.
Работа с объектами данных
В этом разделе описаны общие методы для создания и работы с объектами данных.
Создание новых объектов данных
DataObject Класс предоставляет несколько перегруженных конструкторов, предназначенных для упрощения заполнение нового DataObject экземпляра с парой формат единый данных.
В следующем примере кода создается новый объект данных и использует один из перегруженных конструкторов DataObject(DataObject(String, Object)) для инициализации объекта данных со строкой и заданного формата данных. В этом случае формат данных задается строкой. DataFormats класс предоставляет набор предопределенных типов строк. По умолчанию разрешен автоматического преобразования хранимых данных.
string stringData = "Some string data to store...";
string dataFormat = DataFormats.UnicodeText;
DataObject dataObject = new DataObject(dataFormat, stringData);
Дополнительные примеры кода, который создает объект данных, см. в разделе создать объект данных.
Хранение данных в нескольких форматах
Один объект данных имеет возможность хранения данных в нескольких форматах. Стратегического использования данных в нескольких форматах в одном объекте данных делает объект данных множеством разных мест перетаскивания, чем шире, если только может быть представлен только один формат данных. Обратите внимание на то, что, как правило, источником перетаскивания не должны зависеть о форматах данных, которые могут использоваться возможные конечные расположения сброса.
В следующем примере показано, как использовать SetData(String, Object) метод для добавления данных в объект данных в нескольких форматах.
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 перегрузки, чтобы получить массив строк, обозначающих все форматы данных, доступные в объекте данных (собственный и с автоматическим преобразованием).
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(String) перегрузки, чтобы проверить, доступно ли заданного формата данных (встроенный или с автоматическим преобразованием). Если доступен указанный формат, данные извлекаются с помощью GetData(String) метод.
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[];
}
Дополнительные примеры кода, который извлекает данные из объекта данных, см. в разделе получение данных в определенном формате данных.
Удаление данных из объекта данных
Невозможно удалить данные непосредственно из объекта данных. Для эффективного удаления данных из объекта данных, выполните следующие действия.
Создайте новый объект данных, который будет содержать только данные, которые вы хотите сохранить.
«Копировать» необходимых данных из старых объектов данных в новый объект данных. Чтобы скопировать данные, используйте один из GetData методы для получения Object содержит необработанные данные и затем воспользуйтесь одним из SetData методы для добавления данных в новый объект данных.
Замените старый объект данных новым.