7

我在 Expression Blend 中定义了以下两种状态。我一直在尝试遵循指南,但当我需要有关如何以及何时更改状态的信息时,我觉得它让我束手无策。

在此处输入图像描述

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

看来我可以将 a 附加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;
        }
    }

编辑2:尝试上述操作时,似乎 GotoElementState 返回 false,并且根据 MSDN:“如果控件成功转换到新状态,则返回 true;否则返回 false。”

现在我有一个问题:什么会导致我的状态转换失败?

4

2 回答 2

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

于 2012-10-18T10:12:40.867 回答
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;
        }
    }
于 2012-10-18T12:16:22.967 回答