温故知新,遇见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);
}

说明这个是资源加载顺序的问题!

参考

posted @ 2022-11-21 17:24  TaylorShi  阅读(420)  评论(0编辑  收藏  举报