之前的ResourceDictionary主題資源替換(一)通過加載順序來覆蓋之前的主題資源,介紹了WPF框架對ResourceDictionary資源的合并規則。
?此篇介紹一種在編譯期間,實現資源替換的方案
前言
如下圖,項目中存在倆個主題資源字典,我們想通過配置一鍵修改項目的主題。
?
?
?
?首先,我們默認使用的是灰色主題
?
?
添加項目屬性文件
新建文件Themes.props(主題設置),
?
并添加當前主題版本:
1 <Project> 2 <PropertyGroup> 3 <Theme>Theme-Red</Theme> 4 </PropertyGroup> 5 </Project>
如上,切換當前版本為紅色主題
修改項目csproject
引入主題配置文件:
<Import Project="..\Themes.props" Condition="Exists('..\Themes.props')" />
添加資源替換:
在編譯前,判斷當前主題,如果為紅色主題,則替換;
- 將項目中的文件Theme-Normal.xaml、Theme-Red.xaml全部刪除(如果Theme-Red.xaml沒有添加到項目中,是以本地文件存在,則不需要此刪除步驟)
- 將Theme-Red.xaml偽裝為,當前程序資源中的Theme-Normal.xaml
1 <Target Name="ReplaceTheme" BeforeTargets="BeforeBuild" Condition="'$(Theme)' == 'Theme-Red'"> 2 <ItemGroup> 3 <Page Remove="Theme-Normal.xaml" /> 4 <Page Remove="Theme-Red.xaml" /> 5 <Page Include="Theme-Red.xaml"> 6 <Generator>MSBuild:Compile</Generator> 7 <Link>Theme-Normal.xaml</Link> 8 </Page> 9 </ItemGroup> 10 </Target>
?
替換后的主題色:
?
?
需要注意的坑
此方案,需要資源字典中的鍵值匹配對應,如果缺失了某個樣式等資源,后續可能會有意想不到的異常哦~
如何規避?
可以下載資源字典修復工具,Github地址:ResourceIntegrityCheck
?工具會將缺失的資源,從另一份資源字典中復制到此資源文件中。所以修復完成,提交代碼前可以確認下,資源是否匹配當前主題。