在可视状态处于活动状态时动态缩放对象

时间:2012-04-19 12:35:34

标签: silverlight windows-phone-7 scale gesture visualstates

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

A)应用程序基础状态(没有可视状态活动)

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

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

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

如果我将视觉状态设置为活动状态,或者如何退出任何活动的可视状态以使任何视觉状态/故事板无法运行(I think the latter is impossible),如何修改图像比例?

捏合不再缩放图像的原因是因为它与视觉状态有某种冲突。在应用程序启动时一切正常,但一旦视觉状态被激活,它就不再有效。如果在应用程序启动时我将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");
        }
    }
}

}

结束。改变视觉状态与捏合有效。实际上,缩放图片时,仅在没有视觉状态处于活动状态时才能进行缩放。如何在视觉状态处于活动状态时缩放项目?

1 个答案:

答案 0 :(得分:0)

我认为你遇到的问题是尝试去基础状态。 base 状态是初始化控件时使用的默认状态,但是一旦VSM(可视状态管理器)进入另一个状态,您就不再处于 base 状态,并且可以回去吧。

在您的情况下,您应该具有网格状态和正常之类的内容。并在这两个州之间切换。

此外,如果您在WP7状态下使用默认按钮样式,您会注意到它有正常 MousOver 按下和已禁用状态。当用户没有对按钮做任何事情(并且没有禁用)时,它会进入正常状态,不进入BASE