I need to show images (using Flip View controll) and allow users to zoom them (with pinch zoom and with double tap) and drag zoomed image.
I would like it to be compatible with Flip View (I mean it shouldn't ovveride draging gesture).
What is the best way to achieve that?
I need to show images (using Flip View controll) and allow users to zoom them (with pinch zoom and with double tap) and drag zoomed image.
We can use the ScrollViewer
control and UIElement.DoubleTapped
event to allow users to zoom the images (with pinch zoom and with double tap) and drag zoomed image.
In order to zoom the image with pinch zoom and drag zoomed image. We can put the Image
into the ScrollViewer
.
We can add UIElement.DoubleTapped
event in the ScrollViewer
to zoom the image with double tap.
For example:
In XAML:
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<FlipView Name="MyFlipView">
<FlipView.ItemTemplate>
<DataTemplate x:DataType="local:MyImage">
<ScrollViewer MinZoomFactor="1" DoubleTapped="scrollViewer_DoubleTapped"
ZoomMode="Enabled">
<Image Source="{Binding Path}" />
</ScrollViewer>
</DataTemplate>
</FlipView.ItemTemplate>
</FlipView>
</Grid>
In code behind:
public ObservableCollection<MyImage> MyImages;
public MainPage()
{
this.InitializeComponent();
MyImages = new ObservableCollection<MyImage>();
MyImages.Add(new MyImage("ms-appx:///Assets/cliff.jpg"));
MyImages.Add(new MyImage("ms-appx:///Assets/grapes.jpg"));
MyImages.Add(new MyImage("ms-appx:///Assets/rainer.jpg"));
MyImages.Add(new MyImage("ms-appx:///Assets/sunset.jpg"));
MyImages.Add(new MyImage("ms-appx:///Assets/valley.jpg"));
MyFlipView.ItemsSource = MyImages;
}
private async void scrollViewer_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
{
var scrollViewer = sender as ScrollViewer;
var doubleTapPoint = e.GetPosition(scrollViewer);
if (scrollViewer.ZoomFactor != 1)
{
scrollViewer.ZoomToFactor(1);
}
else if (scrollViewer.ZoomFactor == 1)
{
scrollViewer.ZoomToFactor(2);
var dispatcher = Window.Current.CoreWindow.Dispatcher;
await dispatcher.RunAsync(CoreDispatcherPriority.High, () =>
{
scrollViewer.ScrollToHorizontalOffset(doubleTapPoint.X);
scrollViewer.ScrollToVerticalOffset(doubleTapPoint.Y);
});
}
}
And the MyImage Class code:
public class MyImage
{
public MyImage()
{
}
public MyImage(string uri)
{
this.Path = uri;
}
public string Path { get; set; }
}
来源:https://stackoverflow.com/questions/37380661/uwp-zooming-image-with-pinch-zoom-and-double-tap-with-flip-view