引言
上一篇中 WPF --- 重寫DataGrid樣式,因新產品UI需要,重寫了一下微軟 WPF 原生的 DataGrid
的樣式,包含如下內容:
- 基礎設定,一些基本背景色,字型顏色等。
- 捲軸樣式。
- 實現圓角表格,重寫表格的一些基礎樣式,例如
CellStyle
,RowStyle
,RowHeaderStyle
,ColumnHeaderStyle
等。
重寫過程中,遇到了兩個問題:
- 如何獲取 WPF 原生的
DataGrid
的樣式? - 捲軸樣式中,如何固定捲軸長度?
本篇文章分享一下這兩個問題的解決辦法。
解決方法
我來分別分享一下我遇到的這兩個問題。
問題1
第一個,如何獲取 WPF 原生的 DataGrid
的樣式?
這個問題不限於原生的 DataGrid
的樣式,其他的一些樣式比如 checkBox
,RadioButton
, ComboBox
。
這些控制元件對於一些初學者來說,很難理解他是怎麼實現的。
比如 ComboBox
控制元件,我剛開始學習WPF時的時候,我就不理解這個是怎麼實現的,我後來還是透過查詢微軟官方文件 [1]ComboBox Styles and Templates ,文件裡給出了 ComboBox Styles
和 ComboBox Templates
,看完設計程式碼之後才明白原生的ComBox控制元件是怎麼實現的。
那麼用翻閱官方文件的方式效率太低了,所以我這回找了一個效率很高的方法嗎,就是是透過 Blend(全稱:Microsoft Blend for Visual Studio),這個是跟隨 Visual Studio 一起安裝的,平常我也使用 Blend ,做一些自定義控制元件和動畫效果等,十分好用。接下來演示一下如何獲取 ComboBox
的原生樣式。
第一步:
使用 Blend 建立一個 WPF 專案,再窗體中新增一個 ComboBox
。
第二步:
選中 ComboBox
,在設計檢視左上角點選 ComboBox
下拉框,再點選“編輯模板”,再點選“編輯副本”。
這時會彈出建立資源的窗體,可以選擇你建立樣式的形式是什麼。
- 關鍵字選項:可以選擇你建立的樣式是否帶
Key
,若不帶Key
則預設應用在所有該型別控制元件上。 - 定義位置選項:“應用程式”選項會將該樣式建立到
App.xaml
檔案中。“此文件”選項會將該樣式建立到當前窗體的Window.Resources
中,最後一個“資源字典”選項,則會建立一個新的資源字典檔案或者新增到已有資源字典檔案。
第三步:
我這裡選擇,生成到當前檔案 Window.Resources
中且帶 Key
的樣式,然後他就會生成原生的樣式程式碼。如下所示,這裡程式碼太多,摺疊展示。
第四步:
可以看到它生成了一堆的資源,這時候我們只需要找我們想要的那一部分,比如 ComboBoxTemplate
,從程式碼中就可以看出,ComboBox
主要有三部分組成
- Popup:它的作用就是當
ToggleButton
的IsChecked
為true時,展開其內容,它的內容就是ScrollViewer
,就是我們看到的下拉彈出的內容了。 - ToggleButton: 這個就是右側那個上下尖括號符號按鈕,用於開啟或關閉
Popup
內容。 - ContentPresenter:內容容器,可以自定義任何控制元件模板、資料模板或樣式在其中展示。
所以,到此為止,我們就明白了原生的 ComboBox
是怎麼實現的了,而且有了這個原生樣式,就可以在此基礎之上進行修改,美化,從而演變成我們想要的樣子。
問題2
第二個問題, 捲軸樣式中,如何固定捲軸長度?
在原生的捲軸樣式中,縱方向上的捲軸的高度是跟隨你視窗的大小和內容的多少而改變的,視窗大內容少,捲軸的高度就越大,反之亦然。
我除錯了很久,包括重寫 Thumb
的樣式,修改 Thumb
的高度,都一直不生效,最後在官方文件 [2]How to: Customize the Thumb Size on a ScrollBar 中找到了解決方案,就是透過設定HorizontalScrollBarButtonWidthKey
來固定捲軸長度。文中將其
小結
Blend 本身就是一個專業級的介面設計工具,可以大大提高我們建立豐富、互動式的使用者介面(UI)和使用者體驗(UX)設計的效率。
而透過 Blend 獲取原生樣式,閱讀原生樣式,非常有利於理解控制元件設計的,在此基礎上進行修改,美化也是能夠事半功倍的,強烈建議大家學會。
參考