1

我正在构建一个具有两种视觉状态的图片查看器。

A) 应用程序基础状态(没有激活的视觉状态)

1)“基础”状态(视觉状态,空故事板)

2)所有图像的“网格”(将图像缩放到四分之一大小的视觉状态)

我想用手势在视觉状态之间切换。目前捏合图像可以做到这一点。当我捏(OnPinchDelta)时,我还希望捏手势来缩放图像。这仅适用于 A) 没有激活的视觉状态。一旦我启动视觉状态 1) 或 2) 捏不再起作用。它仍然会启动视觉状态更改,但不会捏合时缩放图像。

当我的视觉状态处于活动状态时如何修改图像比例,或者如何退出任何活动的视觉状态以不运行任何视觉状态/故事板(我认为后者是不可能的)?

捏合时不再缩放图像的原因是因为它与视觉状态有某种冲突。在应用程序启动时,一切正常,但一旦视觉状态被激活,它就不再工作了。如果在应用程序启动中我将视觉状态设置为 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(视觉状态管理器)进入不同的状态,您就不再处于基本状态并且无法返回到它。

在你的情况下,你应该有类似grid state 和normal的东西。并在这两种状态之间切换。

此外,如果您在 WP7 状态下使用默认按钮样式,您会注意到它在默认转换组中具有NormalMousOverPressedDisabled状态。当用户没有对按钮做任何事情(并且它没有被禁用)时,它会进入Normal状态,而不是 BASE

于 2012-04-21T21:38:49.117 回答