WPF控制項開發之自定義控制項 1

2021-04-27 13:54:36 字數 4782 閱讀 7065

windows presentation foundation (wpf) 控制項模型的擴充套件性極大減少了建立新控制項的需要。但在某些情況下,仍可能需要建立自定義控制項。本主題討論可最大限度減少在 windows presentation foundation (wpf) 中建立自定義控制項以及其他控制項創作模型的需要的功能。本主題還演示如何建立新控制項。

編寫新控制項的替代方法

以前,如果要通過現有控制項獲取自定義體驗,您只能更改控制項的標準屬性,例如背景色、邊框寬度和字型大小。如果希望在這些預定義引數的基礎之上擴充套件控制項的外觀或行為,則需要建立新的控制項,通常的方法是繼承現有控制項並重寫負責繪製該控制項的方法。雖然這仍是一種可選方法,但也可以利用 wpf 豐富內容模型、樣式、模板和觸發器來自定義現有的控制項。下面的列表提供了一些示例,演示如何在不建立新控制項的情況下使用這些功能來實現統一的自定義體驗。

豐富內容。很多標準 wpf 控制項支援豐富內容。例如,button 的內容屬性為 object 型別,因此從理論上講,任何內容都可以顯示在 button 上。若要讓按鈕顯示影象和文字,可以將影象和 textblock 新增到 stackpanel 中,然後將 stackpanel 分配給 content 屬性。由於這些控制項可以顯示 wpf 視覺化元素和任意資料,因此,減少了建立新控制項或修改現有控制項來支援複雜視覺化效果的需要。

樣式。style 是表示控制項屬性的值的集合。使用樣式可建立所需控制項外觀和行為的可重用表示形式,而無需編寫新控制項。例如,假設希望所有 textblock 控制項都呈現字型大小為 14 的紅色 airal 字型。您可以建立乙個樣式作為資源,然後相應地設定適當的屬性。這樣,新增到應用程式中的每個 textblock 都將具有相同的外觀。

資料模板。 datatemplate 可用於自定義資料在控制項上的顯示方式。例如,datatemplate 可用於指定資料在 listbox 中的顯示方式。有關這種情況的示例,請參見資料模板概述。除了自定義資料外觀之外,datatemplate 還可以包含 ui 元素,這樣大大增加了自定義 ui 的靈活性。例如,使用 datatemplate 可以建立乙個 combobox,其中每一項都包含乙個核取方塊。

控制項模板 wpf 中的很多控制項都使用 controltemplate 來定義控制項的結構和外觀,這樣可將控制項外觀和控制項功能分離開。通過重新定義控制項的 controltemplate,可以徹底更改控制項的外觀。例如,假設您希望控制項看起來像乙個交通訊號燈。此控制項具有簡單的使用者介面和功能。該控制項有三個圓形,一次只能點亮其中的乙個。經過考慮之後,您可能意識到 radiobutton 提供了一次只選中一項的功能,但是 radiobutton 的預設外觀完全不像交通訊號燈上的燈。由於 radiobutton 使用控制項模板來定義其外觀,因此很容易重新定義 controltemplate 以符合該控制項的要求,從而使用單選按鈕來製作交通訊號燈。

說明:

儘管 radiobutton 可以使用 datatemplate,但在本例中,只使用 datatemplate 還不夠。datatemplate 定義控制項內容的外觀。對於 radiobutton,指示 radiobutton 是否選中的那個圓形右側顯示出來的全部都是該控制項的內容。在交通訊號燈的示例中,單選按鈕只需要成為可「點亮」的圓形。由於交通訊號燈的外觀要求與 radiobutton 的預設外觀存在很大差異,因此,有必要重新定義 controltemplate。一般而言,datatemplate 用於定義控制項的內容(或資料),controltemplate 用於定義控制項的構成方式。

觸發器。trigger 用於在不建立新控制項的情況下動態更改控制項的外觀和行為。例如,假設應用程式中有多個 listbox 控制項,而您希望每個 listbox 中的項在選中時都顯示為紅色粗體。您首先想到的可能是建立乙個從 listbox 繼承的類,然後重寫 onselectionchanged 方法,以更改選中項的外觀,不過,更好的方法是向 listboxitem 的樣式新增乙個更改選中項外觀的觸發器。觸發器用於更改屬性值或根據屬性值執行操作。eventtrigger 用於在發生事件時執行操作。

一般而言,如果控制項完全複製現有控制項的功能,但您希望該控制項具有不同的外觀,則應先考慮是否可以使用本節中討論的某些方法來更改現有控制項的外觀。

控制項創作模型

通過豐富內容模型、樣式、模板和觸發器,最大程度地減少了建立新控制項的需要。但是,如果確實需要建立新控制項,那麼理解 wpf 中的不同控制項創作模型就顯得非常重要。wpf 提供三個用於建立控制項的一般模型,每個模型都提供不同的功能集和靈活度。這三個模型的基類分別為 usercontrol、control 和 frameworkelement。

從 usercontrol 派生

