Списки событий стреляют странно - PullRequest
0 голосов
/ 16 апреля 2011

Я в замешательстве. Я в основном пытаюсь сказать, когда пользователь щелкнул что-то в списке, удерживал кнопку и покинул список. Вот несколько глупая версия того, что я делаю:

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 только в том случае, если вы подняли его, и отобразить ohh yes, если значение равно true. Если я прервал событие мыши, чтобы проверить значение, оно будет истинным, и если я продолжу оттуда, появится сообщение. Если я не сломаюсь, это ничего не сделает. Есть ли здесь что-то еще на работе?

Edit: Краткое описание: Было бы трудно объяснить, что я на самом деле пытаюсь выполнить, но представьте себе что-то похожее на перетаскивание файла из окна. Мне нужно просто иметь возможность распознавать, когда пользователь щелкает внутри списка, а затем перетаскивает из списка, если это имеет смысл

Ответы [ 3 ]

2 голосов
/ 16 апреля 2011

Вы не можете отлаживать события Windows по точке останова, потому что, когда Visual Studio станет активным для отладки, событие мыши будет запущено для элемента управления hovered.

Вы можете использовать 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 голос
/ 16 апреля 2011

что по этому поводу?

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

он использует тот факт, что элемент управления не оставлен до отпускания кнопки мыши ... но имейте в виду, что часть перетаскивания будет происходить более одного раза, поэтому вам, вероятно, понадобится установить флаг в первый раз ... и очистить этот флаг при наведении мыши или оставить

1 голос
/ 16 апреля 2011

При каждом щелчке мыши запускается событие MouseDown И запускается событие MouseUp, поэтому последовательность операций эквивалентна

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

Если вы нажмете кнопку мыши в списке и переместите курсорбез отпускания кнопки переключение фокуса на другое окно (например, Visual Studio) вызывает событие MouseLeave для запуска.Вот почему вы видите всплывающее окно сообщения при отладке.

Я не уверен, чего вы пытаетесь достичь, поэтому я не могу рекомендовать другое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...