Pregunta

Estoy utilizando Lesters DragAndDropManager para obtener la función de arrastrar y soltar en mi solicitud y me gusta mucho la forma en que se implementa, pero tengo un pequeño problema y es que quiero mostrar la cordination ratón durante el arrastre en mi barra de estado, así que ¿cómo puedo enviar el mouseposition del DropManager a mi código XAML.

He intentado añadir un DependencyProperty en el administrador que pueda unirse a la xaml-código.

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

Y en el Xaml Ato a él de esta manera.

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

Pero ¿Cómo se configura el mousecordintation a mi dependecyproperty en el administrador?

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

Creo que estoy mal aquí, pero tengo que quedar atrapado en cómo conseguir la mousecordination a la xaml de código mediante la unión a la DragAndDropManager.

Gracias.

¿Fue útil?

Solución

Exactamente. No se puede obligar a la propiedad adjunto, en una forma que desee, ya que hay que conocer un objeto donde se adjunta.

¿Cómo hacer esto? Veo tres opciones (pero hay muchos más).

  1. Cada vez que está arrastrando el uso oyente eventos de ratón mundial ( Mouse.MouseMoveEvent ) en la clase de barra de estado personalizado.
  2. evento de exposición estática de DragAndDropManager, suscribirse a él en la clase de barra de estado personalizado. Cada vez que se produce la fricción, fuego del evento DragAndDropManager. Pero tenga cuidado con los eventos estáticos. Es muy fácil de introducir una pérdida de memoria ...
  3. Convertir DragAndDropManager en Singleton. Implementar INotifyValueChanged en ella, crear una instancia MousePoint propiedad, por ejemplo. Unirse a él desde la barra de estado:

    Text = "{Binding MousePoint.X, Fuente = {x: estática local: DragDropBehavior.Instance}}"

Cada vez que se produce la fricción, actualizar propiedad de instancia, y elevar caso de cambio de propiedad.

Espero que esta ayuda,

Saludos, Anvaka

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top