使用Universal App上的FlipView,ScrollViewer和Manipulation创建“Photo App”

时间:2015-01-07 10:29:41

标签: zoom scrollviewer win-universal-app flipview

我目前正在开发一个像Windows 8.1上的Photo App一样创建应用程序的项目

有些不同:

  • 每个项目并排包含2个图像(我使用网格和2列)

期待行为:

  1. 滑动项目(Grid并排包含2张图片)
  2. 放大特定项目
  3. 缩放时防止滑动
  4. 缩小太多时自动缩放至正常
  5. 曾为:

    1. 将FlipView与DataTemplate一起使用
    2. 使用ScrollViewer包裹网格,将ZoomMode设置为启用
    3. 对于3和4,这是我到目前为止所拥有的 3:

      首先,获取FlipView的ScrollViewer

      MainFlipViewScrollViewer = FindFirstElementInVisualTree<ScrollViewer>(MainFlipView);
      

      然后,让ScrollViewer INSIDE为datatemplate并注册ViewChanged事件

      var flipViewItem = MainFlipView.ItemContainerGenerator.ContainerFromIndex(MainFlipView.SelectedIndex);
      var scrollViewItem = FindFirstElementInVisualTree<ScrollViewer>(flipViewItem);
      scrollViewItem.ViewChanged += scrollViewItem_ViewChanged;
      

      在ViewChanged事件处理程序中,检查ZoomFactor是否大于正常以禁用FlipView的ScrollViewer,并且小于正常值以重置为正常

      void scrollViewItem_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
      {
          float zoomF = ((ScrollViewer)sender).ZoomFactor;
          if (zoomF > 1.0f)
          {
              MainFlipViewScrollViewer.IsEnabled = false;
          }
          else
          {
              ((ScrollViewer)sender).ZoomToFactor(1.0f);
              MainFlipViewScrollViewer.IsEnabled = true;
          }
      }
      

      问题是当我只是缩小一点时,图像不响应触摸(它不会挂起)

      所有这些只影响第一项。当我滑动到下一个项目时,我可以放大,缩小,scrollViewItem_ViewChanged事件不会触发

      PS:FindFirstElementInVisualTree的代码

      private T FindFirstElementInVisualTree<T>(DependencyObject parentElement) where T : DependencyObject
          {
              if (parentElement != null)
              {
                  var count = VisualTreeHelper.GetChildrenCount(parentElement);
                  if (count == 0)
                      return null;
      
                  for (int i = 0; i < count; i++)
                  {
                      var child = VisualTreeHelper.GetChild(parentElement, i);
      
                      if (child != null && child is T)
                          return (T)child;
                      else
                      {
                          var result = FindFirstElementInVisualTree<T>(child);
                          if (result != null)
                          {
                              return result;
                          }
                      }
                  }
              }
              return null;
          }
      

0 个答案:

没有答案