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.

È stato utile?

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ù).

  1. Ogni volta che si sta trascinando uso globale gli eventi del mouse ascoltatore ( Mouse.MouseMoveEvent ) nella classe barra di stato personalizzato.
  2. Esporre evento statica da DragAndDropManager, iscriversi ad esso nella classe barra di stato personalizzato. Ogni volta che si verifica la resistenza, evento fuoco DragAndDropManager. Ma attenzione con gli eventi statici. E 'molto facile introdurre una perdita di memoria ...
  3. 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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top