Показывать точку мыши при перетаскивании в WPF - PullRequest
0 голосов
/ 22 декабря 2009

Я использую Lesters DragAndDropManager чтобы получить функцию перетаскивания в моем приложении, и мне очень нравится, как оно реализовано, но у меня есть одна небольшая проблема - я хочу показать кординацию мыши во время перетаскивания в моей строке состояния, так как мне отправить положение мыши из DropManager в мой код xaml.

Я попытался добавить свойство зависимостей в диспетчере, которое можно связать в xaml-коде.

    public static readonly DependencyProperty MousePointProperty =
        DependencyProperty.RegisterAttached("MousePoint", typeof(Point), typeof(DragDropBehavior),
        new FrameworkPropertyMetadata(default(Point)));
    public static void SetMousePoint(DependencyObject depObj, bool isSet)
    {
        depObj.SetValue(MousePointProperty, isSet);
    }
    public static IDragSourceAdvisor GetMousePoint(DependencyObject depObj)
    {
        return depObj.GetValue(MousePointProperty) as IDragSourceAdvisor;
    }

И в Ксамле я привязываюсь к этому вот так.

    <StatusBar>
        <TextBlock Text="{Binding local:DragDropBehavior.MousePoint.X}"/>
    </StatusBar>

Но как мне установить для мыши указатель на свойство зависимости в диспетчере?

    private static void DropTarget_PreviewDragOver(object sender, DragEventArgs e)
    {
        if (UpdateEffects(sender, e) == false) return;
        //-- Update position of the preview Adorner
        Point position = GetMousePosition(sender as UIElement);

        //-- Here I Want to do this, but that not posible because the SetMousePoint takes a dependencyObject and not my value.
        //-- SetMousePoint(position);

        _draggedUIElementAdorner.Left = position.X - _offsetPoint.X;
        _draggedUIElementAdorner.Top = position.Y - _offsetPoint.Y;

        e.Handled = true;
    }

Я думаю, что я здесь не прав, но я застрял в том, как получить координацию мыши для xaml-кода, связавшись с DragAndDropManager.

Спасибо.

1 Ответ

1 голос
/ 22 декабря 2009

Точно. Вы не можете связать прикрепленное свойство так, как хотите, потому что вам нужно знать объект, к которому оно прикреплено.

Как это сделать? Я вижу три варианта (но их гораздо больше).

  1. При каждом перетаскивании используйте глобальный прослушиватель событий мыши ( Mouse.MouseMoveEvent ) в пользовательском классе строки состояния.
  2. Выставить статическое событие из DragAndDropManager, подписаться на него в классе пользовательской строки состояния. Всякий раз, когда происходит перетаскивание, срабатывает событие от DragAndDropManager. Но будьте осторожны со статическими событиями. Ввести утечку памяти очень просто ...
  3. Конвертировать DragAndDropManager в синглтон. Реализуйте INotifyValueChanged в нем, например, создайте свойство экземпляра MousePoint. Привязать к нему из строки состояния:

    Text = "{Binding MousePoint.X, Source = {x: Статический локальный: DragDropBehavior.Instance}}"

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

Надеюсь, это поможет,

Ура, Анвака

...