DoDragDrop и MouseUp

Используя Reduce в библиотеке Lodash, вы можете сделать следующее, где arr - ваш входной массив.

_.reduce(arr, function(acc, val) { var k1 = val[0], k2 = val[1], val = val.slice(2); acc[k1] = acc[k1] || {}; acc[k1][k2] = val; return acc; }, {});

17
задан Chris Ammerman 26 August 2008 в 23:23
поделиться

1 ответ

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

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

Вот код, который я объясню ниже:

this.LabelDrag.QueryContinueDrag += new System.Windows.Forms.QueryContinueDragEventHandler(this.LabelDrag_QueryContinueDrag);
this.LabelDrag.MouseDown += new System.Windows.Forms.MouseEventHandler(this.LabelDrag_MouseDown);
this.LabelDrag.MouseUp += new System.Windows.Forms.MouseEventHandler(this.LabelDrag_MouseUp);

this.LabelDrop.DragDrop += new System.Windows.Forms.DragEventHandler(this.LabelDrop_DragDrop);
this.LabelDrop.DragEnter += new System.Windows.Forms.DragEventHandler(this.LabelMain_DragEnter);

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void LabelDrop_DragDrop(object sender, DragEventArgs e)
    {
        LabelDrop.Text = e.Data.GetData(DataFormats.Text).ToString();
    }


    private void LabelMain_DragEnter(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent(DataFormats.Text))
            e.Effect = DragDropEffects.Copy;
        else
            e.Effect = DragDropEffects.None;

    }

    private void LabelDrag_MouseDown(object sender, MouseEventArgs e)
    {
        //EXTREMELY IMPORTANT - MUST CALL LabelDrag's DoDragDrop method!!
        //Calling the Form's DoDragDrop WILL NOT allow QueryContinueDrag to fire!
        ((Label)sender).DoDragDrop(TextMain.Text, DragDropEffects.Copy); 
    }

    private void LabelDrag_MouseUp(object sender, MouseEventArgs e)
    {
        LabelDrop.Text = "LabelDrag_MouseUp";
    }

    private void LabelDrag_QueryContinueDrag(object sender, QueryContinueDragEventArgs e)
    {
        //Get rect of LabelDrop
        Rectangle rect = new Rectangle(LabelDrop.Location, new Size(LabelDrop.Width, LabelDrop.Height));

        //If the left mouse button is up and the mouse is not currently over LabelDrop
        if (Control.MouseButtons != MouseButtons.Left && !rect.Contains(PointToClient(Control.MousePosition)))
        {
            //Cancel the DragDrop Action
            e.Action = DragAction.Cancel;
            //Manually fire the MouseUp event
            LabelDrag_MouseUp(sender, new MouseEventArgs(Control.MouseButtons, 0, Control.MousePosition.X, Control.MousePosition.Y, 0));
        }
    }

}

я не учел большую часть кода разработчика, но включал код соединения Обработчика событий, таким образом, можно быть уверены, что связано с какой. В моем примере перетаскивание/отбрасывание происходит между, маркирует LabelDrag и LabelDrop.

основная часть моего решения использует событие QueryContinueDrag. Это событие стреляет, когда к изменениям клавиатуры или состояния мыши после DoDragDrop обратились то управление. Можно уже делать это, но очень важно, чтобы Вы назвали метод DoDragDrop управления, которое является Вашим источником а не методом, связанным с формой. Иначе QueryContinueDrag НЕ будет стрелять!

Одна вещь отметить состоит в том, что QueryContinueDrag будет на самом деле стрелять при выпуске мыши на управлении отбрасыванием , таким образом, мы должны удостовериться, что допускаем это. Это обрабатывается путем проверки, что Положение мыши (получил с глобальным Управлением. Свойство MousePosition), в прямоугольнике управления LabelDrop. Также, несомненно, необходимо будет преобразовать MousePosition в точку относительно Клиентского Окна с PointToClient как Управление. MousePosition возвращается экранный родственник положение.

Так путем проверки, что мышь не по управлению отбрасыванием и что кнопка мыши теперь , мы эффективно получили Событие mouseUp для управления LabelDrag!:) Теперь, Вы могли просто сделать любую обработку, Вы хотите сделать здесь, но если у Вас уже есть код, Вы используете в обработчике Событий mouseUp, это не эффективно. Поэтому просто назовите свое Событие mouseUp отсюда, передав его, необходимые параметры и обработчик MouseUp никогда не будут знать различия.

Просто примечание, хотя, как я называю DoDragDrop от в Обработчик события mouseDown в моем примере, этот код должен никогда на самом деле, заставляет прямое Событие mouseUp стрелять. Я просто поместил тот код там, чтобы показать, что возможно сделать это.

Hope, которая помогает!

23
ответ дан 30 November 2019 в 13:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: