我正在尝试从使用触发器和主题切换到 VisualStateManager,因为 WindowsRT 似乎正在朝着这个方向发展,我想尽量减少不同的代码量。为此,我正在尝试设置一个简单的方案,该方案将在平板设备(例如 Surface 2)的大边距和桌面方案的正常外观边距之间切换。我知道我可以通过直接在对象上设置属性来做到这一点,但是如果我在一个控件中有 15 个标签,那么创建一个为每个标签设置边距的情节提要根本不支持。所以我试图用这段代码交换每个标签上的样式:
<VisualStateManager.VisualStateGroups>
<VisualStateGroup Name="DeviceStates">
<VisualState Name="Desktop"/>
<VisualState Name="TabletLandscape">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="FirstNameLabel"
Storyboard.TargetProperty="Style">
<DiscreteObjectKeyFrame KeyTime="0"
Value="{StaticResource TabletLabelStyle}"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
我在搜索中看到了几个示例,它们显示了在 Silverlight 和 Windows 应用商店应用程序中工作的几乎相同的模式。当我在普通的 WPF 中尝试这个时,我得到“这个可冻结的文件不能被冻结”。我用 Reflector 挖掘了代码,而 Style 不是从 DependencyObject 派生的,所以我对试图冻结的内容感到困惑。有谁知道这里发生了什么?