DoDragDrop из стандартного ярлыка не работает - PullRequest
0 голосов
/ 27 сентября 2010

Я не могу понять, почему попытка перетащить текст из стандартной метки в блокнот (или любой другой элемент управления, принимающий текст) не работает.Я посмотрел на документацию и примеры, и я не вижу проблемы.Курсор остается кругом с линией, проходящей через него, и если я регистрирую обратный вызов FeedBack, событие всегда НЕТ.Создание стандартного приложения Windows Forms, удаление элемента управления Label и регистрация событий MouseDown и MouseMove У меня есть этот код, где я вызываю label1.DoDragDrop (label1, DragDropEffects.All | DragDropEffects.Link).Любая помощь будет оценена.

Вот мой код формы:

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 DragDropLabel
{
    public partial class Form1 : Form
    {
        Point m_ClickLocation;
        bool _bDragging = false;
        public Form1()
        {
            InitializeComponent();
        }

        private void OnLabelMouseDown(object sender, MouseEventArgs e)
        {
            m_ClickLocation = e.Location;
            _bDragging = true;
        }

        private void OnLabelMouseMove(object sender, MouseEventArgs e)
        {
            if (_bDragging)
            {
                Point pt = e.Location;
                Size dragSize = SystemInformation.DragSize;
                if (Math.Abs(pt.X - m_ClickLocation.X) > dragSize.Width / 2 ||
                    Math.Abs(pt.Y - m_ClickLocation.Y) > dragSize.Height / 2)
                {
                    DragDropEffects rc = label1.DoDragDrop(label1, DragDropEffects.All | DragDropEffects.Link);
                    _bDragging = false;
                }
            }
        }

    }
}

Ответы [ 2 ]

1 голос
/ 27 сентября 2010

Сначала измените

DragDropEffects rc = label1.DoDragDrop(label1, DragDropEffects.All | DragDropEffects.Link);

до

label1.DoDragDrop(label1.Text, DragDropEffects.Copy);

Во-вторых, вы должны подготовить цель сброса. Предположим, это текстовое поле. Вот пример метода расширения, который позволит настроить любое текстовое поле, вызвав MyTextBox.EnableTextDrop():

static class TextBoxExtensions
{
    public static void EnableTextDrop(this TextBox textBox)
    {
        if(textBox == null) throw new ArgumentNullException("textBox");

        // first, allow drop events to occur
        textBox.AllowDrop = true;
        // handle DragOver to provide visual feedback
        textBox.DragOver += (sender, e) =>
            {
                if(((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) &&
                    e.Data.GetDataPresent(typeof(string)))
                {
                    e.Effect = DragDropEffects.Copy;
                }
            };
        // handle DragDrop to set text
        textBox.DragDrop += (sender, e) =>
            {
                if(((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) &&
                    e.Data.GetDataPresent(typeof(string)))
                {
                    ((TextBox)sender).Text = (string)e.Data.GetData(typeof(string));
                }
            };
    }
}
1 голос
/ 27 сентября 2010

Стандартные элементы управления редактированием (текстовые поля) не поддерживают перетаскивание и не принимают пропущенный текст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...