Listbox events firing strangely

匆匆过客 提交于 2021-01-29 10:48:11

问题


I'm confused. I am basically trying to tell when the user has clicked something in the listbox, held the button, and left the listbox. Here is a somewhat dumbed down version of what I am doing:

private bool itemHeld;
    private void listOriginal_MouseDown(object sender, MouseEventArgs e)
    {
        itemHeld = true;
    }

    private void listOriginal_MouseUp(object sender, MouseEventArgs e)
    {
        itemHeld = false;
    }

    private void listOriginal_MouseLeave(object sender, EventArgs e)
    {
        if (itemHeld)
            MessageBox.Show("OHH YEAH");
    }

To me that seems like it should turn itemHeld true when you press the mousebutton, turn it false only if you lift it, and display ohh yeah if the value is true. If I break on the mouse down event to check the value, it is true and if I continue from there it displays the message. If I do not break, it does nothing. Is there something else at work here?

Edit: Brief description: It would be difficult to explain what I am really trying to accomplish but imagine something almost like dragging a file off of a window. I need to simply be able to recognize when the user clicks inside of the listbox and then drags out of the listbox if that makes sense


回答1:


what about this?

private void listBox1_MouseMove(object sender, MouseEventArgs e)
{

    if (e.X > listBox1.Width - 1 || e.Y > listBox1.Height - 1 || e.X < 0 || e.Y < 0) 
    {
        Console.WriteLine("drag out");
    }
    else
        Console.WriteLine("mouse move {0}/{1}", e.X, e.Y);
}

it uses the fact that the Control is not left before the mousebutton is released ... but be aware that the drag out part will occur more than once so you probably will want to have a flag set the first time ... and have that flag cleared on mouse up or leave




回答2:


You can not debug windows events by break point because when the Visual Studio get active to debug, the mouse leave event will be fired for the hovered control.

You can use Debug.WriteLine which writes information about the debug to the trace listeners.

private void button1_MouseLeave(object sender, EventArgs e)
{
    Debug.WriteLine("Mouse leave");
}

private void button1_MouseEnter(object sender, EventArgs e)
{
    Debug.WriteLine("Mouse enter");
}

private void button1_MouseHover(object sender, EventArgs e)
{
    Debug.WriteLine("Mouse hover");
}

The output will be




回答3:


For every mouse click, your MouseDown event will fire AND your MouseUp event will fire, so the sequence of operations is equivalent to

itemHeld = true;
itemHeld = false;
if(itemHeld)
    MessageBox.Show("yay");

If you press the mouse button on the listbox and move the cursor out without releasing the button, switching focus to another window (e.g. Visual Studio) is what triggers the MouseLeave event to fire. This is why you're seeing the message box pop up when you're debugging.

I'm not sure what you're trying to accomplish, so I can't recommend another solution.



来源:https://stackoverflow.com/questions/5682012/listbox-events-firing-strangely

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!