Storyboard.TargetProperty = “风格”

时间:2014-04-03 02:02:06

标签: wpf styles visualstatemanager freezable

我正在尝试从使用触发器和主题切换到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派生的,所以我对于试图被冻结的内容感到困惑。有没有人知道这里发生了什么?

1 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,发现了其他一些问题,无论是答案还是没有好的答案。我的样式仅更改了基本属性,如字体大小和颜色,没有任何&#34; freezables&#34;在现场。它是WPF中的一个奇怪的错误,恕我直言。

经过一些试验和错误之后,我似乎已经通过简单地将我们的资源定义( StaticResource 指向)从用户控件中移动到外部资源来实现它的工作字典,然后我包含在App.xaml中。此外,导致此问题的用户控件是在自定义控件项目中定义的,所以基本上我从控件项目中删除了 Style 资源并将它们放入我的.exe项目中,控件没有问题解决在运行时。 (请注意,可以安全地忽略设计器错误。)

我不确定是将资源移出用户控件还是移出项目,或两者都解决了我的问题。