C#winforms有很多带自定义背景和鼠标悬停的按钮

时间:2014-04-01 16:44:10

标签: c# winforms button hover

我有几百个按钮的项目,在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();
}

问题在于:当然,最后点击的按钮会被关注。因此,如果我向下滚动页面,每次计时器滴答页面向上(或向下)滚动,因此聚焦按钮变为可见。

我该如何防止这种情况?

3 个答案:

答案 0 :(得分:1)

愚蠢的解决方案(如果你需要保存按钮的焦点,那就不会工作):

private void timer_Tick(object sender, EventArgs e)
{
   justAnotherButton.Focus();
   labelClock.Text = DateTime.Now.ToString();
}

您需要将焦点转移到另一个可聚焦控件,它可能是另一个ButtonTextBox等。您可以使用零WidthHeight的按钮,用户不会看到它。

答案 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;
    }
}