WinForms TabControl проблема перетаскивания
У меня есть два элемента управления TabControls, и я реализовал возможность перетаскивания страниц табуляции между двумя элементами управления. Он отлично работает, пока вы не перетащите последнюю вкладку с одного из элементов управления. Затем элемент управления перестает принимать отбрасывания, и я не могу вернуть на него никаких вкладок.
Ниже приведен код перетаскивания для одного направления. Обратное направление совпадает с заменой имен элементов управления.
// Source TabControl
private void tabControl1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
this.tabControl1.DoDragDrop(this.tabControl1.SelectedTab, DragDropEffects.All);
}
//Target TabControl
private void tabControl2_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(TabPage)))
e.Effect = DragDropEffects.Move;
else
e.Effect = DragDropEffects.None;
}
private void tabControl2_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
TabPage DropTab = (TabPage)(e.Data.GetData(typeof(TabPage)));
if (tabControl2.SelectedTab != DropTab)
this.tabControl2.TabPages.Add (DropTab);
}
1 ответ:
Вам нужно переопределить
WndProc
в TabControl и превратитьHTTRANSPARENT
вHTCLIENT
в сообщенииWM_NCHITTEST
.Например:
const int WM_NCHITTEST = 0x0084; const int HTTRANSPARENT = -1; const int HTCLIENT = 1; //The default hit-test for a TabControl's //background is HTTRANSPARENT, preventing //me from receiving mouse and drag events //over the background. I catch this and //replace HTTRANSPARENT with HTCLIENT to //allow the user to drag over us when we //have no TabPages. protected override void WndProc(ref Message m) { base.WndProc(ref m); if (m.Msg == WM_NCHITTEST) { if (m.Result.ToInt32() == HTTRANSPARENT) m.Result = new IntPtr(HTCLIENT); } }