悬停并单击时更改标签的颜色

时间:2017-02-06 08:46:40

标签: c# winforms mousehover

我有关于更改标签外观的问题。这是截图:

enter image description here

这是你悬停鼠标时的颜色,我希望它像那样。 我想要的是它在我点击它时保持这种颜色。但由于我的鼠标控制,它不会像我想要的那样工作。

以下是代码:

   private void btnArchives_MouseEnter(object sender, EventArgs e)
    {
        lblArchives.BackColor = Color.FromArgb(9, 18, 28); //darkercolor
    }

   private void btnArchives_MouseLeave(object sender, EventArgs e)
   {
       lblArchives.BackColor = Color.FromArgb(15, 34, 53); //lightercolor
   }

我也试过鼠标悬停。虽然它看起来和鼠标一样。 底线是我希望颜色在悬停在它们上方时变为较暗的颜色,并在悬浮出来时变回较浅的颜色。但是当我点击它时,我也会保持深色。然后转回较浅的颜色然后我点击另一个按钮,其他按钮现在将变为更暗的颜色。谢谢!

编辑:我使用标签代替按钮。我正在尝试下面的一些评论,非常感谢你。

5 个答案:

答案 0 :(得分:2)

您可以在单击按钮时删除事件处理程序btnArchives_MouseLeave和button1_MouseEnter以阻止它。但是,当再次单击该按钮时,您需要将其添加回来:

private void btnArchives_Click(object sender, EventArgs e)
{
            if (!clicked)
            {
                btnArchives.MouseEnter-= new EventHandler(btnArchives_MouseEnter);
                btnArchives.MouseLeave-= new EventHandler(btnArchives_MouseLeave);
                clicked = true;
                return;
            }

            btnArchives.MouseEnter += new EventHandler(btnArchives_MouseEnter);
            btnArchives.MouseLeave += new EventHandler(btnArchives_MouseLeave);
            clicked = false;
  }

  void btnArchives_MouseLeave(object sender, EventArgs e)
  {
              this.btnArchives.BackColor = Color.FromArgb(15, 34, 53);
  }

  void btnArchives_MouseEnter(object sender, EventArgs e)
  {
              this.btnArchives.BackColor = Color.FromArgb(9, 18, 28);
  }

答案 1 :(得分:2)

可能会添加一个' if'在btnArchives_mouseLeave EventHandler中 像:

{
     if(!btnArchives.IsClicked())
     {
          btnArchives.BackColor = Color.FromArgb(15, 34, 28);//lightercolor
     }
}

或: 在PressEvent上删除EventHandler

  private void btnArchives_MouseClick(object sender, EventArgs e)
  {
    btnArchives.BackColor = Color.FromArgb(9, 18, 28); //darkercolor
    btnArchives.OnMouseLeave-= btnArchives_MouseLeave
  }

我喜欢第一个..

答案 2 :(得分:2)

我使用这种技术,只是测试它,我认为它是你想要的。

    Label clickedLabel;
    private void mouseEnter(object sender, EventArgs e)
    {
        Label theLabel = (Label)sender;
        if (theLabel != clickedLabel)
            theLabel.BackColor = Color.Red;
    }

    private void mouseLeave(object sender, EventArgs e)
    {
        Label theLabel = (Label)sender;
        if (theLabel != clickedLabel)
            theLabel.BackColor = Color.Yellow;
    }

    private void labelClick(object sender, EventArgs e)
    {
        setColor();//Calling this here so clickedLabel is still the old value
        Label theLabel = (Label)sender;
        clickedLabel = theLabel;
    }

    public void setColor()
    {
        if(clickedLabel != default(Label))
            clickedLabel.BackColor = Color.Yellow;
        //Resetting clicked label because another (or the same) was just clicked.
    }

说明:
这些事件仅设置为标签,因此我们可以执行(Label)sender,这意味着激活事件的标签。我创建了一个Label clickedLabel变量并将其设置为单击的标签,一旦单击另一个变量,变量将会更改并且检查将起作用。

关于这种方法的最好的事情是,你拥有多少标签并不重要,你永远不会将它们仅作为名称sender引用。

答案 3 :(得分:1)

您可以在OnClick事件中保存选定的 Label。 并检查其他方法是否已被选中。

这样的事情:

private void label_MouseClick(object sender, MouseEventArgs e)
{
    var label = (Label)sender;
    if (label == this.selectedLabel || this.selectedLabel == null) return;

    this.selectedLabel.BackColor = Color.FromArgb(15, 34, 53); //lightercolor
    this.selectedLabel= label;
}

private void label_MouseLeave(object sender, EventArgs e)
{
    var label = (Label)sender;
    if (label == this.selectedLabel || this.selectedLabel == null) return; 
    label.BackColor = Color.FromArgb(15, 34, 53); //lightercolor
}

private void label_MouseEnter(object sender, EventArgs e)
{
    var label = (Label)sender;
    label.BackColor = Color.FromArgb(9, 18, 28); //darkercolor
}

请注意,这是通用的,您应该将相同的方法添加到所有您的标签中 这也将确保当您单击一个标签时,将取消选择另一个标签。

在课堂上添加private Label selectedLabel

答案 4 :(得分:0)

private string activeLabel;

private void btnArchives_Click(object sender, EventArgs e)
    {
        activeLabel = btnArchives.Text;
    }

private void btnArchives_MouseEnter(object sender, EventArgs e)
    {
        lblArchives.BackColor = Color.FromArgb(9, 18, 28); //darkercolor
    }

private void btnArchives_MouseLeave(object sender, EventArgs e)
{

    if (activeLabel = btnArchives.Text)
    {
       lblArchives.BackColor = Color.FromArgb(9, 18, 28); //darkercolor
    }
    else
    {
       lblArchives.BackColor = Color.FromArgb(15, 34, 53); //lightercolor
    }

}

没有检查标签是否被单击的功能,因此,您使用全局字符串变量来收集当前单击的标签。如果标签是当前单击的标签,则使前色变深,否则返回浅色。