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。老实说,如果你想这样做,你应该这样做。出于这个原因,他们包含了所有样板代码。
希望对您有所帮助。