从DynamicResource到StaticResource的WPF

从DynamicResource到StaticResource的WPF,wpf,dynamicresource,staticresource,Wpf,Dynamicresource,Staticresource,我已经在一个WPF项目上工作了一段时间,但现在已经两个月没有接触过它了。 现在我又回来了,我有以下问题: 我使用合并的字典来创建皮肤,并在运行时轻松地交换它们。 但是,每个外观在运行时都不会更改。但当我对此一无所知的时候,我只是遵循了一系列教程,我到处都使用DynamicSource,甚至不知道是否应该使用StaticResource <ResourceDictionary><DataTemplate>... <Rectangle Fill={DynamicReso

我已经在一个WPF项目上工作了一段时间,但现在已经两个月没有接触过它了。 现在我又回来了,我有以下问题:

我使用合并的字典来创建皮肤,并在运行时轻松地交换它们。 但是,每个外观在运行时都不会更改。但当我对此一无所知的时候,我只是遵循了一系列教程,我到处都使用DynamicSource,甚至不知道是否应该使用StaticResource

<ResourceDictionary><DataTemplate>... <Rectangle Fill={DynamicResource MyBrush}></Rectangle>  ...</DataTemplate> <SolidColorBrush x:Key="MyBrush"></SolidColorBrush> <ResourceDictionary>
结果是,当我尝试使用windows XP将我的应用程序发送给朋友时(我使用了七个)。Luna主题被抛到我的应用程序上,使设计变得丑陋。。。 据我所知,它来自DynamicSource

<ResourceDictionary><DataTemplate>... <Rectangle Fill={DynamicResource MyBrush}></Rectangle>  ...</DataTemplate> <SolidColorBrush x:Key="MyBrush"></SolidColorBrush> <ResourceDictionary>
现在,我想改为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."}
在英语中:
无法找到名为“styleBackground”的资源。资源名称区分大小写。

这是关于一个项目的

这里有两个问题: 将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">

你怎么会认为问题来自DynamicSource

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

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

现在,关于您的问题,如果您没有显式地为控件指定样式,WPF将从当前操作系统主题中选择默认样式,在您的例子中是XP主题。要解决这个问题,你可以选择Win7主题,然后将其嵌入到你的应用程序中

这为您增加了很多工作,但这是重新定义所有控件样式的唯一方法,这样无论在哪个操作系统上执行,它都会保留这些样式


Riana

解决方案是在启动时加载所有ResourceDictionary,而不是在没有皮肤的情况下启动(使用动态资源),并让用户在运行时选择皮肤。

WPF不擅长输出错误。如果使用Visual Studio,请尝试显示输出窗口。它应该会给你更多关于这个问题的信息。我很惊讶它帮不了我多少忙,它输出:
'Sc2ReplayMonkey.vshost.exe'(托管(v4.0.30319)):加载了'C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib'Sc2ReplayMonkey.vshost.exe'(托管(v4.0.30319)):加载的'C:\Windows\Microsoft.Net\assembly\GAC\U MSIL\System.Xaml.resources\v4.0\u 4.0.0\u fr\uB77A5C561934E089\System.Xaml.resources.dll''Sc2ReplayMonkey.vshost.exe'(托管(v4.0.30319)):加载的'C:\Windows\Microsoft.Net\assembly\GAC\u MSIL\mscorlib.resources\v4.0\u 4.0.0.0\u fr\fr\uB77A561934E089\mscorlib.resources.dll'
,切换到StaticResource时,应用程序需要在启动时加载所有资源,而我只加载基本字典,没有皮肤。请将您的解决方案作为答案发布,以便其他用户可以受益:)解决方案是在启动时加载基本资源字典+皮肤资源字典。基本上,如果使用staticresource,则需要始终加载每个x:key中的一个。