1

我目前正在从事一个创建应用程序的项目,就像 Windows 8.1 上的照片应用程序一样

一些不同的:

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

期待行为:

  1. 滑动浏览项目(网格包含并排的 2 个图像)
  2. 放大特定项目
  3. 缩放时防止滑动
  4. 缩小太多时自动缩放到正常

工作过:

  1. 将 FlipView 与 DataTemplate 一起使用
  2. 用 ScrollViewer 包裹 Grid,设置 ZoomMode 为 Enable

对于 3 和 4,这是我目前拥有的 3:

一、获取FlipView的ScrollViewer

MainFlipViewScrollViewer = FindFirstElementInVisualTree<ScrollViewer>(MainFlipView);

然后,在数据模板中获取 ScrollViewer 并注册 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;
    }
4

0 回答 0