نظرة عامة حول السحب و الإفلات

يوفر هذا الموضوع نظرة عامة حول دعم السحب و الإفلات في تطبيقات Windows Presentation Foundation (WPF). يشير السحب و الإفلات عادة إلى أسلوب من تفاعل واجهة المستخدم (UI) الذي يتضمن استخدام ماوس (أو جهاز إشارة آخر) لتحديد كائن واحد أو أكثر, ساحباً هذه الكائنات عبر هدف الإفلات المطلوب في واجهة المستخدم ، و إفلاتها.

يشتمل هذا الموضوع على الأقسام التالية.

  • دعم السحب و الإفلات في WPF
  • البيانات و كائنات البيانات
  • أحداث السحب و الإفلات
  • العمل مع كائنات البيانات
  • موضوعات ذات صلة

دعم السحب و الإفلات في WPF

تتضمن عمليات السحب و الإفلات عادةً جهتين: مصدر سحب حيث تم إنشاء الكائن المسحوب و هدف الإفلات الذي يتلقى الكائن المُسقط. مصدر السحب و هدف الإفلات يمكن أن يكونوا نفس التطبيق أو تطبيق مختلف.

نوع و عدد الكائنات التي يمكن معالجتها باستخدام السحب و الإفلات هم تماماً إجباريين; ملف أو أكثر أو مجلدات و تحديدات المحتوى هم بعض الكائنات الأكثر شيوعًا المُعالجة خلال عمليات السحب و الإفلات. إجراء(إجراءات) معين التي يتم إجراؤها أثناء عملية السحب و الإفلات هو تطبيق محدد و غالباً يتم تعريفه بواسطة سياق. على سبيل المثال، سحب تحديد ملفات من مجلد واحد إلى آخر على نفس جهاز التخزين تقوم بنقل الملفات بشكل افتراضي, بينما سحب الملفات من اصطلاح التسمية العالمي (UNC) مشاركة إلى مجلد محلي يقوم بنسخ الملفات بشكل افتراضي. تسهيلات السحب و الإفلات المُوفَّرة من قبل WPF مصممة لتكون مرنة بشدة و قابلة للتخصيص لدعم تشكيلة واسعة من سيناريوهات السحب و الإفلات. يدعم السحب و الإفلات التعامل مع كائنات في تطبيق واحد أو بين تطبيقات مختلفة; السحب و الإفلات بين تطبيقات WPF و تطبيقات Windows الأخرى مدعمة أيضاً بشكل كامل. السحب و الإفلات يقع ضمن المنطقة الأكثر العمومية من نقل البيانات; بالإضافة إلى السحب و الإفلات ، يتضمن نقل البيانات أيضاً استخدام حافظة النظام لعمليات النسخ واللصق.

ملاحظة الأمانسحب و إفلات OLE لا يعمل في منطقة إنترنت.

البيانات و كائنات البيانات

البيانات التي يتم نقلها كجزء من عملية السحب و الإفلات يتم تخزينها في كائن بيانات. مفهومياً ، كائن البيانات يتكون من زوج واحد أو أكثر من:

  • Object الذي يحتوي على البيانات الفعلية، و

  • معرف تنسيق البيانات المتوافق.

البيانات نفسها يمكن أن تتكون من أي شيء يمكن تمثيله مثل Object أساسي. يتم تنسيق بيانات المطابقة سلسلة أو Typeوالذي يوفر تلميح حول ما بتنسيق بيانات هو بوصة تعتمد الكائنات البيانات استضافة عدة أزواج البيانات-(تنسيق البيانات)؛ وذلك من كائن واحد من بيانات إلى توفير البيانات بتنسيقات متعددة.

كافة كائنات البيانات يجب أن تقوم بتنفيذ واجهة IDataObject التي توفر المجموعة القياسية التالية من الأساليب التي تتيح و تيسّر نقل البيانات.

Method

ملخص

GetData

استرداد كائن البيانات في تنسيق بيانات محدد.

GetDataPresent

التحقق لمعرفة ما إذا كانت البيانات متوفرة في أو يمكن تحويلها إلى تنسيق محدد.

GetFormats

إرجاع قائمة من التنسيقات حيث يتم تخزين البيانات في هذا الكائن للبيانات أو يمكن تحويلها إليه.

SetData

تخزين بيانات محددة في هذا الكائن للبيانات.

WPF يوفر تطبيق أساسي من IDataObject في فئة DataObject; فئة أسهم DataObject يكفي لمعظم سيناريوهات نقل البيانات الشائعة.

