前言:
以下內容翻譯自微軟官方文檔。
鏈接:https://docs.microsoft.com/zh-cn/dotnet/desktop-wpf/overview/
什麼是WPF(Windows Presentation Foundation)
WPF是一個爲Windows創建桌面客戶端應用程序的UI框架。 WPF開發平臺支持廣泛的應用程序開發功能集,包括應用程序模型,控件,圖形和數據綁定。 WPF使用可擴展應用程序標記語言(XAML)爲應用程序編程提供聲明性模型。
WPF有兩種實現:
- 託管在 GitHub 上的開源實現。 此版本在.NET Core 3.0上運行。 用於XAML的WPF Visual Designer至少需要Visual Studio 2019 version 16.3.
- Visual Studio 2019和Visual Studio 2017支持的.NET Framework實現。
本桌面指南是爲.NET Core 3.0和WPF編寫的。 有關帶有.NET Framework的WPF現有文檔的更多信息,請參見Framework Windows Presentation Foundation.
XAML
XAML是WPF用於諸如定義資源或UI元素之類的基於XML的聲明式語言。 XAML中定義的元素表示程序集中對象的實例化。 XAML與大多數其他標記語言不同,XAML在運行時進行解釋,而無需直接綁定到支持類型系統。
以下示例顯示瞭如何創建按鈕作爲UI的一部分。 本示例旨在讓您瞭解XAML如何表示對象,其中Button是類型,而Content是屬性。
<StackPanel>
<Button Content="Click Me!" />
</StackPanel>
XAML 擴展
XAML提供標記擴展的語法。 標記擴展可用於以屬性形式,屬性元素形式或同時以這兩種形式提供屬性值。
例如,先前的XAML代碼定義了一個按鈕,其可見內容設置爲文字字符串“ Click Me!”,但是該內容可以由受支持的標記擴展設置。 標記擴展名由大括號{}和大括號{}定義。 然後,標記擴展名的類型由緊接在大括號後面的字符串令牌標識。
<StackPanel>
<Button Content="{MarkupType}" />
</StackPanel>
WPF爲XAML提供了不同的標記擴展,例如用於數據綁定的{Binding}。
有關更多信息,請參見Markup Extensions and WPF XAML.
屬性系統
WPF提供了一組服務,可用於擴展類型屬性的功能。 這些服務統稱爲WPF屬性系統。 WPF屬性系統支持的屬性稱爲依賴項屬性。
依賴項屬性通過提供支持屬性的DependencyProperty類型來擴展屬性功能。 依賴項屬性類型是使用私有字段支持屬性的標準模式的替代實現。
依賴屬性
在WPF中,依賴項屬性通常作爲標準.NET屬性公開。 從根本上講,您可以直接與這些屬性進行交互,而永遠不會知道它們是作爲依賴項屬性實現的。
依賴項屬性的目的是提供一種基於其他輸入值來計算屬性值的方法。 這些其他輸入可能包括系統屬性(例如主題和用戶首選項),或者來自數據綁定和動畫的即時屬性。
可以實現依賴項屬性來提供驗證,默認值和監視其他屬性更改的回調。 派生類還可以通過覆蓋依賴項屬性元數據,而不是創建新屬性或覆蓋現有屬性,來更改現有屬性的某些特定特徵。
依賴對象
WPF屬性系統的另一個關鍵類型是DependencyObject。 此類型定義可以註冊並擁有依賴項屬性的基類。 GetValue和SetValue方法爲依賴項對象實例提供了依賴項屬性的後備實現。
以下示例顯示了一個依賴項對象,該對象定義了一個名爲ValueProperty的依賴項屬性標識符。 依賴項屬性是使用Value .NET屬性創建的。
public class TextField: DependencyObject
{
public static readonly DependencyProperty ValueProperty =
DependencyProperty.Register("Value", typeof(string), typeof(TextField), new PropertyMetadata(""));
public string Value
{
get { return (string)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
}
依賴項屬性定義爲依賴項對象類型的靜態成員,例如上面的示例中的TextField。 依賴項屬性必須在依賴項對象中註冊。
上面示例中的Value屬性包裝了依賴項屬性,提供了您可能習慣的標準.NET屬性模式。
事件
WPF提供了一個事件系統,該系統位於您熟悉的.NET公共語言運行時(CLR)事件之上。這些WPF事件稱爲路由事件。
路由事件是CLR事件,它由RoutedEvent類的實例支持並在WPF事件系統中註冊。從事件註冊獲得的RoutedEvent實例通常保留爲註冊類的公共靜態只讀字段成員,因此擁有路由事件。通過重寫CLR事件的添加和刪除實現來實現與同名的CLR事件(有時稱爲包裝事件)的連接。路由事件支持和連接機制在概念上類似於Dependency屬性是CLR屬性的方式,該CLR屬性由DependencyProperty類支持並在WPF屬性系統中註冊。
路由事件系統的主要優點是將事件泡在控制元素樹上以尋找處理程序。例如,由於WPF具有豐富的內容模型,因此您將圖像控件設置爲按鈕控件的內容。當您在圖像控件上單擊鼠標時,您希望它消耗鼠標事件,並因此中斷命中測試,從而導致按鈕調用Click事件。在傳統的CLR事件模型中,您可以通過在圖像和按鈕上附加相同的處理程序來解決此限制。但是對於路由事件系統,在圖像控件上調用的鼠標事件(例如選擇它)會冒泡到父按鈕控件。
數據綁定
WPF數據綁定爲應用程序提供了一種簡單一致的方式來呈現數據並與之交互。元素可以以公共語言運行時(CLR)對象和XML的形式綁定到來自不同類型數據源的數據。 WPF還提供了一種通過拖放操作進行數據傳輸的機制。
數據綁定是在應用程序UI和業務邏輯之間建立連接的過程。如果綁定具有正確的設置,並且數據提供了正確的通知,則當數據更改其值時,綁定到數據的元素會自動反映更改。數據綁定還可以意味着,如果元素中數據的外部表示發生更改,則基礎數據將自動更新以反映該更改。例如,如果用戶編輯TextBox元素中的值,則基礎數據值將自動更新以反映該更改。
可以通過{Binding}標記擴展在XAML中配置數據綁定。下面的示例演示如何綁定到數據對象的ButtonText屬性。如果該綁定失敗,則用“Click Me!”
<StackPanel>
<Button Content="{Binding ButtonText, FallbackValue='Click Me!'}" />
</StackPanel>
UI 組件
WPF提供了幾乎在每個Windows應用程序中使用的許多常見UI組件,例如Button,Label,TextBox,Menu和ListBox。 歷史上,這些對象被稱爲控件。 儘管WPF SDK繼續使用術語“控件”來粗略地表示應用程序中代表可見對象的任何類,但必須注意,無需爲了繼承可見類而從Control類繼承該類。 從Control類繼承的類包含ControlTemplate,該控件允許控件的使用者從根本上更改控件的外觀,而無需創建新的子類。
樣式和模板
WPF樣式和模板指的是一系列功能(樣式,模板,觸發器和情節提要),這些功能允許應用程序,文檔或UI設計器創建視覺上引人注目的應用程序並標準化其產品的特定外觀。
WPF樣式模型的另一個功能是表示和邏輯的分離,這意味着設計人員可以使用XAML處理應用程序的外觀,而開發人員則可以在其他地方處理編程邏輯。
另外,瞭解資源很重要,這些資源使樣式和模板可以重複使用。
資源
WPF資源是可以在應用程序中不同位置重用的對象。 資源的示例包括樣式,模板和顏色筆刷。 資源可以用代碼和XAML格式定義和引用。
每個框架級元素(FrameworkElement或FrameworkContentElement)都有一個Resources屬性(它是ResourceDictionary類型),其中包含已定義的資源。 由於所有元素都繼承自框架級元素,因此所有元素都可以定義資源。 但是,最常見的是在XAML文檔的根元素上定義資源。