【问题标题】:C# - Changing button image event is not risingC# - 更改按钮图像事件没有上升
【发布时间】:2012-06-14 02:57:33
【问题描述】:

我正在制作一个简单的程序,当用户与之交互时,它会更改按钮的图像。当计算机鼠标进入按钮内部时,图像会突出显示,当鼠标单击时,图像会变暗,当鼠标离开按钮时,图像会变得正常。为了实现这种行为,我在 3 个图像之间更改按钮图像,但是当我单击按钮并显示模态控件时,例如一个MessageBox,当它从MessageBox返回时,按钮中的图像仍然是“鼠标内部”图像,但鼠标已经离开按钮......所以我认为button1_MouseLeave事件没有上升,但我没有了解为什么以及如何修复它...你们能帮我解决这个问题吗? 我使用的代码很简单:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace teste1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_MouseLeave(object sender, EventArgs e)
        {
            button1.Image = ((System.Drawing.Image)(Properties.Resources.Botao_Del_Normal));
        }

        private void button1_MouseEnter(object sender, EventArgs e)
        {
            button1.Image = ((System.Drawing.Image)(Properties.Resources.Botao_Del_Claro));
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Test");            
        }

        private void button1_MouseDown(object sender, MouseEventArgs e)
        {
            button1.Image = ((System.Drawing.Image)(Properties.Resources.Botao_Del_Clique));
        }

        private void button1_MouseUp(object sender, MouseEventArgs e)
        {
            button1.Image = ((System.Drawing.Image)(Properties.Resources.Botao_Del_Claro));
        }        
    } 
}

【问题讨论】:

  • 我想我发现了部分问题...MouseLeaveMouseUp 之前被触发(当MessageBox 被调用时,它会触发MouseLeave,但是当您单击确定时MessageBox MouseUp 的按钮由于单击事件而被调用)...所以即使 MouseLeave 设置正确的图像,MouseUp 也会将其设置回“按钮内的鼠标”图像,即使鼠标不在按钮上......任何想法如何解决这个问题? MouseHover 不是一个好人,因为它需要一些时间才能被解雇。

标签: c# image events button


【解决方案1】:

鼠标肯定不会离开,因为在此之前按钮上的焦点被偷了,所以它没有收到那些消息。您还应该监听 LostFocus 事件并在按钮失去焦点时切换到正常图像。

private void button1_LostFocus(object sender, EventArgs e)
{
    button1.Image = (System.Drawing.Image)Properties.Resources.Botao_Del_Normal;
}

确保真正聆听 LostFocus 事件!仅仅添加代码不会有任何作用。

请注意,由于预期的 LostFocus 和 MouseLeave 委托的签名是相同的,因此您实际上可以使用相同的方法监听这两个事件(并将其称为 button1_MouseLeaveOrLostFocus 或任何适合您的名称)

【讨论】:

  • 您确定有LostFocus 事件吗?我不相信...可能是Leave 事件?
  • 是的,有一个LostFocus 事件。您也可以使用 Leave 事件,但事件之间存在细微差别 - 最好坚持使用 LostFocus,因为它通常在大多数情况下会更好(我很确定 Leave 会赢)如果您的整个表单失去焦点,请不要在您的按钮上抬起)。要了解有关差异的更多信息,请单击here
  • 没有朋友,按钮控制没有失去焦点事件。您使用的是哪个 .net 框架版本?
  • @AdeelAhmed 它不可浏览,因此您无法在设计器中看到它,但您可以在代码中看到它——这让我觉得我可能把两者混为一谈了——所以是的,OP 可能应该使用Leave 事件。
  • 它仍然不起作用...当我在代码中将其设置为this.button1.LostFocus += new System.EventHandler(this.button1_LostFocus); 时,它只会在我 ALT+TAB 整个窗口时触发...而不是当鼠标离开按钮时,正如预期的那样......它不允许我将它作为 MouseEventHandler 运行......并且Leave 也不起作用......你们试过了吗?而MouseUpLostFocus 之后触发,所以这也是一个问题:\
【解决方案2】:

请尝试 button1_MouseHover 事件而不是 button1_MouseEnter 事件。 我会工作。

【讨论】:

  • 是的。发表在另一个答案的朋友。如果还有问题,请告诉我。
  • 我用MouseClickMouseDownMouseEnter 解决了这个问题...我将在本周晚些时候发布代码...我最近有点没时间了
【解决方案3】:

这是意料之中的,因为根据您的代码,当您停止单击时,图像会重置,这将由窗口由于 messageBox 而失去焦点而触发。

删除 MouseUp 处理程序以实现您想要的行为

【讨论】:

  • 当你停止点击图像时它不会被重置,当你没有鼠标时它会被重置(或应该被重置)。注意ClaroNormal 是不一样的。
【解决方案4】:
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent(); 
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            button1.Text = "Hello World!";
        }

        private void button1_MouseHover(object sender, EventArgs e)
        {
            button1.Text = "Mouse Hover";
        }

        private void button1_MouseDown(object sender, MouseEventArgs e)
        {
            button1.Text = "Mouse Down";
        }

        private void button1_MouseUp(object sender, MouseEventArgs e)
        {
            button1.Text = "Mouse Up";
        }

        private void button1_MouseLeave(object sender, EventArgs e)
        {
            button1.Text = "Mouse Leave";      
        }      
    }    
}

【讨论】:

  • MouseHover 不是瞬时的,需要一些时间才能被认为是“悬停”
【解决方案5】:

已解决: 好的,伙计们,我想出了如何让它工作!我必须删除MouseClick 事件,并将所有处理添加到MouseUp 事件,所以现在MouseLeaveMouseUp 之后被调用(即使使用ALT+TAB)。 现在的代码是:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace teste1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_MouseEnter(object sender, EventArgs e)
        {
            button1.Image = ((System.Drawing.Image)(Properties.Resources.Botao_Del_Claro));
        }

        private void button1_MouseDown(object sender, MouseEventArgs e)
        {
            button1.Image = ((System.Drawing.Image)(Properties.Resources.Botao_Del_Clique));              
        }

        private void button1_MouseLeave(object sender, EventArgs e)
        {
            button1.Image = ((System.Drawing.Image)(Properties.Resources.Botao_Del_Normal));
        }

        private void button1_Click(object sender, EventArgs e)
        {
            button1.Image = ((System.Drawing.Image)(Properties.Resources.Botao_Del_Normal));
            // Processing is made here!
        }

    }
}

【讨论】:

  • 图像仍然可以闪烁...任何线索如何使它完美?
  • 这是用于打开某种对话框的按钮...如果没有,那么在button1_Click 方法中它应该有button1.Image = ((System.Drawing.Image)(Properties.Resources.Botao_Del_Claro));
猜你喜欢
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 2013-07-12
  • 2016-12-09
  • 2021-09-20
  • 1970-01-01
相关资源
最近更新 更多