MouseHover在鼠标关闭时不会触发

时间:2015-12-09 21:32:42

标签: 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;
     };
}

但是,除非未按下鼠标,否则MouseHover事件永远不会触发。也没有运气与MouseHover交换MouseEnter。所以,我保留了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;
    }
}

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

2 个答案:

答案 0 :(得分:3)

您可以使用拖放事件。

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

    示例

    我有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;
    }
    

答案 1 :(得分:0)

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

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

等...

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