2 つの視覚状態を持つ画像ビューアを作成しています。
A) アプリケーションの基本状態 (visualstate がアクティブでない)
1) 「基本」状態 (visualstate、空のストーリーボード)
2)すべての画像を含む「グリッド」(画像を4分の1サイズにスケーリングするvisualstate)
ジェスチャーで視覚状態を切り替えたい。現在、画像をつまむとこれが行われます。また、ピンチ (OnPinchDelta) したときにピンチ ジェスチャで画像を拡大縮小することも必要です。これは、A) 視覚状態がアクティブでない場合にのみ機能します。視覚状態を起動すると、1) または 2) ピンチが機能しなくなります。それはまだvisualstateの変更を開始しますが、ピンチ中に画像を拡大縮小しません。
視覚状態がアクティブなときに画像スケールを変更するにはどうすればよいですか、またはアクティブな視覚状態を終了して視覚状態/ストーリーボードを実行しないようにするにはどうすればよいですか (後者は不可能だと思います)。
ピンチがピンチ中に画像をスケーリングしなくなった理由は、visualstate と何らかの形で競合するためです。アプリの起動時にすべてが機能しますが、視覚的な状態がアクティブになると機能しなくなります。アプリの起動時にvisualstateを1に設定すると、一度も機能しません。
編集:簡単な例を作成しました。関連する XAML は次のとおりです (残りのコピー ペーストは機能しませんでしたが、それ以外の場合は、ツールキット リファレンスを含む既定の WP ページ テンプレートです)。
<!--LayoutRoot is the root grid where all page content is placed-->
<Grid x:Name="LayoutRoot" Background="Transparent">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="VisualStateGroup">
<VisualState x:Name="Normal"/>
<VisualState x:Name="Grid">
<Storyboard>
<DoubleAnimation Duration="0" To="0.3" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleX)" Storyboard.TargetName="image" d:IsOptimized="True"/>
<DoubleAnimation Duration="0" To="0.3" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleY)" Storyboard.TargetName="image" d:IsOptimized="True"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"/>
<Image x:Name="image" Source="cheetah-picture.jpg" Stretch="Uniform" VerticalAlignment="Top">
<Image.RenderTransform>
<CompositeTransform x:Name="ImageTransformation"/>
</Image.RenderTransform>
<toolkit:GestureService.GestureListener>
<toolkit:GestureListener PinchDelta="OnPinchDelta" PinchCompleted="OnPinchCompleted" />
</toolkit:GestureService.GestureListener>
</Image>
</Grid>
ここに.CSがあります
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
namespace Pincher
{
public partial class MainPage : PhoneApplicationPage
{
public MainPage()
{
InitializeComponent();
}
private void OnPinchDelta(object sender, PinchGestureEventArgs e)
{
ImageTransformation.ScaleX = 1 * e.DistanceRatio;
ImageTransformation.ScaleY = ImageTransformation.ScaleX;
}
private void OnPinchCompleted(object sender, PinchGestureEventArgs e)
{
bool squeezing = (e.DistanceRatio < 1) ? true : false;
if (squeezing == true)
{
VisualStateManager.GoToState(this, "Grid", true);
MessageBox.Show("grid");
}
else
{
VisualStateManager.GoToState(this, "Normal", true);
MessageBox.Show("normal");
}
}
}
}
まとめます。視覚状態の変更はピンチで機能します。ピンチ中に実際に画像をスケーリングすることは、視覚的な状態がアクティブでない場合にのみ機能します。表示状態がアクティブなときにアイテムをスケーリングするにはどうすればよいですか?