【问题标题】:Dynamically scaling objects when visual state is active视觉状态处于活动状态时动态缩放对象
【发布时间】:2012-04-19 12:35:33
【问题描述】:

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

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

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

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

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

当我的视觉状态处于活动状态时如何修改图像比例,或者如何退出任何活动的视觉状态以不运行任何视觉状态/故事板 (I think the latter is impossible)?

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

}

结束。更改视觉状态适用于捏合。实际上,仅在没有视觉状态处于活动状态时才在捏合时缩放图片。如何在视觉状态处于活动状态时缩放项目?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我显然有实际的基本状态(没有 VSM)。然后是 1)GRID 状态和 2)“BASE”状态。如果需要,您可以将后者 2) 称为“NORMAL”,但这只是关于名称的语义。那个状态是空的。问题是,一旦我运行任何视觉状态,我就无法再缩放受状态影响的图像。图像在视觉状态运行时根本不会缩放,并且由于您无法退出视觉状态,因此我无法再缩放它,除非您以某种方式可以针对处于某种视觉状态的对象的缩放 - 这可能吗?跨度>
    • 您能否发布您的 XAML(尤其是 VSM 位)。
    • 我编辑了我的原始帖子。它现在包括一个简化的示例。出于某种原因,我无法复制粘贴完整的 XAML,但没有包含的只是默认的 WP 页面模板。
    • 我做了更多的调试。如果您只用视觉状态/情节提要触摸比例尺,即使您回到“正常”状态(这是一个空情节提要),捏合时的缩放也不起作用......
    最近更新 更多