可见性更改后无法保留 OnClick 事件
Cannot keep OnClick event after visibilty change
只是想知道是否有其他人可以重新创建它,还是只有我自己:)
- 在表单上拖放一个面板
- 在面板上放一个按钮
- 创建按钮“我是按钮”的点击
以上工作正常
- 将 onmouseleave 添加到面板设置按钮可见 false
- 将 onmouseenter 添加到面板设置按钮可见到 true
现在,如果您将鼠标移入和移出面板,该按钮将变为可见错误。完美.
现在将鼠标移回 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;
}
}
}
只是想知道是否有其他人可以重新创建它,还是只有我自己:)
- 在表单上拖放一个面板
- 在面板上放一个按钮
- 创建按钮“我是按钮”的点击
以上工作正常
- 将 onmouseleave 添加到面板设置按钮可见 false
- 将 onmouseenter 添加到面板设置按钮可见到 true
现在,如果您将鼠标移入和移出面板,该按钮将变为可见错误。完美.
现在将鼠标移回 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;
}
}
}