Показывать точку наведения курсора мыши при перетаскивании в WPF

StackOverflow https://stackoverflow.com/questions/1945335

Вопрос

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

Я попытался добавить dependencyproperty в менеджер, к которому я могу привязаться в 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;
    }

И в Xaml я привязываюсь к нему следующим образом.

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

Но как мне установить mousecordintation для моего dependecyproperty в диспетчере?

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

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

Спасибо.

Это было полезно?

Решение

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

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

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

    Text="{Привязка точки мыши.X, Источник={x: Статический локальный:DragDropBehavior.Экземпляр}}"

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

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

Твое здоровье, Анвака

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top