2012-05-24 18 views
10

Bien chicos, me he estado rascando la cabeza como loco por este problema y he pasado unas horas tratando de investigar cómo funciona, pero todavía tengo que encontrar una respuesta, si lo desea para ver cualquiera de mis SRC no dude en preguntar al respecto y veré si puedo ayudar.Desplazamiento mientras se arrastra y suelta (WPF)

Básicamente el problema que estoy teniendo es que tengo un TreeView de carpetas en mi solicitud es decir:

Catalog 

    Brands 
    Nike 
    Adidas 
    Lactose 

    Styles 
    Sandles 
    Trainers 
    Boots 

El tema que estoy tratando de arreglar es que cuando arrastra una carpeta torno (Esto se maneja en mi clase DragDropManager), no puedo desplazarme hacia arriba o hacia abajo (simplemente muestra un hermoso letrero de alto). Tampoco puedo encontrar un desplazamiento en la vista de árbol, por lo que no estoy seguro de cómo se está generando (Este no es mi propio software, recientemente comencé a trabajar para una empresa, así que no estoy familiarizado con el código y nadie más parece saber.)

Esto es un problema si quiero mover algo desde la parte superior a la parte inferior.

El desplazamiento funciona bien por sí mismo sin que se realice el arrastre.

Si alguien desea ver alguna parte de mi código siéntase libre de preguntar, ya que no estoy seguro de qué mostrarles realmente.

He leído algunos artículos y me acabo de quedar rascándome la cabeza.

Respuesta

17

He creado una propiedad adjunta para lograr este comportamiento, echar un vistazo a mi post aquí -

Attached Behavior for auto scrolling containers while doing Drag & Drop

lógica principal es algo como esto -

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

preguntas similares sobre SO (aunque son en su mayoría para ListBox/ListView pero también deberían funcionar para TreeView) -

WPF Listbox auto scroll while dragging

WPF ListView Databound Drag/Drop Auto Scroll

WPF Drag-to-scroll doesn't work correctly

+0

que he estado tratando de utilizar esto en mi cuadro de lista, pero no funciona si los elementos en el cuadro de lista no pueden ser lanzadas sobre. He mezclado elementos en el cuadro de lista, algunos pueden soltarse, otros no. Si los que están cerca de la parte superior (o inferior) no pueden recibir caídas, el desplazamiento no se activa. ¿Alguna idea sobre una forma de evitarlo? –

+0

@Lutz eso es muy interesante, nunca encontré ese escenario así que no puedo decir mucho. Puedo pensar en 1. Agregue algunos elementos ficticios entre los elementos actuales (con una altura pequeña, etc. para que no parezcan extraños o desperdicien espacio), hágalos desplegables para que siempre se solicite PreviewDragOver. Pero deberá manejar drop, etc. 2. Haga que todos los artículos se puedan quitar y maneje la validación después de soltar. 3. Intente encontrar si se ha disparado algún otro evento para estos elementos que no se pueden quitar. – akjoshi

Cuestiones relacionadas