鼠标悬停事件不会被触发

时间:2013-04-20 18:24:21

标签: c# panel mouseup

我有以下问题:我有一个具有特定颜色的面板,比如红色。 当用户按下鼠标时,该面板的颜色存储在变量中。然后用户移动,他的鼠标仍然按下,转到另一个面板。当他在那里释放鼠标时,该面板应该获得存储在变量中的第一个颜色。我的代码看起来像这样:

    public Color currentColor;
    private void ColorPickMouseDown(object sender, MouseEventArgs e)
    {
        Panel pnlSender = (Panel)sender;                   
        currentColor = pnlSender.BackColor;
    }

    private void AttempsColorChanger(object sender, MouseEventArgs e)
    {
        Panel pnl = (Panel)sender;
        pnl.BackColor = currentColor;
    }

我需要首先识别发件人,因为有许多可能的面板可以触发此事件。第一个MouseDown方法完全正常,颜色很好地存储在变量中。然而,当用户执行上述描述时,secon one甚至不会被触发。当ser点击第二个面板时,它可以正常工作(我猜测还有一个MouseUp部分)。

这里有什么问题?为什么用户在按住鼠标键之前未触发事件?

4 个答案:

答案 0 :(得分:3)

(此答案假设您使用的是Windows窗体。)

可能需要通过在源代码管理的MouseDown中设置this.Capture = true来捕获鼠标。 (See Control.Capture

如果您这样做,窗口将获得MouseUp事件,而 source 窗口必须确定目标窗口鼠标坐标。您可以使用Control.GetChildAtPoint()执行此操作(请参阅Stack Overflow上的this answer)。

Use Windows Forms Drag and Drop Support Instead! < - 点击了解更多信息

我建议你咬紧牙关并使用.Net拖放方法来做到这一点。它需要一些阅读,但使用它会更好

您通过调用Control.DoDragDrop()开始拖动以响应MouseDown事件。

然后,您需要处理放置目标控件中的Control.DragDrop事件。

您可能还需要做一些事情来设置它;有关示例,请参阅Control.DoDragDrop()文档。

For WPF drag and drop support, see here.

答案 1 :(得分:1)

当你的鼠标进入目标控件时,鼠标按下触发器获取目标BackColor!你需要为你的代码添加一个布尔标志:

 public Color currentColor;       
 bool flag=false;
    private void ColorPickMouseDown(object sender, MouseEventArgs e)
    {
        if(flag==false)
        {
        flag=true
        Panel pnlSender = (Panel)sender;                   
        currentColor = pnlSender.BackColor;
       }
    }
    //assume mouse up for panles
    private void AttempsColorChanger(object sender, MouseEventArgs e)
    {
       if(flag==true)
       {  
        Panel pnl = (Panel)sender;
        pnl.BackColor = currentColor;
        flag=flase;
       }
    }

并且您还需要在mouseMove(if)中更改您的标志

答案 2 :(得分:0)

正如我在评论中提到的,鼠标事件由原始控件捕获,您可能最好使用Windows窗体中内置的DragDrop功能。这样的事情对你有用。我分配了常见的事件处理程序,因此可以将它们分配给所有面板并正常工作。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void panel_MouseDown(object sender, MouseEventArgs e)
    {
       ((Control)sender).DoDragDrop(((Control)sender).BackColor,DragDropEffects.All);
    }

    private void panel_DragDrop(object sender, DragEventArgs e)
    {
        ((Control)sender).BackColor = (Color)e.Data.GetData(BackColor.GetType());
    }
    private void panel_DragEnter(object sender, DragEventArgs e)
    {
        e.Effect = DragDropEffects.Copy;
    }

}

答案 3 :(得分:0)

我知道这是一个老问题,但我遇到了同样的问题,上述答案都没有对我有用。在我的情况下,我必须处理目标控件中的MouseMove事件并检查要释放的鼠标。我确实在我的目标面板上设置了“BringToFront”,以防万一有所帮助。

public Color currentColor;
private void ColorPickMouseDown(object sender, MouseEventArgs e)
{
    Panel pnlSender = (Panel)sender;                   
    currentColor = pnlSender.BackColor;
}

private void panelTarget_MouseMove(object sender, MouseEventArgs e)
{
    //the mouse button is released
    if (SortMouseLocation == Point.Empty)
    {
        Panel pnl = (Panel)sender;
        pnl.BackColor = currentColor;
    }
}