Почему Cursor.Show () и Cursor.Hide () не сразу скрывают или показывают курсор? - PullRequest
5 голосов
/ 03 октября 2011

Я пишу систему перетаскивания для визуализатора.Когда вы нажимаете и перетаскиваете, он перемещает то, что вы видите в окне.Когда мышь ударяется о край панели, я начинаю перемещать курсор, чтобы он никогда не покидал поле.Он отслеживает виртуальную позицию, в которой был бы курсор, если бы он был внутри поля.Эта часть кода работает нормально.

Каждый раз, когда происходит событие MouseMoved и позиция находится внутри поля, я делаю Cursor.Show ().Если это вне коробки, я делаю Cursor.Hide ().Когда пользователь отпускает кнопку мыши, я делаю Cursor.Show ().

Есть несколько проблем.Когда происходит первый вызов Hide, он не скрывается.Я должен получить виртуальную позицию курсора за пределами содержащего окна, чтобы скрытие произошло.Когда я возвращаюсь назад, он не становится видимым, хотя вызывается «Шоу».Наконец, при отпускании кнопки мыши курсор не появляется, несмотря на то, что вызывается Show.

Вместо того, чтобы просить людей отлаживать мой код, мне просто интересно, что происходит в системе событий, которая делает Cursor.Hide/ Показать не так, как я ожидаю.У меня сложилось впечатление, что если элемент управления называется Hide, курсор будет скрыт всякий раз, когда он находится внутри этого элемента управления;аналогично, если я позвоню в шоу из Control.

Ответы [ 3 ]

11 голосов
/ 24 января 2014

Для тех, у кого возникла эта проблема, попробуйте что-то вроде этого:

    private bool _CursorShown = true;
    public bool CursorShown
    {
        get
        {
            return _CursorShown;
        }
        set
        {
            if (value == _CursorShown)
            {
                return;
            }

            if (value)
            {
                System.Windows.Forms.Cursor.Show();
            }
            else
            {
                System.Windows.Forms.Cursor.Hide();
            }

            _CursorShown = value;
        }
    }

и используйте его:

CursorShown = false; // Will hide the cursor
CursorShown = false; // Will be ignored
CursorShown = true; // Will show the cursor
CursorShown = true; // Will be ignored
10 голосов
/ 04 октября 2011

У Ганса это было в комментарии.Поскольку на этот вопрос есть ответ, я чувствую, что он должен иметь ответ.

"Он считается. Два показа и одно скрытие не скрывают курсор"- Ганс Пассант

0 голосов
/ 30 января 2019

Вы могли бы упростить это

      //Whenever you want to hide the cursor           
       Cursor.Hide();
       countCursorHide++;

И показать Курсор

    int countCursorHide = 0;
    private void showCursor()
    {
        for (int i = 0; i < countCursorHide; i++)
        {
            Cursor.Show();
        }
        countCursorHide = 0;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...