我正在尝试从使用触发器和主题切换到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中尝试这个时,我得到了#34;这个freezable不能被冻结&#34;。我使用Reflector挖掘代码并且Style不是从DependencyObject派生的,所以我对于试图被冻结的内容感到困惑。有没有人知道这里发生了什么?
答案 0 :(得分:1)
我遇到了类似的问题,发现了其他一些问题,无论是答案还是没有好的答案。我的样式仅更改了基本属性,如字体大小和颜色,没有任何&#34; freezables&#34;在现场。它是WPF中的一个奇怪的错误,恕我直言。
经过一些试验和错误之后,我似乎已经通过简单地将我们的资源定义( StaticResource 指向)从用户控件中移动到外部资源来实现它的工作字典,然后我包含在App.xaml中。此外,导致此问题的用户控件是在自定义控件项目中定义的,所以基本上我从控件项目中删除了 Style 资源并将它们放入我的.exe项目中,控件没有问题解决在运行时。 (请注意,可以安全地忽略设计器错误。)
我不确定是将资源移出用户控件还是移出项目,或两者都解决了我的问题。