如果你想要的是,以避免重複幾個控件的同樣的事件,你應該使用的常見事件:
private void commonPBox_MouseDown(object sender, MouseEventArgs e)
{
PictureBox PB = sender as PictureBox;
if (PB == null) return; //or throw an exception
PB.DoDragDrop(PB.Image, DragDropEffects.Copy);
}
private void commonPanel_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Copy;
}
private void commonPanel_DragDrop(object sender, DragEventArgs e)
{
Panel Pan = sender as Panel;
if (Pan == null) return; //or throw an exception
//Set background image of panel to selected avatar
Pan.BackgroundImage = (Image)e.Data.GetData(DataFormats.Bitmap);
}
選擇相應的控制和輸入事件名稱到相應的事件名稱插槽屬性選項卡的事件窗格。
請注意我如何將sender
事件的參數轉換爲觸發事件的控件的類型引用。如果演員出錯,參考設置爲null
。
如果你想要更多的控制,你可以考慮建立一個DragAndDropcontroller
類的更多的flexibilty ..:
static class DnDCtl
{
static List<Control> Targets = new List<Control>();
static List<Control> Sources = new List<Control>();
static public void RegisterSource(Control ctl)
{
if (!Sources.Contains(ctl))
{
Sources.Add(ctl);
ctl.MouseDown += ctl_MouseDown;
}
}
static public void UnregisterSource(Control ctl)
{
if (Sources.Contains(ctl))
{
Sources.Remove(ctl);
}
}
static public void RegisterTarget(Control ctl)
{
if (!Targets.Contains(ctl))
{
Targets.Add(ctl);
ctl.DragEnter += ctl_DragEnter;
ctl.DragDrop += ctl_DragDrop;
ctl.AllowDrop = true;
}
}
static public void UnregisterTarget(Control ctl)
{
if (Targets.Contains(ctl))
{
Targets.Remove(ctl);
ctl.DragEnter -= ctl_DragEnter;
ctl.DragDrop -= ctl_DragDrop;
}
}
static void ctl_MouseDown(object sender, MouseEventArgs e)
{
PictureBox PB = sender as PictureBox;
if (PB != null) PB.DoDragDrop(PB.Image, DragDropEffects.Copy);
Panel Pan = sender as Panel;
if (Pan != null) Pan.DoDragDrop(Pan.BackgroundImage, DragDropEffects.Copy);
}
static void ctl_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Copy;
}
static void ctl_DragDrop(object sender, DragEventArgs e)
{
Panel Pan = sender as Panel;
if (Pan != null) Pan.BackgroundImage = (Image)e.Data.GetData(DataFormats.Bitmap);
PictureBox PB = sender as PictureBox;
if (PB != null) PB.BackgroundImage = (Image)e.Data.GetData(DataFormats.Bitmap);
}
}
注:
- 我有編碼對稱行動爲和
PictureBoxes
展示如何可以處理不同的控制。
- 我已創建但未使用
Lists
的來源和目標。對於更復雜的項目,您會發現它們很有用。
- 我已經編碼了
Register
和Unregister
方法。您可以在某些情況下注冊並在不再適用時取消註冊
- 此類控制器適用於動態降低或不允許拖動&降低控制權,當你動態創建它們時。
- 您也可以繞過代表來解耦來自控制器的拖動操作。
另請注意,有些人有時更喜歡使用MouseMove
事件而不是MouseDown
尤其如此。因爲它不會很容易干擾選擇。
ListView
有一個專門的事件,而不是ListView.ItemDrag
,這顯然應該在註冊時使用!
來源
2015-10-22 18:33:27
TaW
是Web窗體還是Windows Win Forms應用程序? –
窗體窗體應用程序 –
你可以給一些代碼作爲例子重複,你會喜歡重構嗎? – Kapoor