我试图制作一个可滚动的面板但没有滚动条并通过垂直拖动滚动...这是有人帮助我做到目前为止...:
private void panel1_MouseEnter(object sender, EventArgs e)
{
panel1.AutoScroll = false;
}
private int ValidateChange(int change)
{
var padding = -1;
if (change < 0)
{
var max = (from Control control in Controls select control.Top + control.Height + padding).Concat(new[] { int.MinValue }).Max();
if (max < Height + Math.Abs(change))
{
return Height - max;
}
}
else
{
var min = (from Control control in Controls select control.Top).Concat(new[] { int.MaxValue }).Min();
if (min > padding - Math.Abs(change))
{
return padding - min;
}
}
return change;
}
private void HandleDelta(int delta)
{
var change = ValidateChange(delta);
foreach (Control control in Controls)
{
control.Top += change;
}
}
private void panel1_MouseWheel(object sender, MouseEventArgs e)
{
HandleDelta(e.Delta);
base.OnMouseWheel(e);
}
private Point _mouseLastPosition;
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
_mouseLastPosition = e.Location;
}
base.OnMouseDown(e);
}
public void panel1_MouseMove(object sender, MouseEventArgs e)
{
if ((MouseButtons & MouseButtons.Left) != 0)
{
var delta = e.Y - _mouseLastPosition.Y;
HandleDelta(delta);
_mouseLastPosition = e.Location;
}
base.OnMouseMove(e);
}
Run Code Online (Sandbox Code Playgroud)
但是它太快了..编辑:鼠标拖动看起来有点奇怪我不知道为什么当我尝试使用鼠标滚轮时它会出现错误并给我这个错误:发生了'System.StackOverflowException'类型的未处理异常在此行的System.Core.dll中 var max = (from Control control in Controls select control.Top + control.Height + padding).Concat(new[] { int.MinValue }).Max();
发布的代码仅"滚动"或更确切地水平移动面板.对于垂直滚动效果,请更改:
Panel pa = ss as Panel; pa.Left = pa.Left + ee.X - pPt.X;
Run Code Online (Sandbox Code Playgroud)
对此:
Panel pa = ss as Panel; pa.Top = pa.Top + ee.Y - pPt.Y;
Run Code Online (Sandbox Code Playgroud)
要理解"滚动"或"移动"面板也应该高于封闭形式,因此更改尺寸,可能是这样的:
f2.Size = new Size(400, 300);
..
pan.Size = new Size(400, 600);
Run Code Online (Sandbox Code Playgroud)
并且按钮也应垂直放置,因此更改:
b.Left = (b.Width + 12) * (i - 1);
Run Code Online (Sandbox Code Playgroud)
至
b.Top= (b.Height + 12) * (i - 1);
Run Code Online (Sandbox Code Playgroud)
从评论中复制时你也犯了一个错误:这:
pan.Parent = f2;
Run Code Online (Sandbox Code Playgroud)
应该是循环中的最后一行.在循环中添加事件处理程序意味着也MouseMove称为10倍移动距离也是十倍.
正确编码时,这是什么样子:
为了完成这项MouseWheel工作你可以像这样编码:
pan.MouseWheel += (ss, ee) =>
{
Panel pa = ss as Panel;
pa.Top += ee.Delta > 0 ? 10 : -10;
};
Run Code Online (Sandbox Code Playgroud)
更新看起来您还希望限制滚动,以便顶部和底部都不会移动到显示区域.这是一个实现这一目标的检查; 诀窍是首先进行检查,然后才进行移动:
if (ee.Button.HasFlag(MouseButtons.Left))
{
Panel pa = ss as Panel;
int newTop = pa.Top + ee.Y - pPt.Y;
if ((newTop <= pan.Top && newTop + pan.Height > f2.ClientSize.Height) ||
(newTop >= pan.Top && newTop <= 0))
{
if (newTop <= pan.Top && newTop + pan.Height > f2.ClientSize.Height)
newTop = f2.ClientSize.Height - pan.Height;
pa.Top = newTop;
}
}
Run Code Online (Sandbox Code Playgroud)
该MouseWheel代码应该进行检查,并以类似的方式限制!
注意:正确的面板高度至关重要.我的原始示例没有处理,因为没有要求滚动限制.你可以动态地得到它:
int panHeight = pan.Controls.Cast<Control>().Select(x => x.Bottom).Max();
pan.Height = panHeight; // maybe add a small gap here..?
Run Code Online (Sandbox Code Playgroud)
这对我有用。它在所有控件上保持 10 像素的填充。尝试一下并根据您的需要进行修改。
如果缺少您需要的东西,请告诉我。
public class ScrollablePanel : Panel {
private Point _mouseLastPosition;
protected override void OnMouseDown(MouseEventArgs e) {
if (e.Button == MouseButtons.Left) {
_mouseLastPosition = e.Location;
}
base.OnMouseDown(e);
}
private int ValidateChange(int change) {
var padding = -1;
if (change < 0) {
var max = (from Control control in Controls select control.Top + control.Height + padding).Concat(new[] { int.MinValue }).Max();
if (max < Height + Math.Abs(change)) {
return Height - max;
}
}
else {
var min = (from Control control in Controls select control.Top).Concat(new[] { int.MaxValue }).Min();
if (min > padding - Math.Abs(change)) {
return padding - min;
}
}
return change;
}
private void HandleDelta(int delta) {
var change = ValidateChange(delta);
foreach (Control control in Controls) {
control.Top += change;
}
}
protected override void OnMouseMove(MouseEventArgs e) {
if((MouseButtons & MouseButtons.Left) != 0) {
var delta = e.Y - _mouseLastPosition.Y;
HandleDelta(delta);
_mouseLastPosition = e.Location;
}
base.OnMouseMove(e);
}
protected override void OnMouseWheel(MouseEventArgs e) {
HandleDelta(e.Delta);
base.OnMouseWheel(e);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2814 次 |
| 最近记录: |