私は現在、Windows 8.1 の Photo App のようなアプリを作成するプロジェクトに取り組んでいます。
いくつかの異なる:
- 各アイテムには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 イベント ハンドラーで、FlipView の ScrollViewer を無効にするために ZoomFactor が通常より大きいかどうか、および通常にリセットするために通常よりも小さいかどうかを確認します。
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;
}