2012-08-17 16 views
5

Attualmente sto creando un'applicazione XAML C# per Windows 8. In una pagina ho un scrollviewer per lo scorrimento orizzontale e lo scorrimento. Ho diversi controlli in esso che funzionano molto bene con lo spettatore. Ma quando si scorre e il cursore si trova in cima a ListView/GridView, quel controllo gestirà scrollnig invece di scrollviewer. Con lo scorrimento non si verifica ciò, ma con la rotellina del mouse si interrompe lo scroll scrolling. Qualcuno sa come disabilitare questo comportamento o avere una soluzione alternativa?ScrollViewer GridView XAML

risposta

0

Questo è un problema che vedo anch'io. Non esiste in contatto: sembra che si verifichi solo quando si utilizza la rotellina del mouse. Non so ancora una soluzione. Non penso che ce ne sia uno.

1

Dopo aver lavorato con questo problema per un po 'ho deciso di cambiare tattica. Almeno nella mia soluzione ho cambiato l'interno GridView per essere solo un ItemsControl. In questo modo posso gestire tutti i clic/tap, ma lasciare che lo scroll funzioni come previsto.

Ovviamente questa soluzione non è per tutti come a volte è necessario anche tutto il materiale di selezione. Ma per me ha funzionato in quanto avevo solo bisogno dell'elemento click/tap.

Speranza che aiuta

0

ho trovato una soluzione qui: msdn workaround

Fondamentalmente si deve effettuare le seguenti operazioni:

XAML Base:

<Grid Name="BaseElement"> 
     <ScrollViewer Name="MainScrollViewer" Style="{StaticResource HorizontalScrollViewerStyle}" VerticalScrollMode="Auto"> 
      <GridView /> 
      <GridView /> 
     </ScrollViewer> 
    </Grid> 
  1. Aggiungi un nuovo Gestore dell'elemento principale:

    BaseElement.AddHandler(PointerWheelChangedEvent, new PointerEventHandler(Bubble_PointerWheelChanged), true); 
    
  2. Implementare il gestore a handel lo scorrimento:

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

migliore soluzione in assoluto.

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

Maggiori informazioni: GridView in a ScrollViewer

0

1.Add questo codice in View.cs:

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

codice 2.Add in XAML:

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