MouseHover在鼠标关闭时不会触发

Wal*_*hop 5 c# winforms 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;
     };
}
Run Code Online (Sandbox Code Playgroud)

但是,除非未按住鼠标,否则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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Rez*_*aei 3

您可以使用拖放事件。

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

走过

例子

我有 3 个按钮,按钮 1 和按钮 2,按钮 3 和按钮 2 是放置的目标。在下面的代码中,我将检查按钮 2 上掉落的文本是否是按钮 1 的文本,我将按钮 2 的背景颜色更改为绿色,否则更改为红色。另外,如果您将鼠标拖出按钮2,我会将背景颜色设置为默认值。如果你删除,我将更改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;
}
Run Code Online (Sandbox Code Playgroud)