Windows 8 在执行缩放手势时替换ScrollViewer中的图像

Windows 8 在执行缩放手势时替换ScrollViewer中的图像,windows-8,winrt-xaml,windows-store-apps,Windows 8,Winrt Xaml,Windows Store Apps,我正在创建一个照片查看应用程序,我想实现图片的缩放。我创建了一个ScrollViewer并在那里放置了一个图像。这一切都是开箱即用的。我可以做一个缩放动作,它可以放大图片。现在,我要实现的下一件事是在缩放手势开始时加载高分辨率版本的图片,并在加载位图时在图像控件中动态交换位图。我希望它能够无缝地进行,这样用户就可以继续这个手势,继续放大并看到更详细的图片。 实现这一目标的最佳方法是什么? 这是我目前拥有的代码。我的代码的问题是,当图像源被替换时,我的手势被中断,照片被重置为原始大小。更改Scro

我正在创建一个照片查看应用程序,我想实现图片的缩放。我创建了一个ScrollViewer并在那里放置了一个图像。这一切都是开箱即用的。我可以做一个缩放动作,它可以放大图片。现在,我要实现的下一件事是在缩放手势开始时加载高分辨率版本的图片,并在加载位图时在图像控件中动态交换位图。我希望它能够无缝地进行,这样用户就可以继续这个手势,继续放大并看到更详细的图片。 实现这一目标的最佳方法是什么? 这是我目前拥有的代码。我的代码的问题是,当图像源被替换时,我的手势被中断,照片被重置为原始大小。更改ScrollViewer ZoomFactor没有帮助,因为在替换图像时,它似乎会被重置。 我有一个带有图像属性的数据模型,该属性最初返回null,但开始以低分辨率模式从“文件”加载图片,并在加载完成时调用OnPropertyChanged(“图像”)。调用LoadFullImage()加载全分辨率版本,并在完成时调用OnPropertyChanged(“图像”)

以下是DataModel.cs的摘录:

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>
正如我已经提到的,这段代码的问题是手势被打断,新图像没有调整大小/滚动到正确的位置,用户体验不是无缝的。
感谢您提供有关如何解决此问题的建议。

我不打算为您编写此代码,因为这太多了,但以下是步骤:

  • 图像需要将ScaleTransform应用于其RenderTransform属性。当用户挤压或拉伸时,您将使用此选项使其“缩放”
  • 使用操纵事件检测按压手势;如果有助于减少一些代码,您甚至可以只过滤到捏手势。这些事件将是最可靠的
  • 操纵事件将返回正在发生的收缩或拉伸程度,这需要与您应用于数字1中图像的ScaleTransform的缩放程度相对应
  • 在“代码隐藏”中,可以创建指向服务器并从服务器加载图像的位图图像。加载后,您可以替换用户正在挤压的图像源。这对用户来说几乎是无缝的,除非高分辨率图像是多兆字节的。不要那样做
  • 请注意,我的步骤不包括ScrollViewer。ScrollViewer当然可以包装图像,但工作本身是作为图像本身的一部分完成的

    我还可以将您指向
    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>