资源“x”无法解析。

12
我最近升级到了VS 2012,因为我需要开始使用.NET 4.5,但这并不是重点。我的问题如下:
在我的主项目中有一个名为AppStyles.xaml的ResourceDictionary,在App.Xaml中我有以下内容:
<ResourceDictionary>
  <ResourceDictionary.MergedDictionaries>
     <ResourceDictionary Source="AppStyles.xaml"/>
  <ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

在我的ResourceDictionary中有一个样式,我可以通过设置Style={StaticResource MyButton}将此样式应用于任何项目中的任何按钮。
升级到VS 2012后,我注意到我经常会遇到标题中的错误,有时它会阻止我进行调试,有时则不会!
我应该采取不同的方法吗?还是VS 2012存在问题?

你的意思是在设计时出现了找不到某些东西的问题吗?但是你可以编译并且它能正常运行,对吧? - Meirion Hughes
我在设计时遇到了资源未找到的错误。但有时我可以运行,甚至正确地显示按钮!但是其他时候它会阻止调试。 - Chrisjan Lodewyks
你有AppStyles.xaml的代码后台吗?我有过一次,那个问题会导致VS在设计时无法加载。另一个问题可能是将AppStyles.xaml包含为资源,在编译时可以工作,但在设计时不行。它应该是一个“页面”。 - Wouter
7个回答

16

WPF 无法解析您尝试合并的资源字典。当您创建合并的字典时,WPF 遵循一组规则来尝试解析 URI。在您的情况下,URI 是不明确的,因此 WPF 无法可靠地解析它。

App.xaml 中的 Source URI 更改为绝对 pack URI。例如,如果您的项目名为 MyProject(即“MyProject”是短程序集名称),则应将App.xaml 中的 Source 更改为:

   <ResourceDictionary 
      Source="/MyProject;component/AppStyles.xaml"/>

假设AppStyles.xaml位于MyProject的根目录中。您可以选择指定已签名程序集的授权、程序集版本和公钥信息。然而,在上面的示例中,短的程序集名称(MyProject)应该是安全的。

有关WPF中Pack URI的详细信息,请参见MSDN上的此页面:http://msdn.microsoft.com/en-us/library/aa970069(v=vs.110).aspx


6

我也时常在VS2010中遇到这个问题。有时,如果我执行"清理解决方案(Clean Solution)"和"重新生成解决方案(Rebuild Solution)"操作,问题就会得到解决。如果这些方法不奏效,我通常会重启VS2010。

我曾经将样式(x:Key)的名称更改为其他内容,这个问题就消失了。但是我认为这个解决方案并不完美...

<Application.Resources>
<ResourceDictionary>
  <ResourceDictionary.MergedDictionaries>

    <!-- Load Infrastructure's Resource Dictionaries -->
    <ResourceDictionary Source="/MyProject.Modules.Infrastructure;component/ResourceDictionaries/ResourceLibrary.xaml" />

  </ResourceDictionary.MergedDictionaries>

  <!-- Workaround for ResourceDictionary loading bug/optimization -->
  <Style TargetType="{x:Type Rectangle}" />

</ResourceDictionary>

参考我的代码示例中的解决方法:在引用包含合并字典的资源字典时出现问题。请注意,此解决方法仅适用于WPF应用程序。

1
我已经清理、重建、重新启动甚至重启了我的电脑!这个错误一直弹出来,毫无意义,它在一秒钟内完美运行,下一秒就不能再编译了! - Chrisjan Lodewyks
嗯,这很奇怪。你尝试过重命名你的样式键吗? - hijack
是的,我有,问题仍然存在!它不再阻止我编译,但是使用此样式的所有自定义控件都无法在设计中显示! - Chrisjan Lodewyks

4

您可以创建一个通用或基础设施项目,其他项目将引用此项目。添加你的资源资源。然后创建一个打包URI。 然后在资源字典中引用你的用户控件或窗口资源。

<...Resources>
<ResourceDictionary>
   <!-- Resource Dictionaries -->
   <ResourceDictionary.MergedDictionaries>
       <ResourceDictionary 
          Source="pack://application:,,,/Common;component/Dictionaries/Styles.xaml"/>
   </ResourceDictionary.MergedDictionaries>

对于用户控件,或者窗口的情况下可以使用Window.Resources。这对我来说有效。


3

可以使用相对路径来引用你的appStyles.xaml文件夹。希望这有所帮助。

类似以下代码:

<ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="../Resources/Styles.xaml"></ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
<ResourceDictionary>

1
我在Window.Resources中放置了一些样式,这导致了我的问题。
从MainWindow中删除所有样式后,问题消失了。
发现第二个问题:
问题是平台目标设置为x64。
将其更改为AnyCPU,设计中的资源就可以正常工作。

1
你可以将资源字典添加到你的项目中,然后将其构建操作更改为资源,再尝试按照以下方式在代码中添加它的URI:
    <ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
   <ResourceDictionary 
      Source="/Styles.xaml"/>
</ResourceDictionary.MergedDictionaries>

或者简单地让vs2012通过使用属性选项卡来处理它...


将字典构建操作切换为资源并不会改变任何内容。 - superjos

0

你也可以在 AppStyles.xaml 中查找具有相同 x:key 的样式。这曾经导致了类似的错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接