【问题标题】:C# how to trigger MouseMove or MouseEnter events if MouseButton is down when entering a control? [closed]如果在进入控件时 MouseButton 按下,C# 如何触发 MouseMove 或 MouseEnter 事件? [关闭]
【发布时间】:2021-05-11 07:00:21
【问题描述】:

当鼠标左键按下时,我需要触发 MouseMove 或 MouseEnter 事件。不幸的是,当鼠标左键按下时,这些事件不会被触发。

我已经在这个帖子中尝试过解决方案: C# triggering MouseEnter even even if mouse button is held down

但它不起作用,因为它仅适用于表单而不是控件。 这个想法很简单,假设我有 10 个彼此相邻的标签。 在一个标签上 MouseDown --> 它的背景颜色变为红色后,然后我保持 MouseLeftButton 向下并继续将鼠标移动到其他标签,我希望这些标签的背景颜色也变为红色,而无需释放鼠标任何一点。

我尝试在 MouseDown 事件中使用布尔变量来存储鼠标按钮的状态 --> MouseDown = true; 然后在 MouseEnter 或 MouseMove 处使用该布尔值,但这些事件根本不会被触发。 谢谢大家。

【问题讨论】:

  • 但它不起作用,因为它只适用于表单而不是控件。 如果你编写必要的代码,即如果你测试你想要的控件,它会抓住进入。

标签: c# eventtrigger


【解决方案1】:

必须在 MouseDown 事件中使用Label.Capture = false; 表示此事件允许其他事件运行。

我放了完整的代码

public partial class Form1 : Form
{
   bool Ispressed = false; 
   public Form1()
   {
      InitializeComponent();
      for(int i=1; i<=10;i++)
      {
          Label lbl = new Label();
          lbl.Name = "lbl" + i;
          lbl.Text = "Label " + i;
          lbl.Location = new System.Drawing.Point(150, i * 40);
          lbl.MouseDown += new MouseEventHandler(Lbl_MouseDown);
          lbl.MouseUp += new MouseEventHandler(Lbl_MouseUp);
          lbl.MouseMove += new MouseEventHandler(Lbl_MouseMove);
          lbl.MouseLeave += new System.EventHandler(Lbl_MouseLeave);
          this.Controls.Add(lbl);
      }
   }
   private void Lbl_MouseMove(object sender, MouseEventArgs e)
   {
      if (Ispressed)
      {
          Label lbl = sender as Label;
          lbl.BackColor = Color.Red;
      }
   }

   private void Lbl_MouseLeave(object sender, EventArgs e)
   {
      Label lbl = sender as Label;
      lbl.BackColor = Color.Transparent;
   }       
   private void Lbl_MouseDown(object sender, MouseEventArgs e)
   {
      Label lbl = sender as Label;
      lbl.BackColor = Color.Red;

      lbl.Capture = false;
      Ispressed = true;
   }
   private void Lbl_MouseUp(object sender, MouseEventArgs e)
   {
       Ispressed = false;
       foreach(Control ctr in this.Controls)
       {
          if(ctr is Label)
          {
             ctr.BackColor = Color.Transparent;
          }
       }
   }
 }

【讨论】:

  • 看起来不错,但我无法让它工作。
  • 好的,确实如此;只是不是我认为需要的:当将 control1 移动到 control2 上时,关闭 control1 上的捕获无济于事。只有观察位置有帮助。但是重新阅读这个问题,我认为他可能不需要那个..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
  • 1970-01-01
相关资源
最近更新 更多