Data- och dataobjekt
Data som överförs som en del av en dra och släpp-åtgärd lagras i ett dataobjekt. Konceptuellt består ett dataobjekt av ett eller flera av följande par:
En Object som innehåller faktiska data.
En motsvarande identifierare för dataformat.
Själva data kan bestå av allt som kan representeras som en bas Object. Motsvarande dataformat är en sträng eller Type som ger en ledtråd om vilket format data finns i. Dataobjekt stöder värd för flera data/dataformatpar. Detta gör det möjligt för ett enskilt dataobjekt att tillhandahålla data i flera format.
Dataobjekt
Alla dataobjekt måste implementera IDataObject-gränssnittet, som tillhandahåller följande standarduppsättning av metoder som möjliggör och underlättar dataöverföring.
Metod | Sammanfattning |
---|---|
GetData | Hämtar ett dataobjekt i ett angivet dataformat. |
GetDataPresent | Kontrollerar om data är tillgängliga i, eller kan konverteras till, ett angivet format. |
GetFormats | Returnerar en lista med format som data i det här dataobjektet lagras i eller kan konverteras till. |
SetData | Lagrar angivna data i det här dataobjektet. |
WPF tillhandahåller en grundläggande implementering av IDataObject i klassen DataObject. Lagerklassen DataObject räcker för många vanliga dataöverföringsscenarier.
Det finns flera fördefinierade format, till exempel bitmapp, CSV, fil, HTML, RTF, sträng, text och ljud. Information om fördefinierade dataformat som tillhandahålls med WPF finns i DataFormats klassreferensavsnittet.
Dataobjekt innehåller ofta en funktion för att automatiskt konvertera data som lagras i ett format till ett annat format när data extraheras. denna anläggning kallas automatisk konvertering. När du frågar efter de dataformat som är tillgängliga i ett dataobjekt kan autokonverterade dataformat filtreras från interna dataformat genom att anropa metoden GetFormats(Boolean) eller GetDataPresent(String, Boolean) och ange parametern autoConvert
som false
. När du lägger till data i ett dataobjekt med metoden SetData(String, Object, Boolean) kan automatisk konvertering av data förbjudas genom att ange parametern autoConvert
till false
.
Arbeta med dataobjekt
I det här avsnittet beskrivs vanliga tekniker för att skapa och arbeta med dataobjekt.
Skapa nya dataobjekt
Klassen DataObject innehåller flera överlagrade konstruktorer som gör det lättare att fylla i en ny DataObject-instans med ett enda data/dataformatpar.
Följande exempelkod skapar ett nytt dataobjekt och använder en av de överlagrade konstruktorerna DataObject(DataObject(String, Object)) för att initiera dataobjektet med en sträng och ett angivet dataformat. I det här fallet anges dataformatet med en sträng. klassen DataFormats innehåller en uppsättning fördefinierade typsträngar. Automatisk konvertering av lagrade data tillåts som standard.
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)
Fler exempel på kod som skapar ett dataobjekt finns i Skapa ett dataobjekt.
Lagra data i flera format
Ett enskilt dataobjekt kan lagra data i flera format. Strategisk användning av flera dataformat i ett enda dataobjekt kan göra att dataobjektet kan användas av en bredare mängd släppmål än om endast ett enda dataformat kunde representeras. Observera att en dragkälla i allmänhet måste vara oberoende om de dataformat som kan användas av potentiella släppmål.
I följande exempel visas hur du använder metoden SetData(String, Object) för att lägga till data i ett dataobjekt i flera format.
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)
Fråga ett dataobjekt om tillgängliga format
Eftersom ett enskilt dataobjekt kan innehålla ett godtyckligt antal dataformat, innehåller dataobjekt möjligheter att hämta en lista över tillgängliga dataformat.
I följande exempelkod används GetFormats överlagring för att hämta en matris med strängar som anger alla tillgängliga dataformat i ett dataobjekt (både interna och automatiskt konverterade).
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
Fler exempel på kod som frågar ett dataobjekt om tillgängliga dataformat finns i Lista dataformat i ett dataobjekt. Exempel på hur du frågar ett dataobjekt om förekomsten av ett visst dataformat finns i Kontrollera om ett dataformat finns i ett dataobjekt.
Hämta data från ett dataobjekt
Att hämta data från ett dataobjekt i ett visst format innebär helt enkelt att anropa någon av de GetData metoderna och ange önskat dataformat. En av de GetDataPresent metoderna kan användas för att kontrollera förekomsten av ett visst dataformat. GetData returnerar data i en Object; beroende på dataformatet kan det här objektet omvandlas till en typspecifik container.
I följande exempelkod används metoden "GetDataPresent(String)" för att kontrollera om ett angivet dataformat är tillgängligt (inbyggt eller automatiskt konverterat). Om det angivna formatet är tillgängligt hämtar exemplet data med hjälp av metoden 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[];
}
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
Fler exempel på kod som hämtar data från ett dataobjekt finns i Hämta data i ett visst dataformat.
Ta bort data från ett dataobjekt
Data kan inte tas bort direkt från ett dataobjekt. Följ dessa steg för att effektivt ta bort data från ett dataobjekt:
Skapa ett nytt dataobjekt som endast innehåller de data som du vill behålla.
"Kopiera" önskade data från det gamla dataobjektet till det nya dataobjektet. Om du vill kopiera data använder du någon av de GetData metoderna för att hämta en Object som innehåller rådata och använder sedan någon av de SetData metoderna för att lägga till data i det nya dataobjektet.
Ersätt det gamla dataobjektet med det nya.
.NET Desktop feedback