我目前正在从事一个创建应用程序的项目,就像 Windows 8.1 上的照片应用程序一样
一些不同的:
- 每个项目包含 2 个并排的图像(我使用 2 列的网格)
期待行为:
- 滑动浏览项目(网格包含并排的 2 个图像)
- 放大特定项目
- 缩放时防止滑动
- 缩小太多时自动缩放到正常
工作过:
- 将 FlipView 与 DataTemplate 一起使用
- 用 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;
}