之前的ResourceDictionary主題資源替換(一)通過載入順序來覆蓋之前的主題資源,介紹了WPF框架對ResourceDictionary資源的合併規則。 此篇介紹一種在編譯期間,實現資源替換的方案 前言 如下圖,項目中存在倆個主題資源字典,我們想通過配置一鍵修改項目的主題。 首先,我們默 ...
之前的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
工具會將缺失的資源,從另一份資源字典中複製到此資源文件中。所以修複完成,提交代碼前可以確認下,資源是否匹配當前主題。