Увеличить изображение с помощью ChangeView () — Универсальное приложение для Windows — UWP Win10 — XAML

#c# #.net #xaml #uwp #uwp-xaml

#c# #.net #xaml #uwp #uwp-xaml

Вопрос:

В настоящее время я создаю универсальное приложение для Windows, в котором у меня есть ScrollViewer, содержащий изображение. Цель состоит в том, чтобы увеличить изображение при двойном нажатии на него. Предполагается, что масштабирование должно быть сосредоточено в координатах изображения X / Y с двойным касанием.

XAML

 <ScrollViewer Name="ImageScrollViewer" 
                VerticalScrollBarVisibility="Disabled" 
                VerticalScrollMode="Disabled" 
                HorizontalScrollBarVisibility="Disabled" 
                HorizontalScrollMode="Disabled" 
                ZoomMode="Enabled" 
                MinZoomFactor="1" 
                DoubleTapped="scrollViewer_DoubleTapped"                              
                Grid.Row="1" 
                Grid.Column="3" 
                Grid.ColumnSpan="5" 
                Margin="5,5,5,5" 
                HorizontalAlignment="Center" 
                VerticalAlignment="Center">
                <Image x:Name="MainPageImage" 
                    HorizontalAlignment="Center" 
                    VerticalAlignment="Center" 
                    Stretch="None" 
                    d:IsLocked="False"/>
</ScrollViewer>
  

Код, лежащий в основе

 private void scrollViewer_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
{      
  var doubleTapPoint = e.GetPosition(ImageScrollViewer);

  // zoom in
  if(zoomFactor == 1)
  {
    zoomFactor = 2;
    ImageScrollViewer.ChangeView(doubleTapPoint.X, doubleTapPoint.Y, zoomFactor);        
  }
  // zoom out
  else
  {
    zoomFactor = 1;
    // maxWidth and maxHeight are integer containing the maximum image size
    ImageScrollViewer.ChangeView(maxWidth, MaxHeight, zoomFactor);        
  } 
}
  

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

Есть идеи?

Ответ №1:

Выводится из официального документа,

Заставляет ScrollViewer загружать новый вид в окно просмотра, используя указанные смещения и коэффициент масштабирования.

Первым и вторым параметром ChangeView являются HorizontalOffset, VerticalOffset, которые использовали прокрутку до содержимого x или содержимого y. Но вы установили VerticalScrollBarVisibility и HorizontalScrollBarVisibility отключили. Таким образом, он всегда увеличивает изображение до верхнего левого угла изображения.

Для вашего требования вы могли бы использовать Microsoft.Toolkit.Uwp.UI.Animations прямое масштабирование вашего изображения.

 using Microsoft.Toolkit.Uwp.UI.Animations;
private void scrollViewer_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
{
    var doubleTapPoint = e.GetPosition(ImageScrollViewer);

     // zoom in
    if (zoomFactor == 1)
    {
         zoomFactor = 2;

         MainPageImage.Scale(centerX: (float)doubleTapPoint.X,
                 centerY: (float)doubleTapPoint.Y,
                 scaleX: 2.0f,
                 scaleY: 2.0f,
                 duration: 500, delay: 0).StartAsync();


    }
     // zoom out
     else
    {
         zoomFactor = 1;
         MainPageImage.Scale(centerX: (float)doubleTapPoint.X,
                  centerY: (float)doubleTapPoint.Y,
                  scaleX: 1.0f,
                  scaleY: 1.0f,
                  duration: 500, delay: 0).StartAsync();

    }
}