【发布时间】:2014-04-16 20:16:28
【问题描述】:
我目前正在尝试在自定义控件上创建悬停效果,在鼠标进入控件后会显示一个面板 (panel1)。
我有一个定时器,它在 mouseleave 事件引发时启动,间隔为 250 毫秒,并且有一个 onTick 事件将 panel1 的可见性更改为 false。
这一切都有效。但是,panel1 上的按钮在单击时并不总是响应。
这是相关代码 - 如果我缺少一些信息,我会提供任何其他所需的内容。
private void MagicCardViewer_MouseLeave(object sender, EventArgs e)
{
timer1.Start();
timer1.Interval = 250;
timer1.Tick += new EventHandler(timer1_TickOff);
timer1.Tick -= timer1_TickOn;
}
private void MagicCardViewer_MouseEnter(object sender, EventArgs e)
{
showPanel1();
}
public void showPanel1()
{
//show necessary controls
buttonDiscard.Show();
//show panel1
panel1.Visible = true;
ActiveControl = panel1;
}
public void hidePanel1()
{
panel1.Visible = false;
//hide controls
}
# region button events
private void buttonChoose_Click(object sender, EventArgs e)
{
Chosen = !Chosen;
if (Chosen)
{
callCardChosen();
}
}
private void buttonTap_Click(object sender, EventArgs e)
{
cards[0].ChangeTap();
DrawCardTap();
onCardChanged();
}
private void buttonActivate_Click(object sender, EventArgs e)
{
cards[0].TryActivate(0);
}
private void buttonDiscard_Click(object sender, EventArgs e)
{
cards[0].onDiscard();
}
# endregion
我认为这就是一切,但是有很多代码可供选择。
断点不触发,按钮闪烁但没有任何反应。如果定时器间隔设置得很长,它工作得很好,但关键是一旦鼠标离开控件,按钮就会迅速消失。如果鼠标在按钮上,则窗体报告它已离开控件。
总而言之 - 当我点击它们时,这些按钮并不总是在处理。
【问题讨论】:
-
按钮顶部是否有任何东西可以“窃取”点击事件?你用断点检查这个,你怎么知道按钮不起作用?
-
断点不触发,按钮闪烁但没有任何反应。如果定时器间隔设置得很长,它工作得很好,但关键是一旦鼠标离开控件,按钮就会迅速消失。如果鼠标在按钮上,则表单报告它已离开控件...
-
啊,我明白了。非常有趣的问题!您可能希望在您的问题中包含该信息(这是因为您的“离开”事件是由鼠标悬停在按钮上触发的)。
-
如果按钮事件连接是在自动生成的设计器文件中完成的,请尝试将其移动到您的代码文件中。如果不出意外,这将使任何接线错误更加明显。
-
timer1_TickOff 和 TickOn 实际上在做什么? Windows 窗体 Timer 对象位于 UI 线程上,因此会阻塞。因此,如果计时器每 250 毫秒执行一次阻塞操作,那么表单可能会在接收来自窗口消息泵的消息(即像事件信号)时出现问题。