1

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

4

1 回答 1

1

我遇到了类似的问题,并发现了其他一些类似的问题,要么没有答案,要么没有好的答案。我的样式仅更改了基本属性,例如字体大小和颜色,站点中没有任何“可冻结”。这是WPF中的一个奇怪的错误,恕我直言。

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

我不确定是将资源移出用户控制还是移出项目,或两者兼而有之,这为我解决了问题。

于 2014-08-23T05:52:38.613 回答