2012-05-24 25 views
10

Ok ragazzi, mi sono grattato la testa come un matto per questo problema e ho passato un buon paio di ore a cercare come funziona, ma devo ancora trovare una risposta, se lo desiderate per vedere qualcuno dei miei SRC sentiti libero di chiederlo e vedrò se posso aiutarti.Scorrere mentre si trascina e rilascia (WPF)

Fondamentalmente il problema che sto avendo è che ho un TreeView di cartelle nella mia applicazione vale a dire:

Catalog 

    Brands 
    Nike 
    Adidas 
    Lactose 

    Styles 
    Sandles 
    Trainers 
    Boots 

Il problema che sto cercando di risolvere il problema è che quando mi trascina una cartella in giro (Questo è gestito nella mia classe DragDropManager), non riesco a scorrere verso l'alto o verso il basso (visualizza semplicemente un delizioso segnale di stop). Non riesco nemmeno a trovare uno scroller all'interno della treeview, quindi non sono sicuro di come viene generato (questo non è il mio software, ho recentemente iniziato a lavorare per un'azienda, quindi non ho familiarità con il codice e nessun altro sembra sapere.)

Questo è un problema se voglio spostare qualcosa da molto in alto fino in fondo.

Lo scorrimento funziona perfettamente senza il trascinamento.

Se qualcuno desidera vedere qualsiasi parte del mio codice sentirsi libero di chiedere come sono sicuro di cosa effettivamente mostrare a voi ragazzi.

Ho letto alcuni articoli e mi sono appena lasciato grattarmi la testa.

risposta

17

ho creato una proprietà associata per il raggiungimento di questo comportamento, uno sguardo al mio post qui -

Attached Behavior for auto scrolling containers while doing Drag & Drop

logica principale è qualcosa di simile -

private static void OnContainerPreviewDragOver(object sender, DragEventArgs e) 
{ 
    FrameworkElement container = sender as FrameworkElement; 

    if (container == null) { return; } 

    ScrollViewer scrollViewer = GetFirstVisualChild<ScrollViewer>(container); 

    if (scrollViewer == null) { return; } 

    double tolerance = 60; 
    double verticalPos = e.GetPosition(container).Y; 
    double offset = 20; 

    if (verticalPos < tolerance) // Top of visible list? 
    { 
     //Scroll up 
     scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset - offset); 
    } 
    else if (verticalPos > container.ActualHeight - tolerance) //Bottom of visible list? 
    { 
     //Scroll down 
     scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset + offset);  
    } 
} 

domande simili su SO (anche se sono per lo più per ListBox/ListView ma dovrebbero funzionare anche per TreeView) -

WPF Listbox auto scroll while dragging

WPF ListView Databound Drag/Drop Auto Scroll

WPF Drag-to-scroll doesn't work correctly

+0

Ho cercato di usare questo sul mio listbox, ma non funziona se gli elementi nella casella di riepilogo non possono essere sganciate su. Ho articoli misti nella lista, alcuni possono essere lasciati, altri no. Se quelli vicini alla parte superiore (o inferiore) non possono ricevere le gocce, lo scorrimento non si attiva. Qualche idea su un modo per aggirare questo? –

+0

@Lutz è molto interessante, non si è mai imbattuto in questo scenario quindi non posso dire molto. Posso pensare a 1. Aggiungi alcuni elementi fittizi tra gli elementi correnti (con altezza ridotta ecc. In modo che non sembrino strani o sprecano spazio), rendili trascinabili in modo che PreviewDragOver sia sempre chiamato per loro. Ma dovrai gestire la caduta ecc. 2. Rendi tutti gli oggetti trascinabili e gestisci la convalida dopo la caduta. 3. Cerca di scoprire se è stato attivato un altro evento per questi oggetti non droppabili. – akjoshi

Problemi correlati