【问题标题】:c# timer preventing button clickc# timer 防止按钮点击
【发布时间】: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 毫秒执行一次阻塞操作,那么表单可能会在接收来自窗口消息泵的消息(即像事件信号)时出现问题。

标签: c# button timer controls


【解决方案1】:

如果您让计时器每 250 毫秒计时一次,这可能会阻止鼠标点击事件。

如果您不再需要它,我会检查您是否在滴答后停止计时器,并在用户离开控件或再次进入时按照我认为您正在做的那样重新启动。

这可能是您设置较长时间间隔时有效的原因。

【讨论】:

  • 我添加了一点检查 if (panel1.rectangletoscreen(panel1).contains(mouseposition)) { //stoprunning }
猜你喜欢
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
  • 2014-12-11
  • 2018-07-08
  • 2013-11-02
  • 1970-01-01
相关资源
最近更新 更多