C # WPF - DragMove и нажмите - PullRequest
       11

C # WPF - DragMove и нажмите

2 голосов
/ 16 декабря 2009

Мне нужен элемент управления для вызова метода DragMove () для окна при нажатии MouseLeftButton, но при нажатии все равно он работает.

Если вызывается DragMove (), Click и MouseLeftButtonUp никогда не запускаются, потому что DragMove () является блокирующим вызовом, пока они не отпустят кнопку мыши.

Кто-нибудь знает обходной путь, чтобы сделать эту работу?

Я пробовал этот взлом на основе Thread.Sleep, который позволяет щелкать мышью, если он быстрее 100 миллисекунд, но он не работает надежно для пользователей:

                ThreadPool.QueueUserWorkItem(_ =>
                    {
                        Thread.Sleep(100);

                        Dispatcher.BeginInvoke((Action)
                            delegate
                            {
                                if (Mouse.LeftButton == MouseButtonState.Pressed)
                                {
                                    window.DragMove();
                                }
                            });
                    });

РЕДАКТИРОВАТЬ: Ну, этот взлом работал ...

                window.DragMove();
                RaiseEvent(new MouseButtonEventArgs(e.MouseDevice, e.Timestamp, MouseButton.Left) 
                    { 
                        RoutedEvent = MouseLeftButtonUpEvent 
                    });

Кто-нибудь есть лучше?

Ответы [ 2 ]

2 голосов
/ 17 декабря 2009

Я считаю, что мое редактирование выше - лучшее решение.

0 голосов
/ 16 декабря 2009

Если вы хотите оба поведения, то вам придется отлавливать события мыши и перемещения мыши.При наведении курсора мыши вы сохраняете текущее местоположение мыши:

StartPosition = event.GetPosition(ui_element);

Затем при перемещении мыши вы начинаете перетаскивание только в том случае, если кнопка мыши все еще нажата и мышь достаточно переместилась:

        if (e.LeftButton == MouseButtonState.Pressed) {
        Point position = e.GetPosition(Scope);
        if (Math.Abs(position.X - StartPoint.X) > SystemParameters.MinimumHorizontalDragDistance ||
            Math.Abs(position.Y - StartPoint.Y) > SystemParameters.MinimumVerticalDragDistance) {
            StartDrag(e);
        }
    }

Объект SystemParameters определяет представление Windows о том, что такое движение.

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