鼠标停止时MouseHover不会触发

我正在开发一个WordSearch拼图程序(也称为WordFind),你必须找到大量字母中的某些单词。 我正在使用C#WinForms。

我的问题是当我想点击并按住1个字母( Label ),然后拖动到其他字母以更改其ForeColor 。 我试过谷歌搜索但无济于事。

这是我有的:

 foreach (Letter a in game.GetLetters()) { this.Controls.Add(a); a.MouseDown += (s, e2) => { isDown = true; a.ForeColor = Color.Yellow; }; a.MouseUp += (s, e2) => { isDown = false; }; a.MouseHover += (s, e2) => { if (isDown) a.ForeColor = Color.Yellow; }; } 

但是,除非未按下鼠标,否则MouseHover事件永远不会触发。 也没有运气与MouseEnter交换MouseHover 。 所以,我保留了MouseDownMouseUp事件,并尝试在表单中使用MouseHover:

 private void frmMain_MouseHover(object sender, MouseEventArgs e) { if (isDown) { foreach (Letter l in game.GetLetters()) if (l.ClientRectangle.Contains(l.PointToClient(Control.MousePosition))) l.ForeColor = Color.Purple; } } 

这个事件也不会触发,我不知道为什么它没有开火以及一些替代解决方案是什么。 任何建议表示赞赏。

您可以使用拖放事件。

  1. 为每个目标为drop的控件设置AllowDrop属性。
  2. 处理拖动从它开始的每个控件的MouseDown事件,并在处理程序中调用该控件的DoDragDrop事件并设置要拖动的数据。
  3. 处理每个拖动目标的DragEnetr事件并设置e.Effect以确定是否允许拖放。 这里是您可以检查是否允许掉落的地方,将背景颜色更改为您想要的颜色。
  4. 处理DragLeave以重置背景颜色。
  5. Hanlde DragDrop并使用GetData方法,如果e.Data获取数据并在删除时执行操作。

走过

  • 演练:在Windows窗体中执行拖放操作

我有3个按钮,button1和button2,button3和button2是drop的目标。 在下面的代码中,我将检查按钮2上的文本是否是button1的文本,我将按钮2的背面颜色更改为绿色,否则更改为红色。 此外,如果您将鼠标拖出button2,我会将背景颜色设置为默认值。 如果你放弃,我将改变button2的文本并设置button1的文本:

 //Start drag for button 2 private void button1_MouseDown(object sender, MouseEventArgs e) { this.button1.DoDragDrop(this.button1.Text, DragDropEffects.Copy); } //Start drag for button 3 private void button3_MouseDown(object sender, MouseEventArgs e) { this.button3.DoDragDrop(this.button3.Text, DragDropEffects.Copy); } //Check if drop is allowed and change back color private void button2_DragEnter(object sender, DragEventArgs e) { if(e.Data.GetData(DataFormats.Text).ToString()== button1.Text) { e.Effect = DragDropEffects.Copy; this.button2.BackColor = Color.Green; } else { e.Effect = DragDropEffects.None; this.button2.BackColor = Color.Red; } } //Perform drop actions private void button2_DragDrop(object sender, DragEventArgs e) { this.button2.Text = e.Data.GetData(DataFormats.Text).ToString(); } //Reset back color here private void button2_DragLeave(object sender, EventArgs e) { this.button2.BackColor = SystemColors.Control; } 

您正在寻找各种拖动事件:

https://msdn.microsoft.com/en-us/library/system.windows.forms.control.dragenter(v=vs.110).aspx https://msdn.microsoft.com/en-us/library/ system.windows.forms.control.dragover(v = vs.110)的.aspx

等等…

您遇到的问题是您正在使用错误的事件来完成您要完成的任务。