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

說明這個是資源加載順序的問題!

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章