我有一个Panel
,当我点击添加Button
时,我会在其他添加的控件下添加一个Control
。当我点击另一个Button
时,我删除了最后添加的Control
这很好用。在该面板上,我将AutoScroll
设置为True
,当我添加更多控件时,它会正确显示,我可以使用它。当我移除某些控件时Panel
正确隐藏ScrollBar
仅如果"动画"那个ScrollBar
当时没有运行。
ScrollBar
上没有动画正在运行,它会正常消失 - 如果您将鼠标悬停在它上面并不重要。ScrollBar
上并快速移动到移除Button
并在ScrollBar
动画完成之前单击,则Control
将被删除,但不活动{ {1}}仍在那里。在ScrollBar
点击处理程序中,我尝试在Button
上调用Invalidate
,Update
和Refresh
方法,但无效。 我仅在Panel
上对此进行了测试。
如果您不知道我的意思,请尝试查看这段视频(20秒无声):http://youtu.be/-0EfRXrGbuc
答案 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
。