Mostra MousePoint mentre si fa il drag and drop in WPF
-
20-09-2019 - |
Domanda
Lesters DragAndDropManager per ottenere il drag and drop nella mia richiesta e mi piace molto il modo in cui è implementato, ma ho un piccolo problema e cioè che voglio mostrare il cordination del mouse durante il trascinamento nella mia barra di stato, quindi come faccio a inviare il mouseposition dal DropManager al mio codice XAML.
Ho provato ad aggiungere un DependencyProperty nel gestore che posso legare al XAML-codice.
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;
}
E nel Xaml mi legano ad esso come questo.
<StatusBar>
<TextBlock Text="{Binding local:DragDropBehavior.MousePoint.X}"/>
</StatusBar>
Ma come faccio a impostare il mousecordintation alla mia dependecyproperty nel manager?
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;
}
Credo che mi sbaglio qui, ma ho rimane bloccata su come ottenere il mousecordination al XAML codice legandosi al DragAndDropManager.
Grazie.
Soluzione
Esattamente. Non è possibile associare alle proprietà associata, in un modo desiderato, perché devi sapere un oggetto in cui è attaccato.
Come fare questo? Vedo tre opzioni (ma ce ne sono molti di più).
- Ogni volta che si sta trascinando uso globale gli eventi del mouse ascoltatore ( Mouse.MouseMoveEvent ) nella classe barra di stato personalizzato.
- Esporre evento statica da
DragAndDropManager
, iscriversi ad esso nella classe barra di stato personalizzato. Ogni volta che si verifica la resistenza, evento fuocoDragAndDropManager
. Ma attenzione con gli eventi statici. E 'molto facile introdurre una perdita di memoria ... -
Convertire
DragAndDropManager
in Singleton. Implementare INotifyValueChanged in essa, creare l'istanza di proprietàMousePoint
, per dire. Associare ad esso da statusbar:Text = "{Binding MousePoint.X, Fonte = {x: Statico locale: DragDropBehavior.Instance}}"
Ogni volta che si verifica la resistenza, aggiornare proprietà di istanza, ed aumentare di proprietà evento modificato.
Spero che questo aiuti,
Saluti, Anvaka