Убрать эффект сжатия у ScrollViewer

Рейтинг: 3Ответов: 1Опубликовано: 09.04.2015

Пишу под Windows Phone 8.1 (Universal app) и хочу избавиться от эффекта сжатия при использовании ScrollViewera. Например, находясь у края контента, потянуть в противоположную сторону, то весь контент "сожмется" обозначая недоступную область (см. пример).

Находясь в начале списка тянем вниз

Для чего это нужно?

Хочу создать страницу с механикой стартового экрана Windows Phone

введите описание изображения здесь

Что я сделал?

Создал ScrollViewer, добавил ограничивающие элементы в начало и конец содержимого, запретил скроллинг выходящий за границы необходимой области в обработчике события scrollViewer_ViewChanging(object sender, ScrollViewerViewChangingEventArgs e).

.xaml

<Grid Name="root">
    <ScrollViewer x:Name="scrollViewer" HorizontalScrollBarVisibility="Hidden"  
                                    HorizontalScrollMode="Enabled"   
                                    HorizontalContentAlignment="Left" 
                                    HorizontalSnapPointsType="MandatorySingle"  
                                    ViewChanging="scrollViewer_ViewChanging">
         <StackPanel Name="panel" Orientation="Horizontal" HorizontalAlignment="Left">
              <Border x:Name="leftSide" Background="Red" Width="{Binding ElementName=root, Path=ActualWidth}"  />
              <Border x:Name="menuBorder" Background="White" Width="{Binding ElementName=root, Path=ActualWidth}"  />
              <Border x:Name="contentBorder" Background="Bisque" Width="{Binding ElementName=root, Path=ActualWidth}"  />
              <Border x:Name="rightSide" Background="Red" Width="{Binding ElementName=root, Path=ActualWidth}"  />
         </StackPanel>
   </ScrollViewer >
</Grid>  

.cs

private void МainЗage_Loaded( object sender, RoutedEventArgs e)
{
    scrollViewer.ChangeView(leftSide.Width,0,1);
}
private void scrollViewer_ViewChanging(object sender, ScrollViewerViewChangingEventArgs e)
{
    if (e.NextView.HorizontalOffset <= leftSide.Width)
    {
        scrollViewer.CancelDirectManipulations();
        //scrollViewer.ChangeView(leftSide.Width,0,1,true); 
    } 
    else if (e.NextView.HorizontalOffset >= leftSide.Width + menuBorder.Width + contentBorder.Width)
    {
        scrollViewer.CancelDirectManipulations();
        //scrollViewer.ChangeView(eftSide.Width + menuBorder.Width + contentBorder.Width,0,1,true); 
    }
}

Такой код работает, но проскакивают артефакты в виде скачков содержимого, пробовал и закомментированный код, такой же эффект. Расскажите как исправить мой вариант или подскажите другой подход.

Ответы

▲ 1

Отнаследуйтесь от контрола, в котором происходит "отпрыгивание" и переопределите метод UIElement.OnManipulationBoundaryFeedback:

protected override void OnManipulationBoundaryFeedback(ManipulationBoundaryFeedbackEventArgs e)
{
    e.Handled = true;
}

См. UIElement.OnManipulationBoundaryFeedback.

P.S. Не воюйте с системой. Пользователи ожидают отпрыгивание, они привыкли к нему и понимают его. Представьте, что при потягивании списка вниз он будет скроллиться вверх — вот вы делаете примерно то же самое.