我最近升级到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中存在问题?
答案 0 :(得分:11)
WPF无法解析您尝试合并的资源字典。创建合并字典时,WPF遵循一组规则来尝试解析URI。在您的情况下,URI是不明确的,因此WPF无法可靠地解析它。
将Source
中的App.xaml
URI更改为绝对包URI。例如,如果您的项目名为MyProject
(即:“MyProject”是简短的程序集名称),那么您应该将Source
中的App.xaml
更改为:
<ResourceDictionary
Source="/MyProject;component/AppStyles.xaml"/>
这假定AppStyles.xaml
位于MyProject
的根目录中。您可以选择指定签名程序集的权限,程序集版本和公钥信息。但是,使用短组件名称(在上面的示例中为MyProject)应该是安全的。
有关WPF中包URI的更多详细信息,请参阅MSDN上的此页面:http://msdn.microsoft.com/en-us/library/aa970069(v=vs.110).aspx
答案 1 :(得分: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 referencing a Resource Dictionary that contains a Merged Dictionary
答案 2 :(得分:4)
您可以创建其他项目将引用的公共或基础结构项目。添加您的资源。然后创建一个包URI。 然后在资源字典中的usercontrol或window资源中引用
<...Resources>
<ResourceDictionary>
<!-- Resource Dictionaries -->
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary
Source="pack://application:,,,/Common;component/Dictionaries/Styles.xaml"/>
</ResourceDictionary.MergedDictionaries>
在usercontrol中或在窗口的情况下使用Window.Resources。这对我有用。
答案 3 :(得分:3)
可以使用appStyles.xaml文件夹的相对路径。希望这有帮助。
如下所示
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../Resources/Styles.xaml"></ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
答案 4 :(得分:1)
您可以将资源字典添加到项目中,然后将其构建操作更改为资源,然后尝试在代码中添加其uri,如下所示:
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary
Source="/Styles.xaml"/>
</ResourceDictionary.MergedDictionaries>
或者让vs2012使用属性选项卡...
来处理它答案 5 :(得分:0)
您还可以在AppStyles.xaml中检查具有相同x:key
的样式。这引起了我类似的错误。
答案 6 :(得分:0)
我在Window中放置了一些样式。资源a导致了我的问题
从MainWindow删除所有样式后,问题消失了。
发现了第二个问题:
问题是“平台目标”设置为x64。
将其更改为AnyCPU后,设计中的资源即可工作。