列表框事件奇怪地发射

时间:2011-04-15 20:25:03

标签: c# winforms events listbox

我很困惑。我基本上试图告诉用户何时单击列表框中的内容,按住按钮,然后离开列表框。这是我正在做的有点愚蠢的版本:

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");
    }

对我而言,当你按下鼠标按钮时,它似乎应该将itemHeld设置为true,只有当你抬起它时才将其设为false,如果值为true则显示哦,是的。如果我打破鼠标按下事件来检查值,它是真的,如果我从那里继续它显示消息。如果我不打破,它什么都不做。还有什么在这里工作吗?

编辑: 简要说明:很难解释我真正想要实现的目标,但想象一下几乎就像从窗口拖出文件一样。我需要能够识别用户何时单击列表框内部,然后拖出列表框,如果这是有意义的

3 个答案:

答案 0 :(得分:2)

您无法按断点调试Windows事件,因为当Visual Studio激活以进行调试时,将为悬停控件触发鼠标离开事件。

您可以使用Debug.WriteLine将有关调试的信息写入跟踪侦听器。

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

答案 1 :(得分:1)

每次点击鼠标,您的MouseDown事件都会触发,您的MouseUp事件将触发,因此操作顺序等同于

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

如果按下列表框上的鼠标按钮并将光标移开而不释放按钮,则将焦点切换到另一个窗口(例如Visual Studio)会触发MouseLeave事件触发。这就是您在调试时弹出消息框的原因。

我不确定你要完成什么,所以我不能推荐另一种解决方案。

答案 2 :(得分:1)

这是怎么回事?

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);
}

它使用的事实是在释放鼠标按钮之前没有留下Control ...但请注意拖出部分会多次出现,所以你可能想要第一次设置一个标志......并在鼠标上清除该标志或离开