2013-10-11 26 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毫秒。