سؤال

هل هناك طريقة يمكن للمرء من خلالها إنشاء عنصر تحكم، مثل مربع نص، يمكن سحبه وإسقاطه في C#؟

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

هل لدى أي شخص أي فكرة عن كيفية تنفيذ هذا؟

هل كانت مفيدة؟

المحلول

ساعد

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

نصائح أخرى

إذا التحكم الخاصة بك يتحرك داخل حاوية واحدة (مثل لوحة)، يمكنك تجاوز عند_ضغط_الماوس / أحداث OnMouseMove، وضبط خاصية الموقع من عنصر التحكم.

وبناء على سؤالك، فإنه لا يبدو أن تحتاج الكامل السحب والإفلات (نقل البيانات بين عناصر التحكم مختلفة أو حتى التطبيقات).

وإذا كنت تحاول سحب عنصر من خارج الحاوية سيلفرلايت، ثم أفضل رهان هو للتحقق من <لأ href = "http://timheuer.com/blog/archive/2009/11/18/whats -NEW-في سيلفرلايت-4-الكامل-دليل-جديد-features.aspx # droptarget "يختلط =" نوفولو noreferrer "> سيلفرلايت 4 بيتا

public MainPage()
 {
     InitializeComponent();
     Loaded += new RoutedEventHandler(MainPage_Loaded);   
     // wire up the various Drop events
     InstallButton.Drop += new DragEventHandler(InstallButton_Drop);
     InstallButton.DragOver += new DragEventHandler(InstallButton_DragOver);
     InstallButton.DragEnter += new DragEventHandler(InstallButton_DragEnter);
     InstallButton.DragLeave += new DragEventHandler(InstallButton_DragLeave);
 }

 void InstallButton_Drop(object sender, DragEventArgs e)
 {
     IDataObject foo = e.Data; // do something with data
 }

كان هذا سهلاً جدًا في VB6.لكن الآن ليس لدينا سوى ما كان يُطلق عليه اسم OleDrag.

على أية حال، يجب أن يوضح لك الكود التالي كيفية القيام بذلك.تحتاج فقط إلى تسمية واحدة (DragDropLabel)، وقم بتعيين السماح للإسقاط خاصية النموذج (DragDropTestForm) إلى صحيح.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace DragDropTest
{
    public partial class DragDropTestForm : Form
    {
        // Negative offset to drop location, to adjust for position where a drag starts
        // on a label.
        private Point _labelOffset;

        // Save the full type name for a label, since this is used to test for the control type.
        private string labelTypeName = typeof(Label).FullName;

        public DragDropTestForm()
        {
            InitializeComponent();
        }

        private void dragDropLabel_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                _labelOffset = new Point(-e.X, -e.Y);
            }
        }

        private void dragDropLabel_MouseMove(object sender, MouseEventArgs e)
        {
            const double minimumDragDistance = 4;
            const double minimumDragDistanceSquared = minimumDragDistance * minimumDragDistance;

            if (e.Button == MouseButtons.Left)
            {
                // Minimum n pixel movement before drag starts.
                if (((Math.Pow(_labelOffset.X - e.X, 2)) + Math.Pow(_labelOffset.Y - e.Y, 2)) >= minimumDragDistanceSquared)
                {
                    dragDropLabel.DoDragDrop(dragDropLabel, DragDropEffects.Move);
                }
            }       
        }

        private void DragDropTestForm_DragOver(object sender, DragEventArgs e)
        {
            IDataObject data = e.Data;

            string[] formats = data.GetFormats();

            if (formats[0] == labelTypeName)
            {
                e.Effect = DragDropEffects.Move;
            }
        }

        private void DragDropTestForm_DragDrop(object sender, DragEventArgs e)
        {
            IDataObject data = e.Data;

            string[] formats = data.GetFormats();

            if (formats[0] == labelTypeName)
            {
                Label label = (Label) data.GetData(formats[0]);
                if (label == dragDropLabel)
                {
                    Point newLocation = new Point(e.X, e.Y);
                    newLocation.Offset(_labelOffset);
                    dragDropLabel.Location = this.PointToClient(newLocation);
                }
            }
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top