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