10

我最近升级到了 VS 2012,因为我需要开始使用 .net 4.5,但那不是重点。我的问题如下:

ResourceDictionary在我的主要项目中有一个名为AppStyles.xaml,并且在App.Xaml我有以下内容:

<ResourceDictionary>
  <ResourceDictionary.MergedDictionaries>
     <ResourceDictionary Source="AppStyles.xaml"/>
  <ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

在我ResourceDictionary有一个样式,然后我可以通过设置将此样式应用于我的任何项目中的任何按钮Style={StaticResource MyButton}

升级到 VS 2012 后,我注意到标题中出现了很多错误,有时它会阻止我调试,有时它不会!

有没有不同的方式我应该这样做,或者 VS 2012 中是否有问题?

4

7 回答 7

15

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

Source将URI 中的 URI更改为App.xaml绝对包 URI。例如,如果您的项目被调用MyProject(即:“MyProject”是短程序集名称),那么您应该将Sourcein更改App.xaml为:

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

这假设AppStyles.xamlMyProject. 您可以选择指定已签名程序集的权限、程序集版本和公钥信息。但是,使用短程序集名称(MyProject,在上面的示例中)应该是安全的。

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

于 2014-04-22T21:52:44.187 回答
6

我在VS2010中也时不时遇到这个问题。有时,如果我制作“清洁解决方案”和“重建解决方案”,问题就会解决。如果这不起作用,我通常会重新启动 VS2010。

我还将 Style 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>

参考我的代码示例中有关解决方法的问题:Trouble references a Resource Dictionary that contains a Merged Dictionary

于 2013-03-05T14:31:19.017 回答
4

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

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

在usercontrol 或使用Window.Resources 的情况下是一个窗口。这对我有用。

于 2013-09-25T08:26:44.607 回答
3

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

像下面的东西

<ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="../Resources/Styles.xaml"></ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
于 2014-04-26T08:34:36.500 回答
1

您可以将资源字典添加到您的项目中,然后将其构建操作更改为资源,然后尝试在代码中添加其 uri,如下所示:

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

或者干脆让 vs2012 使用属性选项卡来处理它...

于 2014-04-24T16:30:16.027 回答
1

我在 Window.Resources 中放置了一些样式,这导致了我的问题

从 MainWindow 中删除所有样式后,问题就消失了。

发现第二个问题:

问题是平台目标设置为 x64。

将其更改为 AnyCPU 后,设计中的资源可以工作..

于 2019-12-04T20:55:53.583 回答
0

您还可以x:key在 AppStyles.xaml 中检查具有相同样式的样式。它给我带来了类似的错误。

于 2019-03-20T12:16:55.597 回答