C# - 更改按钮图像事件未上升

时间:2012-06-14 02:57:34

标签: c# image events button

我正在创建一个简单的程序,当用户与按钮交互时,该程序会更改按钮的图像。当计算机鼠标进入按钮时,图像会突出显示,当鼠标点击它时会变暗,当鼠标离开按钮时,图像会变为正常。为了实现这个行为,我正在改变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));
        }        
    } 
}

5 个答案:

答案 0 :(得分: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或适合您的任何内容)

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

解决: 好的,我想到了如何使它工作!我必须删除MouseClick事件,并将所有处理添加到MouseUp事件,因此现在MouseLeave之后会调用MouseUp(即使使用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!
        }

    }
}

答案 4 :(得分:0)

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";      
        }      
    }    
}