Mostrar mousepoint mientras se hace arrastrar y soltar en WPF
-
20-09-2019 - |
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.
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).
- Cada vez que está arrastrando el uso oyente eventos de ratón mundial ( Mouse.MouseMoveEvent ) en la clase de barra de estado personalizado.
- 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 eventoDragAndDropManager
. Pero tenga cuidado con los eventos estáticos. Es muy fácil de introducir una pérdida de memoria ... -
Convertir
DragAndDropManager
en Singleton. Implementar INotifyValueChanged en ella, crear una instanciaMousePoint
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