1

その中Panelにカスタムコントロールのいくつかのドラッグアンドドロップ操作があります。ドラッグが始まるとpanel.Capture = True;、ユーザーがパネルの境界の外でマウスの左ボタンを離した場合でも、パネルが適切なイベントを発生させるようにします(例: panel_DragDrop)が、DragDropイベントはありませんカーソルがパネルの境界内にあるときにマウスの左ボタンを離さない限り、起動されません。

これで解決すると思っpanel.Captureたのですが、効果がありません。ここで何が欠けているのですか?

編集:わかりました、私は今何をしなければならないかを知っていると思います。DragDrop イベントを誤解していたと思います。私のアプリケーションで持っているのは、パネル内のコントロールのみをドラッグすることです (移動ブロックと考えてください)。ユーザーがブロックをドラッグして範囲外に出ている間、カーソルがパネルの外に出た場合、自動スクロールしますpanel_DragDrop。が呼び出され、マウスが離された場合、ブロックの配置は行われません。私の解決策はこれだと思います: Cursor.Clip = panelDiagram.RectangleToScreen(panelDiagram.ClientRectangle);

これにより、ドラッグ中にカーソルがパネルの境界にバインドされるため、カーソルを境界から外す方法はありません。

ご迷惑をおかけして申し訳ありません

4

1 に答える 1

0

フォームとパネルだけで小さなテスト プロジェクトを作成したところ、これでうまくいきました。

using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
public class Form1
{

    public Form1()
    {
        DragDrop += DD;
        DragEnter += Panel1DragEnter;
        // This call is required by the designer.
        InitializeComponent();

        // Add any initialization after the InitializeComponent() call.
        Panel1.AllowDrop = true;
        AllowDrop = true;

    }

    private void Panel1DragEnter(System.Object sender, System.Windows.Forms.DragEventArgs e)
    {
        if (object.ReferenceEquals(sender, Panel1)) {
            Panel1.Capture = true;
        }

        if (Panel1.Capture) {
            if ((e.Data.GetDataPresent(DataFormats.FileDrop))) {
                e.Effect = DragDropEffects.Copy;
            } else {
                e.Effect = DragDropEffects.None;
            }
            Panel1.Capture = true;
        }

    }

    private void DD(object sender, DragEventArgs e)
    {
        if (Panel1.Capture) {
            Interaction.MsgBox("dropped");
        }
        Panel1.Capture = false;
    }


}

パネルをドラッグすると、キャプチャされますが、メイン フォームにはドラッグ/ドロップ ハンドラが必要です。

于 2013-03-05T18:59:42.930 に答える