可见性更改后无法保留 OnClick 事件

Cannot keep OnClick event after visibilty change

只是想知道是否有其他人可以重新创建它,还是只有我自己:)

以上工作正常

现在,如果您将鼠标移入和移出面板,该按钮将变为可见错误。完美.

现在将鼠标移回 intp 面板,按钮变为可见。完美。

点击按钮现在什么都不做(点击事件丢失?)

onclick 中的断点从不触发。

这是一个做不到的概念吗?

'Update' 它不会让我 post 长评论。

首先感谢您的快速回复。

我没有包含代码,因为这是一个非常大的项目,所以我用一个全新的应用程序重新创建了它。

C# WinForm,一面板一面板按钮。

我没有尝试点击一个不可见的按钮。我不仅可以看到按钮,还可以看到它响应 bing 单击。

@史蒂夫。好点,按钮在面板内部,但我知道你要去哪里。我刚刚进行了一项新测试。

如果我将鼠标移入和移出面板,按钮将完美显示和隐藏。 在此之后,点击按钮上的 enter 将执行 onclick 但鼠标不会。 (我想这与只有一个按钮有关,而且它是默认的。)

我不明白是什么提示鼠标不触发点击事件。 很奇怪。

我想要达到的目标: 屏幕上的一个区域,当鼠标进入该区域时,会出现一组按钮,以便可以使用它们。 当鼠标离开该区域时,按钮将消失。正如我原来的 post 所述,如果可见性没有改变,按钮就可以正常工作。

我想你的代码有以下问题:

  • 您在面板上收到了 mouseenter 事件并制作了按钮 可见
  • 您将鼠标移到按钮上

最后一个操作触发了面板上的 mouseleave 事件。
因此,您的按钮变得不可见。
但是使按钮不可见会触发面板上的鼠标输入,眨眼间按钮再次可见并导致面板上的鼠标离开。
这两个事件之间开始无限循环。

所以点击事件并没有丢失,只是它永远不会触发,因为表单引擎正忙于隐藏和显示按钮控件。

我已经重现了这种情况并修复了它,为 MouseMove 事件添加了一个事件处理程序。在这个事件中我设置了一个变量来阻止两个事件之间的无限循环...

这是我的例子,适应你的真实代码,在LinqPad中试试

public class Form1 : Form
{ 
    Button b1 = new Button();
    Panel p1 = new Panel();
    bool stillOnPanel = false;

    public Form1()
    {
        b1.Text = "ClickMe";
        b1.Click += onClick;
        b1.Visible = false;

        p1.MouseEnter += onEnter;
        p1.MouseLeave += onLeave;
        p1.MouseMove += onMove;
        p1.BorderStyle = BorderStyle.FixedSingle;
        p1.Size = new Size(150,100);
        this.Controls.Add(p1);
        p1.Controls.Add(b1);
    }
    void onClick(object sender, EventArgs e)
    {
        Console.WriteLine("Clicked");
    }
    void onMove(object sender, MouseEventArgs e)
    {
        //Check if we are still over the panel area
        stillOnPanel = b1.ClientRectangle.Contains(p1.PointToClient(Cursor.Position));
    }
    void onEnter(object sender, EventArgs e)
    {
        if (!b1.Visible)
        {
            b1.Visible = true;
        }
    }
    void onLeave(object sender, EventArgs e)
    {
        // Do not hide the button if we are over it, let it click....
        if (b1.Visible && !stillOnPanel)
        {
            b1.Visible = false;
        }
    }
}