Разница между Select и Drag в WPF - PullRequest
1 голос
/ 20 ноября 2010

У меня есть несколько пользовательских элементов управления в Canvas.

Эти элементы управления можно перемещать с помощью перетаскивания или выбирать нажатием.

Теперь я реализовал Drag and Drop примерно так:

    protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
    {
        base.OnPreviewMouseLeftButtonDown(e);
        this.isDragInProgress = false;

        // Cache the mouse cursor location.
        this.origCursorLocation = e.GetPosition(this);

        // Walk up the visual tree from the element that was clicked, 
        // looking for an element that is a direct child of the Canvas.
        var source = e.Source;

        var element = this.FindCanvasChild(source as DependencyObject);

        if (element == null || !(element is MyControl))
            return;

        this.ElementBeingDragged = element;

        // Get the element's offsets from the four sides of the Canvas.
        this.draggedLeft = Canvas.GetLeft(this.ElementBeingDragged);
        this.darggedTop = Canvas.GetTop(this.ElementBeingDragged);

        // Set the Handled flag so that a control being dragged 
        // does not react to the mouse input.
        e.Handled = true;

        this.isDragInProgress = true;
    }

Теперь моя проблема в том, что я не могу выбрать MyControl, щелкая по нему ... (в пользовательском элементе управления нет события MouseClick, и не работает MouseDown ..)

Если я прокомментирую e.Handled = true;, элемент управления изменит его выбор при перетаскивании, если не прокомментирует, элемент управления вообще не изменит его выбор .... (

Ответы [ 2 ]

5 голосов
/ 22 ноября 2010

Вместо того, чтобы начинать операцию перетаскивания в обработчике MouseDown, вы можете сохранить некоторое начальное состояние и вместо этого зафиксировать перетаскивание в обработчике MouseMove, где вы можете проверить по SystemParameters.MinimumHorizontalDragDistance и SystemParameters.MinimumVerticalDragDistance, чтобы увидеть, было ли достаточно перемещенияначать операцию перетаскивания.Затем вы можете включить код в обработчик MouseUp, чтобы завершить операцию перетаскивания или, если он никогда не начинался из-за слишком маленького движения, вместо этого сделать выбор.

0 голосов
/ 23 января 2011

Я только что написал статью проекта кода, которая может вам помочь.В статье речь идет о выделении с помощью перетаскивания и перетаскивании нескольких элементов.

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

http://www.codeproject.com/KB/WPF/SimpleDragSelection.aspx

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