للحصول على معلومات حول تنسيقات البيانات المعرفة مسبقاً المتوفرة مع WPF, راجع موضوع مرجع فئة DataFormats.

تتضمن كائنات البيانات بشكل شائع أداة تسهيل لتحويل تلقائياً البيانات المخزنة في تنسيق واحد إلى تنسيق آخر أثناء استخراج البيانات; هذه أداة يشار إليها على أنها تحويل تلقائي.

عند الاستعلام عن تنسيقات البيانات المتوفرة في كائن بيانات ، تنسيقات البيانات المحولة تلقائياً يمكن أن تصفي من تنسيقات البيانات الأصلية عن طريق استدعاء أسلوب GetFormats(Boolean) أو GetDataPresent(String, Boolean) و تحديد المعلمة autoConvert كـ false . عند إضافة بيانات إلى كائن بيانات مع أسلوب SetData(String, Object, Boolean), يمكن منع أسلوب التحويل التلقائي للبيانات بتعيين المعلمة autoConvert إلى false.

أحداث السحب و الإفلات

عمليات السحب و الإفلات يدعم طراز حدث المُنشئ. كلاً من مصدر السحب و هدف الإفلات يستخدم مجموعة قياسية من الأحداث لمعالجة عمليات السحب و الإفلات. الجداول التالية تلخص أحداث السحب و الإفلات القياسية.

الأحداث مصدر السحب

الحدث

ملخص

GiveFeedback

يحدث هذا الحدث عند بدء تشغيل عملية السحب والإفلات ويقوم بتمكين هدف الإفلات من إرسال معلومات الملاحظات إلى مصدر السحب; بشكل عام يتم استخدام هذه الملاحظات بواسطة مصدر السحب لضبط مظهر مؤشر الماوس لتوفير معلومات للمستخدم بشكل حيوي. هذا هو الحدث الفقاعي .

QueryContinueDrag

يحدث هذا الحدث عند حدوث تغيير في حالات لوحة المفاتيح أو زر الماوس أثناء عملية السحب و الإفلات و يمكّن مصدر الإفلات من إلغاء عملية السحب و الإفلات استناداً إلى حالات المفتاح/الزر. هذا هو الحدث الفقاعي

PreviewGiveFeedback

إصدار نفق من GiveFeedback.

PreviewQueryContinueDrag

إصدار نفق من QueryContinueDrag.

أحداث هدف الإفلات

الحدث

ملخص

DragEnter

يحدث هذا الحدث عند سحب كائن إلى حدود هدف الإفلات. هذا هو الحدث الفقاعي

DragLeave

يحدث هذا الحدث عند سحب كائن خارج حدود هدف الإفلات. هذا هو الحدث الفقاعي

DragOver

يحدث هذا الحدث عند سحب (انتقال) كائن داخل حد هدف الإفلات. هذا هو الحدث الفقاعي

Drop

يحدث هذا الحدث عند إفلات الكائن على هدف الإفلات. هذا هو الحدث الفقاعي

PreviewDragEnter

إصدار نفق من DragEnter.

PreviewDragLeave

إصدار نفق من DragLeave.

PreviewDragOver

إصدار نفق من DragOver.

PreviewDrop

إصدار نفق من Drop.

العمل مع كائنات البيانات

يصف هذا القسم الأساليب الشائعة لإنشاء و العمل مع كائنات البيانات.

استخدام مُنشئات DataObject

فئة DataObject يوفر عدة مُنشئات محملة زيادة التي تسهل ملء مثيل DataObject جديد مع زوج بيانات مفرد-(تنسيق البيانات).

رمز المثال التالي يقوم بإنشاء كائن بيانات جديد و يستخدم أحد المُنشئات المحملة بشكل زائد ( DataObject(String, Object)) لتهيئة كائن البيانات بسلسلة و طريقة تنسيق البيانات محددة. في هذه الحالة طريقة تنسيق البيانات محددة بواسطة سلسلة;توفر فئة 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(String, Object) لإضافة البيانات إلى كائن البيانات في عدة تنسيقات.

                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(String) للتحقق أولاً إذا كان تنسيق البيانات المحدد متوفر (أصلاً أو عن طريق تحويل تلقائي). في حالة توفر التنسيق المحدد يسترد المثال البيانات باستخدام أسلوب GetData(String).

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 مرتين من أجل نفس البيانات و تنسيق البيانات سيؤدي إلى وجود تنسيق البيانات-البيانات مرتين في كائن البيانات.

راجع أيضًا:

المرجع

Clipboard

موارد أخرى

سحب ونقل مواضيع How-to

سحب و إفلات