1

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");
        }
    }
}

}

まとめます。視覚状態の変更はピンチで機能します。ピンチ中に実際に画像をスケーリングすることは、視覚的な状態がアクティブでない場合にのみ機能します。表示状態がアクティブなときにアイテムをスケーリングするにはどうすればよいですか?

4

1 に答える 1

0

あなたが抱えている問題は、ベース状態に移行しようとしていることによるものだと思います。基本状態は、制御が初期化されるときに使用されるデフォルトの状態ですが、VSM(Visual State Manager)が別の状態になると、基本状態ではなくなり、元に戻すことはできません。

あなたの場合、グリッド状態や通常のようなものが必要です。そして、これら2つの状態を切り替えます。

また、WP7状態のデフォルトのボタンスタイルのようなものに移動すると、デフォルトの遷移グループにNormalMousOverPressedDisabledの状態があることに気付くでしょう。そして、ユーザーがボタンで何もしていないとき(そしてそれが無効になっていないとき)、それはBASEではなく通常の状態になります!

于 2012-04-21T21:38:49.117 に答える