Udostępnij za pośrednictwem


Dane i obiekty danych

Dane przesyłane w ramach operacji przeciągania i upuszczania są przechowywane w obiekcie danych. Koncepcyjnie obiekt danych składa się z co najmniej jednej z następujących par:

  • Element Object zawierający rzeczywiste dane.

  • Odpowiadający mu identyfikator formatu danych.

Same dane mogą składać się z dowolnych elementów, które mogą być reprezentowane jako podstawowe Object. Odpowiedni format danych jest ciągiem lub Type zawiera wskazówkę dotyczącą formatu danych. Obiekty danych obsługują hostowanie wielu par danych/formatu danych; Umożliwia to pojedynczemu obiektowi danych udostępnianie danych w wielu formatach.

Obiekty danych

Wszystkie obiekty danych muszą implementować IDataObject interfejs, który zapewnia następujący standardowy zestaw metod, które umożliwiają i ułatwiają transfer danych.

Metoda Podsumowanie
GetData Pobiera obiekt danych w określonym formacie danych.
GetDataPresent Sprawdza, czy dane są dostępne w określonym formacie, czy też można je przekonwertować.
GetFormats Zwraca listę formatów, w których są przechowywane dane w tym obiekcie danych lub można je przekonwertować na.
SetData Przechowuje określone dane w tym obiekcie danych.

WPF zapewnia podstawową implementację IDataObjectDataObject klasy . Klasa zapasów DataObject jest wystarczająca dla wielu typowych scenariuszy transferu danych.

Istnieje kilka wstępnie zdefiniowanych formatów, takich jak mapa bitowa, CSV, plik, HTML, RTF, ciąg, tekst i dźwięk. Aby uzyskać informacje o wstępnie zdefiniowanych formatach danych dostarczanych z platformą WPF, zobacz DataFormats temat referencyjny klasy.

Obiekty danych często obejmują obiekt umożliwiający automatyczne konwertowanie danych przechowywanych w jednym formacie na inny format podczas wyodrębniania danych; ta funkcja jest określana jako autokonwertuj. Podczas wykonywania zapytań dotyczących formatów danych dostępnych w obiekcie danych formaty danych automatycznie konwertowane mogą być filtrowane z natywnych formatów danych przez wywołanie GetFormats(Boolean) metody lub GetDataPresent(String, Boolean) i określenie parametru autoConvert jako false. Podczas dodawania danych do obiektu danych za SetData(String, Object, Boolean) pomocą metody automatyczna konwersja danych może być zabroniona przez ustawienie parametru autoConvert na false.

Praca z obiektami danych

W tej sekcji opisano typowe techniki tworzenia obiektów danych i pracy z nimi.

Tworzenie nowych obiektów danych

Klasa DataObject udostępnia kilka przeciążonych konstruktorów, które ułatwiają wypełnianie nowego DataObject wystąpienia pojedynczą parą formatu danych/danych.

Poniższy przykładowy kod tworzy nowy obiekt danych i używa jednego z przeciążonych konstruktorów DataObject(DataObject(String, Object)), aby zainicjować obiekt danych za pomocą ciągu i określonego formatu danych. W takim przypadku format danych jest określany przez ciąg; DataFormats klasa udostępnia zestaw wstępnie zdefiniowanych ciągów typów. Automatyczna konwersja przechowywanych danych jest domyślnie dozwolona.

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)

Aby uzyskać więcej przykładów kodu tworzącego obiekt danych, zobacz Tworzenie obiektu danych.

Przechowywanie danych w wielu formatach

Pojedynczy obiekt danych może przechowywać dane w wielu formatach. Strategiczne użycie wielu formatów danych w ramach pojedynczego obiektu danych potencjalnie sprawia, że obiekt danych może być używany przez szerszą gamę obiektów docelowych upuszczania, niż jeśli można przedstawić tylko jeden format danych. Należy pamiętać, że ogólnie źródło przeciągania musi być niezależne od formatów danych, które są eksploatacyjne przez potencjalne miejsca docelowe upuszczania.

W poniższym przykładzie pokazano, jak za pomocą SetData(String, Object) metody dodać dane do obiektu danych w wielu formatach.

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)

Wykonywanie zapytań względem obiektu danych dla dostępnych formatów

Ponieważ pojedynczy obiekt danych może zawierać dowolną liczbę formatów danych, obiekty danych obejmują obiekty służące do pobierania listy dostępnych formatów danych.

Poniższy przykładowy kod używa GetFormats przeciążenia, aby uzyskać tablicę ciągów oznaczających wszystkie formaty danych dostępne w obiekcie danych (zarówno natywnym, jak i przez automatyczne konwertowanie).

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

Aby uzyskać więcej przykładów kodu, który wysyła zapytanie do obiektu danych pod kątem dostępnych formatów danych, zobacz Wyświetlanie listy formatów danych w obiekcie danych. Aby zapoznać się z przykładami wykonywania zapytań względem obiektu danych w celu obecności określonego formatu danych, zobacz Określanie, czy format danych znajduje się w obiekcie danych.

Pobieranie danych z obiektu danych

Pobieranie danych z obiektu danych w określonym formacie polega po prostu na wywołaniu jednej z GetData metod i określeniu żądanego formatu danych. GetDataPresent Jedną z metod można użyć do sprawdzenia obecności określonego formatu danych. GetData Zwraca dane w obiekcie Object; w zależności od formatu danych ten obiekt można rzutować do kontenera specyficznego dla typu.

Poniższy przykładowy kod używa GetDataPresent(String) przeciążenia, aby sprawdzić, czy określony format danych jest dostępny (natywny lub przez automatyczne konwertowanie). Jeśli określony format jest dostępny, przykład pobiera dane przy użyciu GetData(String) metody .

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

Aby uzyskać więcej przykładów kodu pobierającego dane z obiektu danych, zobacz Pobieranie danych w określonym formacie danych.

Usuwanie danych z obiektu danych

Nie można bezpośrednio usunąć danych z obiektu danych. Aby skutecznie usunąć dane z obiektu danych, wykonaj następujące kroki:

  1. Utwórz nowy obiekt danych, który będzie zawierać tylko dane, które chcesz zachować.

  2. "Skopiuj" żądane dane ze starego obiektu danych do nowego obiektu danych. Aby skopiować dane, użyj jednej z GetData metod, aby pobrać obiekt Object zawierający dane pierwotne, a następnie użyć jednej z SetData metod, aby dodać dane do nowego obiektu danych.

  3. Zastąp stary obiekt danych nowym obiektem.

Uwaga

Metody SetData dodają dane tylko do obiektu danych; nie zastępują danych, nawet jeśli dane i format danych są dokładnie takie same jak poprzednie wywołanie. Wywołanie SetData dwa razy dla tych samych danych i formatu danych spowoduje dwukrotne wyświetlenie formatu danych/danych w obiekcie danych.