关于 c#:如何在嵌套元素上设置视觉状态?

How to set a visual state on a nested element?

我正在尝试使用 VisualStateManager 为属性设置值。问题是我需要在嵌套元素(称为 variableSizedWrapGrid)上设置此值,但它不响应相应的状态。这个想法是当用户改变平板电脑的方向(横向到纵向)并且应该改变这个元素的方向。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<GroupStyle.Panel>
    <ItemsPanelTemplate>
        <VariableSizedWrapGrid x:Name="variableSizedWrapGrid" Orientation="Vertical" Background="Blue" Width="660" ItemHeight="120" ItemWidth="220" Margin="0,0,80,0">

            <VisualStateManager.VisualStateGroups>
                <VisualStateGroup>
                    <VisualState x:Name="FullScreenPortrait">
                        <Storyboard>
                            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Orientation)">
                                <DiscreteObjectKeyFrame KeyTime="0" Value="Horizontal" />
                            </ObjectAnimationUsingKeyFrames>
                        </Storyboard>
                    </VisualState>
                </VisualStateGroup>
            </VisualStateManager.VisualStateGroups>

        </VariableSizedWrapGrid>

    </ItemsPanelTemplate>
</GroupStyle.Panel>

我正在为 Windows 8 开发一个 Windows Metro 应用程序。


我相信这就是 LayoutAwarePage 的用途。如果您有一个 LayoutAwarePage 作为基类,并且您希望控件在旋转数位板时切换 VisualStates,则将控件的 Loaded 事件挂钩到 LayoutAwarePage 上的 StartLayoutUpdates 方法。

如您所见,每当状态发生变化时,它都会运行"InvalidateVisualState",它将遍历所有接收 LayoutUpdates 的控件,并手动将其 VisualStateManager 设置为适当的状态。

因此,在您拥有的代码中,您需要为景观设置一个 VisualState——我相信它会被称为 FullScreenLandscape,但我不记得了——然后将 StartLayoutUpdates 添加到 VariableSizedWrapGrid 控件的 Loaded 事件中。这是假设您的页面是 LayoutAwarePage。老实说,如果你想这样做,你应该这样做。出于这个原因,他们包含了所有样板代码。

希望对您有所帮助。