Windows 8 在执行缩放手势时替换ScrollViewer中的图像
我正在创建一个照片查看应用程序,我想实现图片的缩放。我创建了一个ScrollViewer并在那里放置了一个图像。这一切都是开箱即用的。我可以做一个缩放动作,它可以放大图片。现在,我要实现的下一件事是在缩放手势开始时加载高分辨率版本的图片,并在加载位图时在图像控件中动态交换位图。我希望它能够无缝地进行,这样用户就可以继续这个手势,继续放大并看到更详细的图片。 实现这一目标的最佳方法是什么? 这是我目前拥有的代码。我的代码的问题是,当图像源被替换时,我的手势被中断,照片被重置为原始大小。更改ScrollViewer ZoomFactor没有帮助,因为在替换图像时,它似乎会被重置。 我有一个带有图像属性的数据模型,该属性最初返回null,但开始以低分辨率模式从“文件”加载图片,并在加载完成时调用OnPropertyChanged(“图像”)。调用LoadFullImage()加载全分辨率版本,并在完成时调用OnPropertyChanged(“图像”) 以下是DataModel.cs的摘录:Windows 8 在执行缩放手势时替换ScrollViewer中的图像,windows-8,winrt-xaml,windows-store-apps,Windows 8,Winrt Xaml,Windows Store Apps,我正在创建一个照片查看应用程序,我想实现图片的缩放。我创建了一个ScrollViewer并在那里放置了一个图像。这一切都是开箱即用的。我可以做一个缩放动作,它可以放大图片。现在,我要实现的下一件事是在缩放手势开始时加载高分辨率版本的图片,并在加载位图时在图像控件中动态交换位图。我希望它能够无缝地进行,这样用户就可以继续这个手势,继续放大并看到更详细的图片。 实现这一目标的最佳方法是什么? 这是我目前拥有的代码。我的代码的问题是,当图像源被替换时,我的手势被中断,照片被重置为原始大小。更改Scro
public async Task LoadFullImage()
{
loadFullImageTask = UpdateImage(0);
await loadFullImageTask;
}
public ImageSource Image
{
get
{
if (fullImage != null)
{
return fullImage;
}
else if (image != null)
{
return image;
}
else
{
Task loadImageTask = UpdateImage(768);
return null;
}
}
}
public bool FullImageLoading
{
get { return (this.loadFullImageTask != null) && (!this.loadFullImageTask.IsCompleted); }
}
public bool FullImageLoaded
{
get { return this.fullImage != null; }
}
这是我的主页.xaml:
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<ScrollViewer x:Name="imageViewer" HorizontalAlignment="Stretch" HorizontalScrollBarVisibility="Visible" VerticalAlignment="Stretch" MinZoomFactor="1" ZoomMode="Enabled" ViewChanged="imageViewer_ViewChanged">
<Image x:Name="image" Margin="0,0,0,0" Stretch="Uniform" Source="{Binding Image}" />
</ScrollViewer>
</Grid>
正如我已经提到的,这段代码的问题是手势被打断,新图像没有调整大小/滚动到正确的位置,用户体验不是无缝的。
感谢您提供有关如何解决此问题的建议。我不打算为您编写此代码,因为这太多了,但以下是步骤:
MultiScaleImage
控件,您可能希望从该控件中窃取一些逻辑,以便做到最好:
还有一件事。这可以通过DeepZoom轻松完成。由于它在XAML中还不可用,这并不意味着您不能利用WebView来实现这一点。它将为您提供一个预构建的、可疯狂扩展的(免费)解决方案。但选择权在你。有人记得这条线索吗?=)好的,
我已经在上实现了“在缩放过程中替换图像”。
如上所述,如果“内容”的大小发生变化,scrollviewer将重置缩放比例和X/Y偏移量。
为了避免这种情况,我的应用程序xaml使用以下结构:
<FlipView>
<DataTemplate>
<ScrollViewer>
<ViewBox> <-- This size is same with original image width/height. No change during zoom in/out.
<Image/> <-- This size is vary.
</ViewBox>
</ScrollViewer>
</DataTemplate>
</FlipView>
Jerry,我认为当ScrollViewer不支持缩放手势时,需要使用ScaleTransform。目前它只需一张图片就可以完美地工作——我可以非常平滑地放大。另外,我的ScrollViewer包含在FlipView控件中,ScrollViewer和FlipView控件的手势配合得非常好:我可以在需要时翻转图像并放大。你是说在ScrollViewer中无法无缝切换图像吗?
<FlipView>
<DataTemplate>
<ScrollViewer>
<ViewBox> <-- This size is same with original image width/height. No change during zoom in/out.
<Image/> <-- This size is vary.
</ViewBox>
</ScrollViewer>
</DataTemplate>
</FlipView>