Question

Existe-t-il un moyen de créer un contrôle, tel qu’une zone de texte, en mode glisser-déposer en C #?

Je souhaite que l'utilisateur puisse cliquer et maintenir le contrôle avec la souris, le faire glisser sur sa surface et le déposer n'importe où dans cette surface.

Quelqu'un a-t-il une idée de la manière de le mettre en œuvre?

Était-ce utile?

La solution

Cette réponse m'a aidé à lot. Cela fonctionne très bien sur n'importe quel type de contrôle et de conteneur.

Autres conseils

Si votre contrôle est déplacé dans un conteneur (par exemple, un panneau), vous pouvez remplacer les événements OnMouseDown / OnMouseMove et ajuster la propriété Location du contrôle.

En fonction de votre question, il ne semble pas que vous ayez besoin de glisser-déposer complet (transfert de données entre différents contrôles ou même des applications).

Si vous essayez de faire glisser un élément en dehors du conteneur silverlight, votre meilleur choix est de vérifier version bêta de silverlight 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
 }

C’était si simple avec VB6. Mais maintenant, nous n’avons vraiment que ce qu’on appelait jadis OleDrag.

Quoi qu’il en soit, le code suivant devrait vous montrer comment. Vous n'avez besoin que d'une seule étiquette ( dragDropLabel ) et définissez la propriété AllowDrop du formulaire ( DragDropTestForm ) sur True.

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);
                }
            }
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top