C# 面板上的鼠标移动事件不适用于我

C# 面板上的鼠标移动事件不适用于我,c#,winforms,panel,C#,Winforms,Panel,我正在做一个播放视频的项目。我在面板中使用了播放/暂停/停止按钮,面板被禁用,最初不可见 我想通过鼠标移动事件启用它,但当我在包含面板的区域中移动光标时,它不会显示面板控件,下面是代码 private void panel1_MouseMove(object sender, MouseEventArgs e) { if (e.X >= top_left.X && e.X <= top_right.X && e.Y >= top_left.

我正在做一个播放视频的项目。我在面板中使用了播放/暂停/停止按钮,面板被禁用,最初不可见

我想通过鼠标移动事件启用它,但当我在包含面板的区域中移动光标时,它不会显示面板控件,下面是代码

private void panel1_MouseMove(object sender, MouseEventArgs e)
{
    if (e.X >= top_left.X && e.X <= top_right.X && e.Y >= top_left.Y && e.Y <= bottom_left.Y)
         SetEnabled(true);
    else SetSenabled(false);

    void SetEnabled(bool enabled) => (panel1.Visible, panel1.Enabled) = (enabled, enabled);
}
private void panel1\u MouseMove(对象发送器,MouseEventArgs e)
{
如果(e.X>=top_left.X&&e.X=top_left.Y&&e.Y(panel1.Visible,panel1.Enabled)=(Enabled,Enabled);
}

我现在能做什么?

已经有一段时间了,但我很确定如果控件的.Enabled设置为false,它将不会响应任何事件处理程序。禁用面板有什么好处?你应该启用它,然后再试一次。正如Poomrock在3年前所说的,确保该方法作为事件处理程序绑定到控件。你可以在上,您不需要以编程方式添加它。您可以在设计器中手动设置它(不推荐),也可以选择面板,然后在属性面板中,转到事件处理程序并以这种方式分配它。

private void Form1\u MouseMove(对象发送方,MouseEventArgs e)
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
    if (e.X >= pnlOne.Location.X && e.X <= pnlOne.Location.X + pnlOne.Size.Width && pnlOne.Visible == false && e.Y >= pnlOne.Location.Y && e.Y <= pnlOne.Location.Y + pnlOne.Size.Height)
    {
        pnlOne.Visible = true;
        pnlOne.Enabled = true;
    }
}

private void pnlOne_MouseLeave(object sender, EventArgs e)
{
    pnlOne.Visible = false ;
    pnlOne.Enabled = false ;
}
{
如果(e.X>=pnlOne.Location.X&&e.X=pnlOne.Location.Y&&e.Y一个不可见的面板不会抛出任何事件,那么真正做到这一点的唯一方法是使用计时器并检查鼠标是否在控件区域内:

private Timer timer = new Timer();

public Form1() {
  InitializeComponent();
  timer.Tick += timer_Tick;
  timer.Start();
}

void timer_Tick(object sender, EventArgs e) {
  Rectangle r = pnlOne.RectangleToScreen(pnlOne.ClientRectangle);
  if (r.Contains(MousePosition)) {
    if (!pnlOne.Visible)
      pnlOne.Visible = true;
  } else {
    if (pnlOne.Visible)
      pnlOne.Visible = false;
  }
}

无需更改面板的Enabled属性(只需将其保留为Enabled=true;
),因为您似乎只关心在鼠标位于控件区域时显示面板。

enable属性设置为false


无论使用鼠标事件的对象是什么,都必须将enable属性设置为TRUE!

是否将pnlOne.MouseMove+=this.mouseeventhandler(pnlOne\u MouseMove);添加到构造函数中?在初始化组件()之后,我可以在何处添加这样的代码;当心!!:我的代码不是100%正确。请按照自动完成。如果控件不可见或未启用,您希望如何获取消息?我简直不敢相信这是怎么可能的。您能给我执行上述操作的鼠标输入事件的代码…仍然不工作…给我您的电子邮件地址,然后我将向您发送我的密码吗code@user3540132Po把它放在这里。如果它太长,就把它上传到某个地方看。也许你应该试着用鼠标盖而不是鼠标移动?