gridview windows-8 windows-runtime winrt-xaml scrollviewer

gridview uwp



ScrollViewer GridView XAML (6)

Actualmente estoy compilando una aplicación Windows 8 XAML C #. En una página, tengo un scrollviewer para desplazamiento horizontal y desplazamiento. Tengo varios controles que funcionan muy bien con scorllviewer. Pero cuando se desplaza y su cursor se encuentra en la parte superior de ListView / GridView, ese control manejará scrollnig en lugar del scrollviewer. Con deslizar, esto no sucede, pero con la rueda de desplazamiento del mouse detiene el scrollvieweing scroll. ¿Alguien sabe cómo desactivar este comportamiento o tener una solución alternativa?


1.Agrega este código en View.cs:

private void ThumbnailViewer_OnMouseWheel(object sender, MouseWheelEventArgs e) { ThumbnailViewerScroller.ScrollToHorizontalOffset(ThumbnailViewerScroller.HorizontalOffset - e.Delta); }

2.add código en Xaml:

<ScrollViewer x:Name="ViewerScroller" MouseWheel="ThumbnailViewer_OnMouseWheel"> <StackPanel> ... </StackPanel> </ScrollViewer>


Después de trabajar con este problema por bastante tiempo, decidí cambiar las tácticas. Al menos en mi solución, cambié el GridView interno para que solo fuera un ItemsControl . De esa manera puedo manejar todo el clic / toque pero aún así dejar que el desplazamiento funcione como se espera.

Por supuesto, esta solución no es para todo el mundo, ya que a veces también necesita todo el material de selección. Pero para mí funcionó ya que solo necesitaba el elemento clic / toque.

Espero eso ayude


Encontré una solución aquí: msdn workaround

Básicamente, tienes que hacer lo siguiente:

Base XAML:

<Grid Name="BaseElement"> <ScrollViewer Name="MainScrollViewer" Style="{StaticResource HorizontalScrollViewerStyle}" VerticalScrollMode="Auto"> <GridView /> <GridView /> </ScrollViewer> </Grid>

  1. Agregue un nuevo controlador al elemento raíz:

    BaseElement.AddHandler(PointerWheelChangedEvent, new PointerEventHandler(Bubble_PointerWheelChanged), true);

  2. Implemente el controlador para administrar el desplazamiento:

    private void Bubble_PointerWheelChanged(object sender, PointerRoutedEventArgs e) { // Could walk up the tree to find the next SV or just have a reference like here: MainScrollViewer.ScrollToHorizontalOffset(MainScrollViewer.HorizontalOffset - e.GetCurrentPoint(null).Properties.MouseWheelDelta); }


Este es un problema que veo, también. No existe en contacto: solo parece ocurrir cuando se usa la rueda del mouse. Aún no sé de una solución alternativa. No creo que haya uno.


La mejor solución de todos.

public class CustomGridView : GridView { protected override void OnApplyTemplate() { base.OnApplyTemplate(); var sv = this.GetTemplateChild("ScrollViewer") as UIElement; if (sv != null) sv.AddHandler(UIElement.PointerWheelChangedEvent, new PointerEventHandler(OnPointerWheelChanged), true); } private void OnPointerWheelChanged(object sender, PointerRoutedEventArgs e) { e.Handled = false; } }

Más información: GridView en ScrollViewer


También tuve el mismo problema. Luego traté de eliminar las barras de desplazamiento de la plantilla de cuadrícula como se menciona en el siguiente hilo ... funcionó bien para mí ...

https://.com/a/10305608/2444509