【问题标题】:Change color of label when hover and clicked悬停并单击时更改标签的颜色
【发布时间】:2017-06-23 03:31:31
【问题描述】:

我在更改标签外观方面遇到问题。这是截图:

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

代码如下:

   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
   }

我也试过鼠标悬停。它看起来和鼠标输入一样。 底线是我希望颜色在悬停在它们上方时变为较暗的颜色,并在悬停在它们之外时变为较浅的颜色。但我也知道当我点击它时它会保持深色。然后变回较浅的颜色,然后我单击另一个按钮,另一个按钮现在将变成较深的颜色。谢谢!

编辑:我使用标签而不是按钮。我目前正在尝试下面的一些 cmets,非常感谢。

【问题讨论】:

    标签: c# winforms mousehover


    【解决方案1】:

    我使用了这种技术,只是对其进行了测试,我认为这是您想要的。

        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

    【讨论】:

    • 我使用了标签先生,但名称是 btn。先生,我应该在这段代码中编辑什么?我应该将“theLabel”更改为我的标签名称吗?
    • @FutureDev EDIT 下的部分告诉你要改什么,等我改一下。
    • 我让它工作了,先生,但它有一个问题。当我点击 label1 时,它工作得很好。问题是当我点击 label2 时,label1 仍然有深色。所以他们现在都变成了深色。仅当您将鼠标悬停在 label1 上和之外时它才会消失。
    • @FutureDev 抱歉有一个开发会议,添加一个方法,称之为setColor(示例)并将所有按钮的颜色设置为正常颜色,然后在点击顶部调用该方法
    • @FutureDev 进行了一些更改以解决您遇到的问题。
    【解决方案2】:

    也许在 btnArchives_mouseLeave EventHandler 中添加一个 'if' 喜欢:

    {
         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
      }
    

    我喜欢第一个..

    【讨论】:

    • Isclicked不是button类实现的,但是你可以换成其他的方法,你可以在点击的时候给button添加一些东西,在MouseLeave事件触发的时候检查一下。
    • 先生,当我键入它时,没有“isclicked”控件。也许是因为使用标签而不是按钮?
    【解决方案3】:

    您可以在单击按钮时删除事件处理程序 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);
      }
    

    【讨论】:

    • 如果它不多,你能告诉我怎么做吗?谢谢
    • @FutureDev 这可能会帮助你stackoverflow.com/questions/16259413/…
    • @FutureDev,我添加了示例
    • 我在“cliced”先生上遇到错误。我应该声明一个“bool clicked”吗? ?
    • 是的。声明一个名为“clicked”的 bool 字段并将其初始化为 false。很抱歉没有添加它。
    【解决方案4】:

    您可以在 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

    【讨论】:

    • 我在 this.SelectedLabel = sender 上有一个错误; “发件人”带有红色下划线,并带有错误“无法将对象转换为标签”
    • 我在这一行出现错误“this.selectedLabel.BackColor = Color.FromArgb(15, 34, 53); //lightercolor”错误是“对象引用未设置为对象。”
    • 抱歉,现在添加了一个空检查
    【解决方案5】:
    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
        }
    
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 2015-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多