我有几百个按钮的项目,在for循环中动态创建。我还有计时器以每秒的当前时间更新toolstripstatuslabel(labelClock):
static System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
...
timer.Tick += new System.EventHandler(timer_Tick);
...
private void timer_Tick(object sender, EventArgs e)
{
labelClock.Text = DateTime.Now.ToString();
}
问题在于:当然,最后点击的按钮会被关注。因此,如果我向下滚动页面,每次计时器滴答页面向上(或向下)滚动,因此聚焦按钮变为可见。
我该如何防止这种情况?
答案 0 :(得分:1)
愚蠢的解决方案(如果你需要保存按钮的焦点,那就不会工作):
private void timer_Tick(object sender, EventArgs e)
{
justAnotherButton.Focus();
labelClock.Text = DateTime.Now.ToString();
}
您需要将焦点转移到另一个可聚焦控件,它可能是另一个Button
,TextBox
等。您可以使用零Width
和Height
的按钮,用户不会看到它。
答案 1 :(得分:1)
如果您不关心保持焦点相同的按钮,请将焦点设置为父窗体。虽然这听起来像是一个噩梦,但我会寻找一种不需要数百个按钮的方式!
private void timer_Tick(object sender, EventArgs e)
{
formMain.Focus()
labelClock.Text = DateTime.Now.ToString();
}
答案 2 :(得分:0)
您可以创建一个扩展System.Windows.Forms.ContainerControl的容器控件,并覆盖ScrollToControl以返回当前滚动位置。然后将所有按钮添加到此控件。
class MyContainer : ContainerControl
{
protected override System.Drawing.Point ScrollToControl(Control activeControl)
{
return base.AutoScrollPosition;
}
}