2013-10-11 57 views
0

就像在Word中,任何瀏覽器和大量其他應用程序一樣,當將對象拖動到該面板的可見區域之外時,如何使面板的內容向上或向下滾動?如何在接近面板邊界時自動向上或向下滾動?

這是最接近我來我所尋找的,但它仍然不完美。

private void Werkorders_DragOver(object sender, DragEventArgs e) 
{ 
    grpWerkorders.AutoScrollPosition = grpWerkorders.PointToClient(new Point(e.X, e.Y)); 
} 

回答

1

這可以用WinForms Timer完成。示例代碼:

private Timer scrollTimer = new Timer(); 
private int scrollJump = 0; 

public Form1() { 
    InitializeComponent(); 
    panel1.AllowDrop = true; 
    panel1.AutoScroll = false; 
    panel1.AutoScrollMinSize = new Size(0, 1000); 
    panel1.MouseMove += panel1_MouseMove; 
    panel1.DragEnter += panel1_DragEnter; 
    panel1.DragOver += panel1_DragOver; 
    panel1.QueryContinueDrag += panel1_QueryContinueDrag; 
    scrollTimer.Tick += scrollTimer_Tick; 
} 

的拖動事件:

void panel1_MouseMove(object sender, MouseEventArgs e) { 
    if (e.Button == MouseButtons.Left) { 
    panel1.DoDragDrop("test", DragDropEffects.Move); 
    } 
} 

void panel1_DragEnter(object sender, DragEventArgs e) { 
    e.Effect = DragDropEffects.Move; 
} 

void panel1_DragOver(object sender, DragEventArgs e) { 
    Point p = panel1.PointToClient(new Point(e.X, e.Y)); 
    if (p.Y < 16) { 
    scrollJump = -20; 
    if (!scrollTimer.Enabled) { 
     scrollTimer.Start(); 
    } 
    } else if (p.Y > panel1.ClientSize.Height - 16) { 
    scrollJump = 20; 
    if (!scrollTimer.Enabled) { 
     scrollTimer.Start(); 
    } 
    } else { 
    if (scrollTimer.Enabled) { 
     scrollTimer.Stop(); 
    } 
    } 
} 

void panel1_QueryContinueDrag(object sender, QueryContinueDragEventArgs e) { 
    if (e.Action != DragAction.Continue) { 
    scrollTimer.Stop(); 
    } 
} 

定時器代碼:

void scrollTimer_Tick(object sender, EventArgs e) { 
    if (panel1.ClientRectangle.Contains(panel1.PointToClient(MousePosition))) { 
    Point p = panel1.AutoScrollPosition; 
    panel1.AutoScrollPosition = new Point(-p.X, -p.Y + scrollJump); 
    } else { 
    scrollTimer.Stop(); 
    } 
} 

可以調整scrollJump值來增加或減少的量的滾動條的變化,或調整計時器的間隔數量,默認爲100毫秒。