C #: перетащите элементы управления на поверхность - PullRequest
1 голос
/ 26 ноября 2009

Есть ли способ сделать элемент управления, такой как текстовое поле, перетаскиваемым в C #?

Я хочу, чтобы пользователь имел возможность щелкать и удерживать элемент управления с помощью мыши, перетаскивать его по поверхности и опускать в любое место на этой поверхности.

Кто-нибудь знает, как это реализовать?

Ответы [ 4 ]

2 голосов
/ 26 ноября 2009

Этот ответ мне очень помог. Отлично работает на любом типе Контроля и Контейнера.

1 голос
/ 26 ноября 2009

Если ваш элемент управления перемещается в одном контейнере (например, панели), вы можете переопределить события OnMouseDown / OnMouseMove и настроить свойство Location элемента управления.

Исходя из вашего вопроса, не похоже, что вам нужно полное перетаскивание (перемещение данных между различными элементами управления или даже приложениями).

0 голосов
/ 26 ноября 2009

Раньше это было так просто в VB6. Но теперь у нас действительно есть только то, что раньше называлось OleDrag.

Во всяком случае, следующий код должен показать вам, как. Вам просто нужен один ярлык ( dragDropLabel ) и установите для свойства AllowDrop формы ( DragDropTestForm ) значение 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);
                }
            }
        }
    }
}
0 голосов
/ 26 ноября 2009

если вы пытаетесь перетащить предмет из контейнера silverlight, тогда вам лучше всего проверить 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
 }
...