WPF --- 如何重寫WPF原生控制元件樣式

NiueryDiary發表於2023-11-17

引言

上一篇中 WPF --- 重寫DataGrid樣式,因新產品UI需要,重寫了一下微軟 WPF 原生的 DataGrid 的樣式,包含如下內容:

  • 基礎設定,一些基本背景色,字型顏色等。
  • 捲軸樣式。
  • 實現圓角表格,重寫表格的一些基礎樣式,例如 CellStyleRowStyle,RowHeaderStyle, ColumnHeaderStyle等。

重寫過程中,遇到了兩個問題:

  1. 如何獲取 WPF 原生的 DataGrid 的樣式?
  2. 捲軸樣式中,如何固定捲軸長度?

本篇文章分享一下這兩個問題的解決辦法。

解決方法

我來分別分享一下我遇到的這兩個問題。

問題1

第一個,如何獲取 WPF 原生的 DataGrid 的樣式?

這個問題不限於原生的 DataGrid 的樣式,其他的一些樣式比如 checkBox,RadioButton, ComboBox

這些控制元件對於一些初學者來說,很難理解他是怎麼實現的。

比如 ComboBox 控制元件,我剛開始學習WPF時的時候,我就不理解這個是怎麼實現的,我後來還是透過查詢微軟官方文件 [1]ComboBox Styles and Templates ,文件裡給出了 ComboBox StylesComboBox Templates ,看完設計程式碼之後才明白原生的ComBox控制元件是怎麼實現的。

那麼用翻閱官方文件的方式效率太低了,所以我這回找了一個效率很高的方法嗎,就是是透過 Blend(全稱:Microsoft Blend for Visual Studio),這個是跟隨 Visual Studio 一起安裝的,平常我也使用 Blend ,做一些自定義控制元件和動畫效果等,十分好用。接下來演示一下如何獲取 ComboBox 的原生樣式。

第一步:

使用 Blend 建立一個 WPF 專案,再窗體中新增一個 ComboBox

第二步:

選中 ComboBox ,在設計檢視左上角點選 ComboBox 下拉框,再點選“編輯模板”,再點選“編輯副本”。
image.png

這時會彈出建立資源的窗體,可以選擇你建立樣式的形式是什麼。

  • 關鍵字選項:可以選擇你建立的樣式是否帶 Key,若不帶 Key 則預設應用在所有該型別控制元件上。
  • 定義位置選項:“應用程式”選項會將該樣式建立到 App.xaml 檔案中。“此文件”選項會將該樣式建立到當前窗體的 Window.Resources 中,最後一個“資源字典”選項,則會建立一個新的資源字典檔案或者新增到已有資源字典檔案。

image.png

第三步:

我這裡選擇,生成到當前檔案 Window.Resources 中且帶 Key 的樣式,然後他就會生成原生的樣式程式碼。如下所示,這裡程式碼太多,摺疊展示。

image.png

第四步:

可以看到它生成了一堆的資源,這時候我們只需要找我們想要的那一部分,比如 ComboBoxTemplate ,從程式碼中就可以看出,ComboBox 主要有三部分組成

  • Popup:它的作用就是當 ToggleButtonIsChecked 為true時,展開其內容,它的內容就是 ScrollViewer,就是我們看到的下拉彈出的內容了。
  • ToggleButton: 這個就是右側那個上下尖括號符號按鈕,用於開啟或關閉 Popup 內容。
  • ContentPresenter:內容容器,可以自定義任何控制元件模板、資料模板或樣式在其中展示。

image.png

所以,到此為止,我們就明白了原生的 ComboBox 是怎麼實現的了,而且有了這個原生樣式,就可以在此基礎之上進行修改,美化,從而演變成我們想要的樣子。

問題2

第二個問題, 捲軸樣式中,如何固定捲軸長度?

在原生的捲軸樣式中,縱方向上的捲軸的高度是跟隨你視窗的大小和內容的多少而改變的,視窗大內容少,捲軸的高度就越大,反之亦然。

我除錯了很久,包括重寫 Thumb 的樣式,修改 Thumb 的高度,都一直不生效,最後在官方文件 [2]How to: Customize the Thumb Size on a ScrollBar 中找到了解決方案,就是透過設定HorizontalScrollBarButtonWidthKey 來固定捲軸長度。文中將其

image.png

小結

Blend 本身就是一個專業級的介面設計工具,可以大大提高我們建立豐富、互動式的使用者介面(UI)和使用者體驗(UX)設計的效率。

而透過 Blend 獲取原生樣式,閱讀原生樣式,非常有利於理解控制元件設計的,在此基礎上進行修改,美化也是能夠事半功倍的,強烈建議大家學會。

參考

[1] https://learn.microsoft.com/en-us/dotnet/desktop/wpf/controls/combobox-styles-and-templates?view=netframeworkdesktop-4.8&viewFallbackFrom=netdesktop-6.0

[2] https://learn.microsoft.com/en-us/dotnet/desktop/wpf/controls/how-to-customize-the-thumb-size-on-a-scrollbar?view=netframeworkdesktop-4.8&viewFallbackFrom=netdesktop-6.0

相關文章