AllowDrop = true(作為拖拽源)。AllowDrop = true,處理 DragEnter、DragDrop 事件(作為放置目標)。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。Dock = Fill 讓圖片自適應 Panel 大小;若需保持比例,改用 SizeMode = Zoom + 手動居中邏輯。若 Panel 允許放多張圖,改用 FlowLayoutPanel 或手動計算位置,不設 Dock,改設 Location/Size。
拖拽核心三步:**源控制項 DoDragDrop → 目標 DragEnter 允許效果 → DragDrop 移動控制項並設 Dock=Fill**。代碼簡潔,體驗流暢。