修改主題資源
您可以自定義視覺元素的主題資源(筆刷、厚度、顏色、樣式、模板等),如下所述。
如果您使用DevExpress WPF Controls NuGet包,則應(yīng)該在計算機上安裝DevExpress WPF Controls ,安裝包括DevExpress WPF主題源代碼。
使用WPF主題設(shè)計器
WPF主題設(shè)計器是一個獨立的工具,允許您基于內(nèi)置的DevExpress WPF應(yīng)用程序主題創(chuàng)建自定義主題。
要使用WPF主題設(shè)計器更改主題資源,請執(zhí)行以下步驟:
- 從DevExpress WPF控件單獨下載WPF主題設(shè)計器。
- 創(chuàng)建自定義主題。
- 使用Inspect Element工具定位要更改其外觀的控件元素。
- 修改元素的主題資源。
- 導(dǎo)出帶有自定義主題的程序集。
- 在應(yīng)用程序中引用此程序集。
主題: 主題設(shè)計器 - 創(chuàng)建并應(yīng)用新的自定義主題。
優(yōu)點
- 可以將修改后的主題導(dǎo)出為程序集。
- 您可以使用Inspect Element工具來定位元素的屬性和XAML源代碼。
- 自定義主題升級工具允許將自定義主題更新到新版本的DevExpress WPF控件,并解決可能的更新沖突。
- 預(yù)覽窗口允許將自定義主題應(yīng)用于DevExpress WPF控件,并查看更改的預(yù)覽。
缺點
- 您應(yīng)該從DevExpress WPF控件中單獨下載WPF主題設(shè)計器 。
在應(yīng)用程序代碼中使用XAML資源
您可以從DevExpress WPF控件源代碼中復(fù)制主題資源[1]到應(yīng)用程序中,修改這些主題資源,并在項目中使用它們作為XAML資源。
優(yōu)點
- 與使用WPF主題設(shè)計器相比,修改主題資源的步驟更少。
- 您可以在所有DevExpress WPF主題中使用修改過的主題資源。
部分:將修改后的主題資源應(yīng)用到應(yīng)用程序中。
缺點
- 您需要在應(yīng)用程序的可視化樹中找到一個控件元素,并確定應(yīng)該更改的主題資源[1]。
- 當升級到較新版本的DevExpress WPF控件時,可能會遇到更新問題。
查找元素的主題資源
要訪問元素的主題資源[1],請在應(yīng)用程序的可視化樹中找到該元素。您可以使用Visual Studio的Live Visual Tree 、Snoop(在本主題中使用)、WPF主題設(shè)計器檢查元素工具或其他分析可視化樹的工具。
這篇文章展示了如何搜索定義GridColumn過濾器圖標外觀的模板:
1.在可視化樹中找到一個元素
使用Data Grid控件將Snoop工具附加到應(yīng)用程序上。
按住Ctrl+Shift并將鼠標指針懸停在網(wǎng)格列的過濾器圖標上,這個圖標由一個帶有四個路徑項的網(wǎng)格組成。
2.確定要更改的項目
使用項的唯一屬性標識要更改的項:控件類型、名稱或?qū)傩?,這個示例使用了Path的Data屬性。
3.在主題源代碼中找到元素
在要更改其外觀的DevExpress WPF主題的源代碼中找到元素,您可以使用Visual Studio的內(nèi)置搜索工具(在本主題中使用)、WPF主題設(shè)計器的個人顏色窗口或其他可以搜索文件中的文本的工具。
按照下面的步驟在Office2016White主題的源代碼中找到GridColumn過濾器圖標的模板。
- 打開Office2016White主題的項目,默認文件夾路徑為C:\Program Files\DevExpress 23.1\Components\Sources\XPF\DevExpress.Xpf.Themes\Office2016White\Office2016White.csproj。
- 搜索Path的Data屬性值為F1 M 1296.5的元素。
如何修改主題資源的建議
當修改主題資源時,您的修改可能會影響DevExpress WPF控件,并導(dǎo)致異?;虿徽_的操作等問題。為了避免這些問題,我們建議您遵循以下說明。
- 不要刪除名稱以PART_開頭的元素,也不要更改這些元素的名稱/類型,DevExpress WPF控件可以在代碼隱藏中使用它們。要hide these elements則將元素的Visibility屬性設(shè)置為collapse,這種方法在下一點中描述的場景中沒有效果。
- DevExpress WPF控件可能會改變PART_編輯器在代碼隱藏中的可見性,不要修改這些主題資源中的Visibility屬性[1]。要hide these elements則將它們的不透明度屬性值設(shè)置為0。
- 不要從復(fù)雜的筆刷中移除元素,動畫的DevExpress WPF控件使用這些元素。
下面的代碼片段包含了一個帶有GradientStop元素的復(fù)雜LinearGradientBrush的例子:
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="#FFD1E4FC" Offset="0" /> <GradientStop Color="#FFAED1F6" Offset="1" /> <GradientStop Color="#FFB5D0F1" Offset="0.5" /> <GradientStop Color="#FFA4C5ED" Offset="0.5" /> </LinearGradientBrush>
- DevExpress WPF控件可能包含cs:Name屬性,您應(yīng)該從自定義主題資源中刪除它,或者指定以下XML名稱空間來忽略它:
<Window ... xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:cs="colorscheme_ignorable_uri" mc:Ignorable="cs"> <Window.Resources> <ControlTemplate x:Key="{dxgt:GridColumnHeaderThemeKey ResourceKey=ControlTemplate}" TargetType="{x:Type dxg:GridColumnHeaderBase}"> <Grid> <!-- ... --> <Border ... cs:Name="Border_0001"/> </Grid> </ControlTemplate> </Window.Resources> </Window>
將修改后的主題資源應(yīng)用到應(yīng)用程序中
將修改后的主題資源[1]粘貼到目標元素(控件、窗口或應(yīng)用程序)的資源中,并選擇以下選項之一:
- 要將修改后的資源應(yīng)用于所有DevExpress WPF主題,請將資源的IsThemeIndependent屬性設(shè)置為true。下面的代碼示例修改了所有DevExpress WPF主題中窗口內(nèi)所有GridColumnHeaderBase元素的資源:
<Window ... xmlns:dxgt="http://schemas.devexpress.com/winfx/2008/xaml/grid/themekeys"> <Window.Resources> <ControlTemplate x:Key="{dxgt:GridColumnHeaderThemeKey ResourceKey = ColumnFilterTemplate, IsThemeIndependent = true}"> <!-- ... --> </ControlTemplate> </Window.Resources> </Window>
- 要修改specific theme,請指定資源的ThemeName屬性,您可以在主題列表主題中找到可用的ThemeName屬性值列表(請參閱主題名稱列)。下面的代碼示例只修改Office2019Colorful主題中的資源:
<Window ... xmlns:dxgt="http://schemas.devexpress.com/winfx/2008/xaml/grid/themekeys"> <Window.Resources> <ControlTemplate x:Key="{dxgt:GridColumnHeaderThemeKey ResourceKey=ColumnFilterTemplate,ThemeName=Office2019Colorful}" TargetType="{x:Type ToggleButton}"> <!-- ... --> </ControlTemplate> </Window.Resources> </Window>
如果您沒有指定資源的IsThemeIndependent或ThemeName屬性,則該資源僅在DeepBlue主題中應(yīng)用。
修改主題資源要求
修改后的主題資源[1]應(yīng)滿足以下要求:
1.確保主題資源對其目標元素可見。
2.引用程序集并復(fù)制主題資源使用的名稱空間。
3.將彈出窗口和消息框中使用的主題資源放在App.xaml資源中。
4.如果主題資源使用靜態(tài)資源(brush、Converters等),也應(yīng)該將它們復(fù)制到應(yīng)用程序中。
使用不同主題的不同主題資源
- 為使用的每個主題創(chuàng)建主題資源[1]。
- 為每個創(chuàng)建的主題資源指定ThemeName屬性。
您可以在主題列表主題中找到可用的ThemeName屬性值列表(請參閱主題名稱列)。
下面的代碼示例使用Office2013和MetropolisDark應(yīng)用程序主題的不同模板:
<Window ... xmlns:dxgt="http://schemas.devexpress.com/winfx/2008/xaml/grid/themekeys"> <Window.Resources> <ControlTemplate x:Key="{dxgt:GridColumnHeaderThemeKey ResourceKey=ColumnFilterTemplate,ThemeName=Office2013}" TargetType="{x:Type ToggleButton}"> <!-- ... --> </ControlTemplate> <ControlTemplate x:Key="{dxgt:GridColumnHeaderThemeKey ResourceKey=ColumnFilterTemplate,ThemeName=MetropolisDark}" TargetType="{x:Type ToggleButton}"> <!-- ... --> </ControlTemplate> </Window.Resources> </Window>
使用主題的動態(tài)資源
原始主題資源可以使用主題的動態(tài)資源:
<Window ... xmlns:dxgt="http://schemas.devexpress.com/winfx/2008/xaml/grid/themekeys"> <Window.Resources> <ControlTemplate ...> <Grid> <Border BorderBrush="{DynamicResource {dxgt:TableViewThemeKey ResourceKey=ColumnChooserBorderBrush}}"> </Grid> </ControlTemplate> <Window.Resources> </Window>
如果您指定修改后的資源的IsThemeIndependent屬性,它仍然使用默認主題(DeepBlue)的資源,要使用應(yīng)用主題中的資源,請執(zhí)行以下步驟:
- 引用dxi="http://schemas.devexpress.com/winfx/2008/xaml/core/internal" XAML命名空間。
- 將修改后的主題資源的DynamicResource更改為dxi:ThemeResource。themerresource標記擴展動態(tài)地將其目標屬性設(shè)置為目標元素應(yīng)用的主題中的資源,目標元素必須位于應(yīng)用程序的可視化樹中。
<TargetElement TargetProperty="{dxi:ThemeResource {ThemeKey}}" />
下面的代碼示例將Border的(TargetElement) BorderBrush (TargetProperty)屬性值設(shè)置為目標元素應(yīng)用的主題中的一個資源(ThemeKey):
<Window ... xmlns:dxi="http://schemas.devexpress.com/winfx/2008/xaml/core/internal" xmlns:dxgt="http://schemas.devexpress.com/winfx/2008/xaml/grid/themekeys"> <Window.Resources> <ControlTemplate ...> <Grid> <Border BorderBrush="{dxi:ThemeResource {dxgt:TableViewThemeKey ResourceKey=ColumnChooserBorderBrush}}"> </Grid> </ControlTemplate> <Window.Resources> </Window>