首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# WinForms 實現 PictureBox 拖拽到 Panel 並自動填滿

     編輯:程式設計綜合問答

核心邏輯

  1. PictureBox 啟用 AllowDrop = true(作為拖拽源)。
  2. Panel 啟用 AllowDrop = true,處理 DragEnter、DragDrop 事件(作為放置目標)。
  3. 放置時:將 PictureBox 從原容器移除,加入目標 Panel,並設 Dock = Fill。

完整代碼

public partial class MainForm : Form {
    public MainForm() {
        InitializeComponent();
        // 假設有 panel1~4, pictureBox1~n
        foreach (var pb in new[] { pictureBox1, pictureBox2 /*...*/ }) {
            pb.MouseDown += Pb_MouseDown;
            pb.AllowDrop = true; // 可選,若 PB 也作為目標
        }
        foreach (var pnl in new[] { panel1, panel2, panel3, panel4 }) {
            pnl.AllowDrop = true;
            pnl.DragEnter += Panel_DragEnter;
            pnl.DragDrop += Panel_DragDrop;
        }
    }

    private void Pb_MouseDown(object sender, MouseEventArgs e) {
        if (e.Button == MouseButtons.Left) {
            var pb = (PictureBox)sender;
            pb.DoDragDrop(pb, DragDropEffects.Move);
        }
    }

    private void Panel_DragEnter(object sender, DragEventArgs e) {
        if (e.Data.GetDataPresent(typeof(PictureBox))) {
            e.Effect = DragDropEffects.Move;
        }
    }

    private void Panel_DragDrop(object sender, DragEventArgs e) {
        var targetPanel = (Panel)sender;
        var pb = (PictureBox)e.Data.GetData(typeof(PictureBox));
        if (pb == null) return;

        // 從原父容器移除
        pb.Parent?.Controls.Remove(pb);
        // 加入目標 Panel
        targetPanel.Controls.Add(pb);
        // 填滿 Panel
        pb.Dock = DockStyle.Fill;
        pb.BringToFront(); // 置頂顯示
    }
}

關鍵細節

  • DoDragDrop(pb, DragDropEffects.Move) 傳遞 **PictureBox 實例**作為數據載體。
  • DragEnter 必須設置 e.Effect = DragDropEffects.Move,否則不會觸發 DragDrop。
  • 移動控制項時,**先 Remove 再 Add**,否則會異常。
  • Dock = Fill 讓圖片自適應 Panel 大小;若需保持比例,改用 SizeMode = Zoom + 手動居中邏輯。

進階:支援多圖層疊放

若 Panel 允許放多張圖,改用 FlowLayoutPanel 或手動計算位置,不設 Dock,改設 Location/Size。

總結

拖拽核心三步:**源控制項 DoDragDrop → 目標 DragEnter 允許效果 → DragDrop 移動控制項並設 Dock=Fill**。代碼簡潔,體驗流暢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved