AutoScroll模式无法正确隐藏滚动条

时间:2015-04-30 12:03:44

标签: c# winforms windows-7 scrollbar

我有一个Panel,当我点击添加Button时,我会在其他添加的控件下添加一个Control。当我点击另一个Button时,我删除了最后添加的Control 这很好用。在该面板上,我将AutoScroll设置为True,当我添加更多控件时,它会正确显示,我可以使用它。当我移除某些控件时Panel正确隐藏ScrollBar 如果"动画"那个ScrollBar当时没有运行。

  1. 如果ScrollBar上没有动画正在运行,它会正常消失 - 如果您将鼠标悬停在它上面并不重要。
  2. 如果您将鼠标悬停在ScrollBar上并快速移动到移除Button并在ScrollBar动画完成之前单击,则Control将被删除,但不活动{ {1}}仍在那里。在ScrollBar点击处理程序中,我尝试在Button上调用InvalidateUpdateRefresh方法,但无效。
  3. 我仅在Panel上对此进行了测试。

    如果您不知道我的意思,请尝试查看这段视频(20秒无声):http://youtu.be/-0EfRXrGbuc

2 个答案:

答案 0 :(得分:1)

您忘了发帖mcve。所以这里有一个(添加面板和两个按钮):

Refresh()

我能够重现问题

  

它的胜利,宝贝(c)。

可能的解决方法是使用例如Timer来呼叫panel1或某些鼠标事件(它不会阻止问题,但是使用会很容易通过例如在panel1.MouseLeave内移动鼠标来修复它),或者你可以推迟在{{}}之后短时间内删除按钮的可能性{1}}。所有这些解决方法。

答案 1 :(得分:0)

我希望有更好的方法,但现在我没有看到任何内容,所以基于answer from Sinatr我决定使用Timer并将其与检查像素{{1}相结合确定Color是否仍然可见。

ScrollBar

我无法使用private Timer _timer = new Timer {Interval = 500}; public Form1() { InitializeComponent(); _timer.Tick += TimerOnTick; } private void button2_Click(object sender, EventArgs e) { if (panel1.Controls.Count > 0) { var wasVisible = panel1.VerticalScroll.Visible; panel1.Controls.RemoveAt(panel1.Controls.Count - 1); buttons.RemoveAt(buttons.Count - 1); if (wasVisible != panel1.VerticalScroll.Visible) { _timer.Start(); } } } private bool IsBackgroundColor() { var point = panel1.Location; point.Offset(panel1.Width - 9, panel1.Height - 11); point = PointToScreen(point); Image imgScreen = new Bitmap(1, 1); using (Bitmap bmp = new Bitmap(1, 1, PixelFormat.Format32bppArgb)) using (Graphics g = Graphics.FromImage(bmp)) using (Graphics gr = Graphics.FromImage(imgScreen)) { g.CopyFromScreen(point, new Point(0, 0), new Size(1, 1)); gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; gr.DrawImage(bmp, new Rectangle(0, 0, 1, 1)); var color = bmp.GetPixel(0, 0); return color.R == panel1.BackColor.R && color.G == panel1.BackColor.G && color.B == panel1.BackColor.B; } } private void TimerOnTick(object sender, EventArgs eventArgs) { if (!IsBackgroundColor() && !panel1.VerticalScroll.Visible) { panel1.Refresh(); } else { _timer.Stop(); } } ,因为它无法绘制Panel.DrawToBitmap。只有当ScrollBars可见时,我才会启动Timer,现在它不应该出现。
值得一提的是,只有在ScrollBar隐藏Color时才知道Color,才能进行像素ScrollBar检查。没有必要Panel.BackColor