温故知新,遇见WPF/WinForms,界面过早触发,导致WPF视觉树元素未初始化出现找不到的情况(资源名称区分大小写)
报错
今天在WPF中,从入口程序去引用一个类库中的资源字典样式,运行时提示找不到,但是设计时好好的,看了很久,迟迟找不到原因。
内部异常 1:
Exception: 无法找到名为“redBtn”的资源。资源名称区分大小写。
但是明明,我在App.xaml
中已经引入了
<Application
>
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/xxxxx.Control;component/ResourceDictionarys/ButtonTemplate.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
解决
按一个SO回答的说法,如果要使用StaticResource
,要求其应用于同一视觉树中的元素之前定义样式。
可以考虑直接在当前Window的头部来引入这个资源。
<Window
>
<Window.Resources>
<ResourceDictionary Source="pack://application:,,,/xxxxx.Control;component/ResourceDictionarys/ButtonTemplate.xaml"/>
</Window.Resources>
虽然还是有点迷糊,但是这样确实好了。
另一个问题,怀疑是,我过早的触发了这个界面,还没等所有资源初始化完,考虑到我是在某构造函数中直接主动报错弹界面的,可能这时候对应的资源还没加载吧。
这里暂时怀疑是,过早的触发了界面,一般来说,应该是在App
构造函数之后来触发才对。
结论
果然,我把触发这个界面的逻辑,从App
构造函数挪到OnStartup
中去执行,就没有这个问题了。
protected override void OnStartup(StartupEventArgs e)
{
...
base.OnStartup(e);
}
说明这个是资源加载顺序的问题!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」