在 wpf 中建立控制項的最簡單方法是從 usercontrol 派生。如果生成繼承自 usercontrol 的控制項,需要將現有元件新增到 usercontrol,命名這些元件,然後在 可擴充套件應用程式標記語言 (xaml) 中引用事件處理程式。執行這些操作之後,即可在**中引用這些命名元素和定義事件處理程式。此開發模型非常類似於用於 wpf 應用程式開發的模型。

如果生成正確,usercontrol 可以利用豐富內容、樣式和觸發器的優點。但是,如果控制項繼承自 usercontrol,則使用該控制項的使用者將無法使用 datatemplate 或 controltemplate 來自定義其外觀。因此,有必要從 control 類或其派生類(usercontrol 除外)進行派生,以便建立支援模板的自定義控制項。

從 usercontrol 派生的優點

如果符合以下所有情況,請考慮從 usercontrol 派生:

希望以類似於生成應用程式的方式生成控制項。

控制項僅由現有元件組成。

不需要支援複雜自定義項。

從 control 派生

從 control 類派生是大多數現有 wpf 控制項使用的模型。在建立繼承自 control 類的控制項時,可使用模板定義其外觀。通過這種方式,可以將運算邏輯從視覺化表示形式中分離出來。通過命令和繫結(而不是事件),也可確保分離 ui 和邏輯,盡可能避免引用 controltemplate 中的元素。如果控制項的 ui 和邏輯正確分離,該控制項的使用者即可重新定義其 controltemplate,從而自定義其外觀。儘管生成自定義 control 不像生成 usercontrol 那樣簡單,自定義 control 還是提供了最大的靈活性。

從 control 派生的優點

如果符合以下任一情況,請考慮從 control 派生,而不要使用 usercontrol 類:

希望控制項外觀能通過 controltemplate 進行自定義。

希望控制項支援不同的主題。

從 frameworkelement 派生

從 usercontrol 或 control 派生的控制項依賴於組合現有元素。很多情況下,這是一種可接受的解決方案,因為從 frameworkelement 繼承的任何物件都可以位於 controltemplate 中。但是,某些時候,簡單的元素組合不能滿足控制項的外觀需要。對於這些情況,使元件基於 frameworkelement 才是正確的選擇。

生成基於 frameworkelement 的元件有兩種標準方法:直接呈現和自定義元素組合。直接呈現涉及的操作包括:重寫 frameworkelement 的 onrender 方法,並提供顯式定義元件視覺效果的 drawingcontext 操作。此方法由 image 和 border 使用。自定義元素組合涉及的操作包括使用 visual 型別的物件組合元件的外觀。有關示例,請參見使用 drawingvisual 物件。track 是 wpf 中使用自定義元素組合的控制項示例。在同一控制項中,也可以混合使用直接呈現和自定義元素組合。

從 frameworkelement 派生的優點

如果符合以下任一情況,請考慮從 frameworkelement 派生:

希望對控制項的外觀進行精確控制,而不僅僅是簡單的元素組合提供的效果。

想要通過定義自己的呈現邏輯來定義控制項的外觀。

想要以一種 usercontrol 和 control 之外的新穎方式組合現有元素。

控制項創作基礎知識

如前所述,wpf 最強大的功能之一是,無需建立自定義控制項即可實現遠比設定控制項的基本屬性來更改其外觀和行為更強的功能。wpf 屬性系統和 wpf 事件系統使樣式、資料繫結和觸發器功能成為可能。如果在控制項中實現依賴項屬性和路由事件,則無論使用什麼模型建立自定義控制項,自定義控制項的使用者都可以像對 wpf 隨附的控制項那樣使用這些功能。

使用依賴項屬性

當屬性為依賴項屬性時,可以進行下面的操作:

在樣式中設定該屬性。

將該屬性繫結到資料來源。

使用動態資源作為該屬性的值。

動畫處理該屬性。

如果希望控制項的屬性支援以上任一功能,則應將該屬性實現為依賴項屬性。下面的示例定義乙個依賴項屬性。

這段**執行下面的操作:

將乙個名為 valueproperty 的 dependencyproperty 識別符號定義為 publicstaticreadonly 字段。

通過呼叫 dependencyproperty..::.register 向屬性系統註冊該屬性名,以指定以下內容:

屬性的名稱。

屬性的型別。

擁有該屬性的型別。

WPF控制項開發之自定義控制項 3

建立 usercontrol 如前所述,在 wpf 中建立控制項的最簡單方法是從 usercontrol 派生。下面的示例演示用於定義 numericupdownusercontrol 的 使用者介面 ui 的 xaml 下面的示例演示此 usercontrol 的邏輯。如此示例所示,自定義 use...

Wpf 自定義控制項 1

1.新建乙個wpf工程,在工程下面新建 乙個資料夾themes,在themes下新建兩個資源字典檔案generic.xaml和prettyseekbar.xaml generic.xaml resourcedictionary xmlns xmlns x resourcedictionary.mer...

WPF自定義控制項(四) 自定義控制項

原文 wpf自定義控制項 四 自定義控制項 在實際工作中,wpf提供的控制項並不能完全滿足不同的設計需求。這時,需要我們設計自定義控制項。這裡lz總結一些自己的思路,特性如下 下面舉例說說在專案中我們經常用到調音台音量條,寫乙個自定義控制項模擬調音台音量條。自定義控制項singnallight,實現...