在WPF中执行拖放操作时显示mousepoint

时间:2009-12-22 09:57:38

标签: wpf drag-and-drop mouse-position

我正在使用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;
    }

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

我认为我在这里错了,但我已经陷入了如何通过绑定到DragAndDropManager来使鼠标协调到xaml代码。

感谢。

1 个答案:

答案 0 :(得分:1)

完全。您无法以您想要的方式绑定到附加属性,因为您必须知道附加了它的对象。

怎么做?我看到三个选项(但还有更多)。

  1. 每当您拖动时,在自定义状态栏类中使用全局鼠标事件侦听器(Mouse.MouseMoveEvent)。
  2. DragAndDropManager公开静态事件,在自定义状态栏类中订阅它。每当发生拖动时,都会从DragAndDropManager触发事件。但要小心静态事件。引入内存泄漏很容易......
  3. DragAndDropManager转换为单身。在其中实现INotifyValueChanged,创建实例属性MousePoint。从状态栏绑定到它:

    Text =“{Binding MousePoint.X,Source = {x:Static local:DragDropBehavior.Instance}}”

  4. 每当发生拖动时,更新实例属性,并引发属性更改事件。

    希望这有帮助,

    干杯,安瓦卡