WPF从DynamicResource到StaticResource

时间:2011-03-31 21:24:56

标签: wpf dynamicresource staticresource

我曾经在WPF项目上工作了一段时间,但现在还没有在2个月内触及它。 现在我又重新开始了,我遇到了以下问题:

我使用合并的词典来创建皮肤,并在运行时轻松交换它们。 但是,每个皮肤在运行时都不会更改。虽然我在这方面很无趣,但我只是遵循了一堆教程,我到处都使用DynamicResource,甚至不知道我是否应该使用StaticResource。

结果是当我尝试使用Windows XP将我的应用程序发送给朋友时(我使用七个)。 Luna主题被扔在我的应用程序上,使设计变得丑陋...... 据我所知,它来自DynamicResource。

所以现在,我想更改为StaticResource,我只是尝试用“StaticResource”替换每个“DynamicResource”。它抛出了我的异常:

Message = "'La valeur fournie sur 'System.Windows.StaticResourceExtension' a levé une exception.' numéro de ligne '8' et position de ligne '230'."

In english, it means: Message = "'The value given to 'System.Windows.StaticResourceExtension' threw an exception.' line number '8' and position on the line '230'.

然后我放了一个try / catch块来更好地了解问题:

{"Impossible de trouver la ressource nommée'styleBackground'. Les noms de ressources respectent la casse."}

英文:Impossible to find the resource named 'styleBackground'. The resource names are case sensitive.

这是一个TabItem。

这里有两个问题: 我是否通过将DynamicResource更改为StaticResource来做正确的事情? 如果是这样,我需要做什么?

谢谢,

FB。

编辑:程序在最后一行中得到错误:

<Window x:Class="Sc2ReplayMonkey.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
        xmlns:local="clr-namespace:Sc2ReplayMonkey" ResizeMode="CanResize"
        Title="Starcraft II Replay Monkey"
        Width="991" Icon="Resources\Icons\SC2_Replay_Monkey.png"
        WindowStartupLocation="CenterScreen" mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" d:DesignHeight="1024" Height="774" Visibility="Visible" Foreground="#00000000" Margin="0">

2 个答案:

答案 0 :(得分:0)

你认为问题来自DynamicResource是什么?

据我所知,DynamiResource与StaticResource相反,仅用于在运行时获取资源,而不是在编译时获取资源。 DynamicResource在您必须在声明资源之前引用资源时非常有用(如果使用StaticResource,则会引发编译错误)。

<ResourceDictionary><DataTemplate>... <Rectangle Fill={DynamicResource MyBrush}></Rectangle>  ...</DataTemplate> <SolidColorBrush x:Key="MyBrush"></SolidColorBrush> <ResourceDictionary>

在这种情况下,使用StaticResource而不是DynamicResource会引发编译错误。

现在,关于您的问题,如果您没有明确地将样式分配给您的控件,WPF将从您当前的操作系统主题,XP主题中选择默认样式。要解决这个问题,您可以选择Win 7主题,然后将其与您的应用程序嵌入。

这为你增加了很多工作,但这是重新定义所有控件样式的唯一方法,这样它就能保留这些样式,无论它执行的操作系统如何。

HTH

Riana

答案 1 :(得分:0)

解决方案是在启动时加载所有资源,而不是从没有外观(使用动态资源)开始,并让用户在运行时选择外观。