2013-05-31 14 views
5

Quando utilizzo lo scrollviewer in una listbox, tutta la finestra viene rimbalzata quando raggiungo la fine della listbox tramite toccare lo scorrimento. Questo comportamento non viene visualizzato quando utilizzo la rotellina del mouse. Come posso disabilitare questo effetto di overscrolling/rubber-band-effect/snap-back-effect/bouncing.xaml Scrollviewer - Disabilita Overscrolling/effetto elastico/effetto snapback/rimbalzo dell'intera finestra

Sto lavorando con .NET Framework 4.5 su un computer Windows 8.

Si può vedere l'effetto rimbalzo su questo video: http://www.vidup.de/v/gQ2pI/

Ecco il mio codice di esempio:

<Window x:Class="style_test_for_scrollviewer.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 

    <Grid> 
     <ListBox Width="200"> 
      <WrapPanel Width="200"  ScrollViewer.PanningMode="VerticalOnly"   ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Visible"> 
       <Button Height="200" Width="200"></Button> 
       <Button Height="200" Width="200"></Button> 
       <Button Height="200" Width="200"></Button> 
       <Button Height="200" Width="200"></Button> 
       <Button Height="200" Width="200"></Button> 
       <Button Height="200" Width="200"></Button> 
       <Button Height="200" Width="200"></Button> 
       <Button Height="200" Width="200"></Button> 
       <Button Height="200" Width="200"></Button> 
       <Button Height="200" Width="200"></Button> 
       <Button Height="200" Width="200"></Button> 
       <Button Height="200" Width="200"></Button> 
     </WrapPanel> 
     </ListBox> 
    </Grid> 
</Window> 

risposta

4

È possibile rimuovere questo comportamento sovrascrivendo il metodo OnManipulationBoundaryFeedback:

public class FixedListBox : ListBox 
{ 
    protected override void OnManipulationBoundaryFeedback(ManipulationBoundaryFeedbackEventArgs e) 
    { 
     e.Handled = true; 
    } 
} 

Un'altra soluzione è aggiungere il seguente gestore all'evento ManipulationBoundaryFeedback (direttamente sul ListBox o tramite uno stile):

<ListBox ManipulationBoundaryFeedback="OnManipulationBoundaryFeedback"/> 

Oppure:

<Style TargetType="{x:Type ListBox}"> 
    <EventSetter Event="ManipulationBoundaryFeedback" Handler="OnManipulationBoundaryFeedback"/> 
</Style> 

Con il seguente codice dietro:

protected void OnManipulationBoundaryFeedback(object sender, ManipulationBoundaryFeedbackEventArgs e) 
{ 
    e.Handled = true; 
} 

Tali metodi funziona con la ScrollViewer troppo.

Problemi correlati