如何在WP7中更改VisualState

时间:2012-10-17 11:34:30

标签: c# windows-phone-7 visualstatemanager

我在Expression Blend中定义了以下两种状态。我一直在努力关注this指南,但当我需要有关如何以及何时改变状态的信息时,我觉得这让我感到不知所措。

enter image description here

根据指南,我要将行为(我假设为“GotoState”)附加到我的UserControl - 不幸的是我认为我实际上没有User Control - 即使我这样做了,我是否必须将行为附加到我的PortraitStateLandscapeState

我似乎可以将GotoState附加到我的LayoutRoot元素。那么我是否将这种行为与两种状态中的行为联系起来?任何帮助将不胜感激。

*编辑:我正在我的xaml.cs文件中玩,并认为这可能是以编程方式执行此操作的方法。调试和更改方向时,我进入开关盒并找到正确的方向。然而,国家从未切换过。我做错了什么?

    protected override void OnOrientationChanged(OrientationChangedEventArgs e)
    {
        switch (e.Orientation)
        {
            case PageOrientation.Landscape:
                ExtendedVisualStateManager.GoToElementState(root:this.LayoutRoot, stateName: "LandscapeState", useTransitions: true);
                break;
            case PageOrientation.LandscapeRight:
                ExtendedVisualStateManager.GoToElementState(root:this.LayoutRoot, stateName: "LandscapeState", useTransitions: true);
                break;
            case PageOrientation.LandscapeLeft:
                ExtendedVisualStateManager.GoToElementState(root:LayoutRoot, stateName: "LandscapeState", useTransitions: true);
                break;
            case PageOrientation.Portrait:
                ExtendedVisualStateManager.GoToElementState(root:this.LayoutRoot, stateName: "PortraitState", useTransitions: true);
                break;
            case PageOrientation.PortraitUp:
                ExtendedVisualStateManager.GoToElementState(root:this.LayoutRoot, stateName: "PortraitState", useTransitions: true);
                break;
            case PageOrientation.PortraitDown:
                ExtendedVisualStateManager.GoToElementState(root:this.LayoutRoot, stateName: "PortraitState", useTransitions: true);
                break;
            default:
                break;
        }
    }

edit2:尝试上述时看起来GotoElementState返回false,并且根据MSDN:“如果控件成功转换到新状态,则返回true;否则返回false。”

现在我留下了一个问题:什么可能导致我的状态转换失败?

2 个答案:

答案 0 :(得分:1)

更改WP7中的VisualState,如下所示:

    switch (e.Orientation)
    {
        case PageOrientation.Landscape:

           VisualStateManager.GoToState(this, "LandscapeState", true);

            break;

        case PageOrientation.Portrait:

            VisualStateManager.GoToElementState(this,"PortraitState", true);

            break;

       default:

            break;
    }

答案 1 :(得分:1)

通过执行以下操作,我设法找到了解决我自己问题的方法。

事实证明,使用ExtendedVisualStateManager.GotoElementState(UIElement,String,bool)目前效果不佳,所以我不得不找到一种方法来使用VisualStateManager.GotoState。

我通过简单地将LayoutRoot包装在UserControl中解决了我的问题:

<UserControl x:Name="userControl">
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <VisualStateManager.VisualStateGroups>
    ...
</UserControl>

切换状态现在只是我最初尝试调用VisualStateManager.GotoState的问题。

    protected override void OnOrientationChanged(OrientationChangedEventArgs e)
    {
        base.OnOrientationChanged(e);

        switch (e.Orientation)
        {
            case PageOrientation.Landscape:
            case PageOrientation.LandscapeRight:
            case PageOrientation.LandscapeLeft:
                VisualStateManager.GoToState(control: userControl,
                                                        stateName: "LandscapeState", 
                                                        useTransitions: true);
                break;
            case PageOrientation.Portrait:
            case PageOrientation.PortraitUp:
            case PageOrientation.PortraitDown:
                VisualStateManager.GoToState(control: userControl,
                                                        stateName: "PortraitState", 
                                                        useTransitions: true);
                break;
            default:
                VisualStateManager.GoToState(control: userControl,
                                    stateName: "PortraitState",
                                    useTransitions: true);
                break;
        }
    }