2015-03-06 2 views
5

У меня есть приложение Windows Phone 8.1 с FlipView. Каждый элемент FlipView представляет собой страницу журнала (страница PDF, отображаемая для растрового изображения с некоторым оверлеем).Использование ScrollViewer внутри FlipView

Мне нужно включить щепотку для увеличения для всех страниц. Мой FlipView ItemTemplate выглядит следующим образом

<DataTemplate 
     x:Key="SinglePageTemplate"> 
     <ScrollViewer     
      ZoomMode="Enabled"> 
      <Grid> 
       <ProgressRing 
        HorizontalAlignment="Center" 
        VerticalAlignment="Center" 
        IsActive="{Binding IsRendered, Converter={StaticResource BooleanNegateConverter}}" /> 
       <Image 
        Source="{Binding Bitmap}" 
        VerticalAlignment="Stretch" 
        HorizontalAlignment="Stretch"> 
       </Image> 
      </Grid> 
     </ScrollViewer> 

Проблема заключается в том, что когда я уменьшить страницу и попробуйте переместить его вправо, он всегда «прыгает» обратно влево.

Вот видео, показывающее проблему: https://dl.dropboxusercontent.com/u/73642/fv.avi

Любые идеи, почему и как это исправить?

+0

Я думаю, что я знаю, что здесь происходит. Когда вы полностью уменьшаете масштаб изображения и пытаетесь прокручивать его, вы фактически просматриваете элемент FlipView вместо родительского контейнера. –

+1

У меня была очень похожая проблема на Windows 8.1. Почти такой же сценарий. Я обнаружил, что настройка Horizontal и Vertical ScrollBarVisibility для Auto на ScrollViewer помогла - но тогда, если отображаемая страница PDF больше, чем разрешение экрана (обычно это означает, что для масштабирования для работы ОК), она была слишком большой. Таким образом, я сделал это, чтобы ограничить максимальную ширину сетки до Window.Current.Bounds.Width и максимальной высоты до той же ширины, умноженной на коэффициент масштабирования, исходя из формата страницы вашего журнала. И тогда это сработало. –

+0

Вид выглядит так, как будто он нажимает [snap points] (https://msdn.microsoft.com/library/windows/apps/br209553), вы можете попытаться найти такие свойства, как MandatorySingle или None. –

ответ

0

Внутри вашего ScrollViewer вы должны вручную включить scrollbarvisiblity и режим

<ScrollViewer ZoomMode="Enabled" 
       HorizontalScrollBarVisibility="Visible" 
       VerticalScrollBarVisibility="Visible" 
       HorizontalScrollMode="Enabled" 
       VerticalScrollMode="Enabled"> 
     <Grid> 
      <ProgressRing 
       HorizontalAlignment="Center" 
       VerticalAlignment="Center" 
       IsActive="{Binding IsRendered, Converter={StaticResource BooleanNegateConverter}}" /> 
      <Image 
       Source="{Binding Bitmap}" 
       VerticalAlignment="Stretch" 
       HorizontalAlignment="Stretch"> 
      </Image> 
     </Grid> 
</ScrollViewer> 

Вы также можете дополнительно задать Макс/MinZoomFactor для предотвращения overzoom

0

У меня была такая же проблема. Я решил его, используя прилагаемую поведение и установки HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible"

Ниже приведен код, используемый для прикрепленного поведения

public class PanAndZoomBehavior : Behavior<ScrollViewer> 
    { 
     protected override void OnAttached() 
     { 
      base.OnAttached();    
      Window.Current.SizeChanged += OnSizeChanged; 
      SetElementSize(); 

     } 

     protected override void OnDetaching() 
     { 
      base.OnDetaching();    
      Window.Current.SizeChanged -= OnSizeChanged; 
     } 

     private void OnSizeChanged(object sender, Windows.UI.Core.WindowSizeChangedEventArgs e) 
     { 
      SetElementSize(); 
     } 

     private void SetElementSize() 
     { 
      AssociatedObject.Width = Window.Current.Bounds.Width; 
      AssociatedObject.Height = Window.Current.Bounds.Height; 
      if (AssociatedObject.Content != null) 
      { 
       FrameworkElement element = (FrameworkElement)AssociatedObject.Content; 
       element.Width = Window.Current.Bounds.Width; 
       element.Height = Window.Current.Bounds.Height; 
      } 
     } 

    } 

Применить такое поведение к ScrollViewer