当鼠标按下时 MouseHover 不触发

MouseHover not firing when mouse is down

我正在开发一个 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 事件永远不会触发,除非鼠标没有被按住。也没有运气将 MouseHoverMouseEnter 交换。因此,我保留了 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;
    }
}

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

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

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

等...

您 运行 遇到的问题是您使用了错误的事件来实现您想要完成的目标。

您可以使用拖放事件。

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

走过

例子

我有 3 个按钮,button1 和 button2 以及 button3 和 button2 是放置目标。在下面的代码中,我将检查按钮 2 上的文本是否是按钮 1 的文本,我将按钮 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;
}