WPF报错'Resources' property has already been set on 'App'求助
问题根因
这是WPF初学者写全局资源时非常常见的结构错误:Application.Resources属性的类型本身就是ResourceDictionary,作为XAML内容属性,它的子节点只能接收一个资源字典实例。
你当前的代码在<Application.Resources>下并列写了三个同级子节点:
- 一个显式声明的、包含BitmapImage资源的
<ResourceDictionary> - 一个针对Window的全局Style
- 一个针对Menu的全局Style
相当于给同一个属性重复赋值三次,XAML解析器无法处理这种结构,就会抛出通用的XamlParseException,且报错行号通常没有参考价值。
修复方法
把所有全局资源(图片、样式)都放到同一个<ResourceDictionary>节点内部即可,不需要在资源字典外面并列放其他资源。修正后的完整代码如下:
<Application x:Class="niftymonkey.GameBoxer.UI.WpfApp.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:niftymonkey.GameBoxer.UI.WpfApp" StartupUri="MainWindow.xaml"> <Application.Resources> <ResourceDictionary> <!-- 图片资源 --> <BitmapImage x:Key="IconPng128" UriSource="Assets/space-invader-icon-128.png"/> <!-- 全局Window样式 --> <Style TargetType="Window"> <Setter Property="Background" Value="#303030"/> </Style> <!-- 全局Menu样式 --> <Style TargetType="Menu"> <Setter Property="Background" Value="#202020"/> <Setter Property="Foreground" Value="Gainsboro"/> <Setter Property="Padding" Value="0,4,0,4"/> </Style> <!-- 后续如果需要引入其他独立的资源字典文件,在此处添加合并节点即可 <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="pack://application:,,,/Themes/ButtonStyles.xaml"/> </ResourceDictionary.MergedDictionaries> --> </ResourceDictionary> </Application.Resources> </Application>
额外提示
- 请确认项目中
Assets/space-invader-icon-128.png文件的生成操作属性设置为Resource,否则运行时会因找不到图片资源触发新的异常。 - WPF的XAML解析异常对资源类错误的定位一直很模糊,只要出现无明确指向的XamlParseException,优先检查全局资源、页面资源的字典结构是否合法,资源Key是否重复。
内容的提问来源于stack exchange,提问作者stigzler
相关产品推荐
相关产品推荐

