Frage

Gibt es eine Möglichkeit, dass man eine Kontrolle, wie eine Textbox machen, Drag-abwerfbaren in C #?

Ich möchte der Benutzer die Möglichkeit haben, zu klicken und die Steuerung mit der Maus festhalten und ziehen um auf seiner Oberfläche und legen Sie es irgendwo innerhalb dieser Fläche.

Jeder hat eine Vorstellung davon, wie diese umzusetzen?

War es hilfreich?

Lösung

Diese Antwort half mir ein Menge. Es funktioniert großartig auf jede Art von Kontrolle und Containern.

Andere Tipps

Wenn Sie Ihre Steuerung in einem Container zu bewegen (z Panel) können Sie OnMouseDown / OnMouseMove Ereignisse außer Kraft setzen und die Location-Eigenschaft der Steuerung einstellen.

Auf der Grundlage Ihrer Frage, scheint es nicht, dass Sie vollen Drag-and-Drop (Verschieben von Daten zwischen verschiedenen Steuerungen oder sogar Anwendungen) benötigen.

Wenn Sie versuchen, ein Element ziehen von außerhalb der Silverlight-Container, dann Ihre beste Wette ist zu prüfen, Silverlight 4 beta

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
 }

Die verwendeten so einfach in VB6 zu sein. Aber jetzt wirklich nur wir haben, was OLEDrag werden genannt, verwendet wird.

Wie auch immer, sollte der folgende Code zeigt Ihnen, wie. Sie brauchen nur ein einzelnes Etikett ( dragDropLabel ), und stellen Sie die AllowDrop Eigenschaft des Formulars ( DragDropTestForm ) auf True fest.

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);
                }
            }
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top