最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

WPF 概述

2023-09-03 17:58 作者:小林家的垃圾王R  | 我要投稿


WPF 概述

本文內(nèi)容

  1. 使用 WPF 進(jìn)行編程

  2. 標(biāo)記和代碼隱藏

  3. 控制

  4. 輸入和命令

使用 Windows Presentation Foundation (WPF),你可以創(chuàng)建適用于 Windows 且具有非凡視覺效果的桌面客戶端應(yīng)用程序。

WPF 的核心是一個(gè)與分辨率無(wú)關(guān)且基于矢量的呈現(xiàn)引擎,旨在充分利用現(xiàn)代圖形硬件。 WPF ?通過(guò)一套完善的應(yīng)用程序開發(fā)功能對(duì)該核心進(jìn)行了擴(kuò)展,這些功能包括可擴(kuò)展應(yīng)用程序標(biāo)記語(yǔ)言 ?(XAML)、控件、數(shù)據(jù)綁定、布局、二維和三維圖形、動(dòng)畫、樣式、模板、文檔、媒體、文本和版式。 WPF 屬于 .NET,因此可以生成整合 ?.NET API 其他元素的應(yīng)用程序。

本概述適用于新用戶,介紹了 WPF 的主要功能和概念。

使用 WPF 進(jìn)行編程

WPF 作為大部分位于 System.Windows ?命名空間中的 .NET 類型的一個(gè)子集存在。 如果你之前使用托管技術(shù)(如 ASP.NET 和 Windows 窗體)通過(guò) .NET ?生成過(guò)應(yīng)用程序,則不會(huì)對(duì)基本的 WPF 編程體驗(yàn)感到陌生;你可以使用最喜歡的 .NET 編程語(yǔ)言(如 C# 或 Visual ?Basic)來(lái)完成實(shí)例化類、設(shè)置屬性、調(diào)用方法以及處理事件等操作。

WPF 還包括增強(qiáng)屬性和事件的其他編程構(gòu)造: 依賴項(xiàng)屬性 和 路由事件。

標(biāo)記和代碼隱藏

通過(guò) WPF,可以使用標(biāo)記和代碼隱藏開發(fā)應(yīng)用程序,這是 ASP.NET 開發(fā)人員已經(jīng)熟悉的體驗(yàn)。 通常使用 XAML 標(biāo)記實(shí)現(xiàn)應(yīng)用程序的外觀,同時(shí)使用托管編程語(yǔ)言(代碼隱藏)來(lái)實(shí)現(xiàn)其行為。 這種外觀和行為的分離具有以下優(yōu)點(diǎn):

  • 降低了開發(fā)和維護(hù)成本,因?yàn)樘囟ㄓ谕庥^的標(biāo)記與特定于行為的代碼不緊密耦合。

  • 開發(fā)效率更高,因?yàn)樵O(shè)計(jì)人員在實(shí)現(xiàn)應(yīng)用程序外觀的同時(shí),開發(fā)人員可以實(shí)現(xiàn)應(yīng)用程序的行為。

  • WPF 應(yīng)用程序的全球化和本地化 得以簡(jiǎn)化。

標(biāo)記

XAML 是一種基于 XML 的標(biāo)記語(yǔ)言,以聲明形式實(shí)現(xiàn)應(yīng)用程序的外觀。 通常用它創(chuàng)建窗口、對(duì)話框、頁(yè)和用戶控件,并填充控件、形狀和圖形。

下面的示例使用 XAML 來(lái)實(shí)現(xiàn)包含一個(gè)按鈕的窗口的外觀:

XAML <Window ? ? xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ? ? Title="Window with Button" ? ? Width="250" Height="100"> ? <!-- Add button to window --> ? <Button Name="button">Click Me!</Button> </Window>

具體而言,此 XAML 通過(guò)分別使用 WindowButton 元素來(lái)定義窗口和按鈕。 每個(gè)元素均配置了特性(如 Window 元素的 Title 特性)來(lái)指定窗口的標(biāo)題欄文本。 在運(yùn)行時(shí),WPF 會(huì)將標(biāo)記中定義的元素和特性轉(zhuǎn)換為 WPF 類的實(shí)例。 例如, Window 元素被轉(zhuǎn)換為 Window 類的實(shí)例,該類的 Title 屬性是 Title 特性的值。

下圖顯示上一個(gè)示例中的 XAML 定義的用戶界面 (UI):

由于 XAML 是基于 XML 的,因此使用它編寫的 UI 匯集在嵌套元素的層次結(jié)構(gòu)中,稱為 元素樹。 元素樹提供了一種直觀的邏輯方式來(lái)創(chuàng)建和管理 UI。

代碼隱藏

應(yīng)用程序的主要行為是實(shí)現(xiàn)響應(yīng)用戶交互的功能,包括處理事件(例如,單擊菜單、工具欄或按鈕)以及相應(yīng)地調(diào)用業(yè)務(wù)邏輯和數(shù)據(jù)訪問邏輯。 在 WPF 中,在與標(biāo)記相關(guān)聯(lián)的代碼中實(shí)現(xiàn)此行為。 此類代碼稱為代碼隱藏。 下面的示例演示上一個(gè)示例的更新標(biāo)記和代碼隱藏:

XAML <Window ? ? xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ? ? xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ? ? x:Class="SDKSample.AWindow" ? ? Title="Window with Button" ? ? Width="250" Height="100"> ? <!-- Add button to window --> ? <Button Name="button" Click="button_Click">Click Me!</Button> </Window> C# using System.Windows; // Window, RoutedEventArgs, MessageBox namespace SDKSample { ? ? public?partial?class AWindow : Window ? ? { ? ? ? ? public AWindow() ? ? ? ? { ? ? ? ? ? ? // InitializeComponent call is required to merge the UI ? ? ? ? ? ? // that is defined in markup with this class, including ? ? ? ? ? ? ? // setting properties and registering event handlers ? ? ? ? ? ? InitializeComponent(); ? ? ? ? } ? ? ? ? void button_Click(object sender, RoutedEventArgs e) ? ? ? ? { ? ? ? ? ? ? // Show message box when button is clicked. ? ? ? ? ? ? MessageBox.Show("Hello, Windows Presentation Foundation!"); ? ? ? ? } ? ? } }

在此示例中,代碼隱藏實(shí)現(xiàn)派生自 Window 類的類。 x:Class 特性用于將標(biāo)記與代碼隱藏類相關(guān)聯(lián)。 從代碼隱藏類的構(gòu)造函數(shù)調(diào)用 InitializeComponent,以將標(biāo)記中定義的 UI 與代碼隱藏類合并在一起。 (生成應(yīng)用程序時(shí)即會(huì)生成 InitializeComponent,因此不需要手動(dòng)實(shí)現(xiàn)它。)x:ClassInitializeComponent 的組合可確保在創(chuàng)建實(shí)現(xiàn)時(shí)正確地對(duì)其進(jìn)行初始化。 代碼隱藏類還可實(shí)現(xiàn)按鈕的 Click 事件的事件處理程序。 單擊該按鈕后,事件處理程序會(huì)通過(guò)調(diào)用 System.Windows.MessageBox.Show 方法顯示一個(gè)消息框。

下圖顯示單擊該按鈕后的結(jié)果:

控制

應(yīng)用程序模型帶來(lái)的用戶體驗(yàn)是構(gòu)造的控件。 在 WPF 中,控件是適用于 WPF 類這一類別的總括術(shù)語(yǔ),這些類托管在窗口或頁(yè)中、具有用戶界面并實(shí)現(xiàn)一些行為。

有關(guān)詳細(xì)信息,請(qǐng)參閱 控件。

按功能分類的 WPF 控件

下面列出了內(nèi)置的 WPF 控件:

  • 按鈕: Button 和 RepeatButton。

  • 數(shù)據(jù)顯示:DataGrid、ListView 和 TreeView。

  • 日期顯示和選項(xiàng): Calendar 和 DatePicker。

  • 對(duì)話框: OpenFileDialog、 PrintDialog和 SaveFileDialog。

  • 數(shù)字墨跡: InkCanvas 和 InkPresenter。

  • 文檔: DocumentViewer、 FlowDocumentPageViewer、 FlowDocumentReader、 FlowDocumentScrollViewer和 StickyNoteControl。

  • 輸入: TextBox、 RichTextBox和 PasswordBox。

  • 布局: Border、 BulletDecorator、 Canvas、 DockPanel、 Expander、 Grid、 GridView、 GridSplitter、 GroupBox、 Panel、 ResizeGrip、 Separator、 ScrollBar、 ScrollViewer、 StackPanel、 Thumb、 Viewbox、 VirtualizingStackPanel、 Window和 WrapPanel。

  • 媒體: Image、 MediaElement和 SoundPlayerAction。

  • 菜單: ContextMenu、 Menu和 ToolBar。

  • 導(dǎo)航: Frame、 Hyperlink、 Page、 NavigationWindow和 TabControl。

  • 選項(xiàng): CheckBox、 ComboBox、 ListBox、 RadioButton和 Slider。

  • 用戶信息: AccessText、 Label、 Popup、 ProgressBar、 StatusBar、 TextBlock和 ToolTip。

輸入和命令

最常檢測(cè)和響應(yīng)用戶輸入的控件。 WPF 輸入系統(tǒng) 使用直接事件和路由事件來(lái)支持文本輸入、焦點(diǎn)管理和鼠標(biāo)定位。

應(yīng)用程序通常具有復(fù)雜的輸入要求。 WPF 提供了命令系統(tǒng),用于將用戶輸入操作與對(duì)這些操作做出響應(yīng)的代碼分隔開來(lái)。

Layout

創(chuàng)建用戶界面時(shí),按照位置和大小排列控件以形成布局。 任何布局的一項(xiàng)關(guān)鍵要求都是適應(yīng)窗口大小和顯示設(shè)置的變化。 WPF 為你提供一流的可擴(kuò)展布局系統(tǒng),而不強(qiáng)制你編寫代碼以適應(yīng)這些情況下的布局。

布局系統(tǒng)的基礎(chǔ)是相對(duì)定位,這提高了適應(yīng)不斷變化的窗口和顯示條件的能力。 此外,該布局系統(tǒng)還可管理控件之間的協(xié)商以確定布局。 協(xié)商是一個(gè)兩步過(guò)程:首先,控件將需要的位置和大小告知父級(jí);其次,父級(jí)將控件可以有的空間告知控件。

該布局系統(tǒng)通過(guò)基 WPF 類公開給子控件。 對(duì)于通用的布局(如網(wǎng)格、堆疊和??浚琖PF 包括若干布局控件:

  • Canvas:子控件提供其自己的布局。

  • DockPanel:子控件與面板的邊緣對(duì)齊。

  • Grid:子控件由行和列定位。

  • StackPanel:子控件垂直或水平堆疊。

  • VirtualizingStackPanel:子控件在水平或垂直的行上虛擬化并排列。

  • WrapPanel:子控件按從左到右的順序定位,在當(dāng)前行上的控件超出允許的空間時(shí),換行到下一行。

下面的示例使用 DockPanel 布置幾個(gè) TextBox 控件:

XAML <Window ? ? xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ? ? xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ? ? x:Class="SDKSample.LayoutWindow" ? ? Title="Layout with the DockPanel" Height="143" Width="319"> ? ? ?<!--DockPanel to layout four text boxes--> ? ?<DockPanel> ? ? <TextBox DockPanel.Dock="Top">Dock = "Top"</TextBox> ? ? <TextBox DockPanel.Dock="Bottom">Dock = "Bottom"</TextBox> ? ? <TextBox DockPanel.Dock="Left">Dock = "Left"</TextBox> ? ? <TextBox Background="White">This TextBox "fills" the remaining space.</TextBox> ? </DockPanel> </Window>

DockPanel 允許子 TextBox 控件,以告訴它如何排列這些控件。 為了完成此操作,DockPanel 實(shí)現(xiàn) Dock 附加了屬性,該屬性公開給子控件,以允許每個(gè)子控件指定??繕邮?。

備注

由父控件實(shí)現(xiàn)以便子控件使用的屬性是 WPF 構(gòu)造,稱為附加屬性。

下圖顯示上一個(gè)示例中的 XAML 標(biāo)記的結(jié)果::

數(shù)據(jù)綁定

大多數(shù)應(yīng)用程序旨在為用戶提供查看和編輯數(shù)據(jù)的方法。 對(duì)于 WPF 應(yīng)用程序,已對(duì)存儲(chǔ)和訪問數(shù)據(jù)的工作提供技術(shù)(如 SQL Server 和 ?ADO.NET)。 訪問數(shù)據(jù)并將數(shù)據(jù)加載到應(yīng)用程序的托管對(duì)象后,WPF 應(yīng)用程序的復(fù)雜工作開始。 從根本上來(lái)說(shuō),這涉及到兩件事:

  1. 將數(shù)據(jù)從托管對(duì)象復(fù)制到控件,在控件中可以顯示和編輯數(shù)據(jù)。

  2. 確保使用控件對(duì)數(shù)據(jù)所做的更改將復(fù)制回托管對(duì)象。

為了簡(jiǎn)化應(yīng)用程序開發(fā),WPF 提供了一個(gè)數(shù)據(jù)綁定引擎來(lái)自動(dòng)執(zhí)行這些步驟。 數(shù)據(jù)綁定引擎的核心單元是 Binding 類,其工作是將控件(綁定目標(biāo))綁定到數(shù)據(jù)對(duì)象(綁定源)。 下圖闡釋了這種關(guān)系:

下一示例演示如何將 TextBox 綁定到自定義 Person 對(duì)象的實(shí)例。 下面的代碼演示了 Person 實(shí)現(xiàn):

C# namespace SDKSample { ? ? class Person ? ? { ? ? ? ? string name = "No Name"; ? ? ? ? public string Name ? ? ? ? { ? ? ? ? ? ? get { return name; } ? ? ? ? ? ? set { name = value; } ? ? ? ? } ? ? } }

下面的標(biāo)記將 TextBox 綁定到自定義 Person 對(duì)象的實(shí)例:

XAML <Window ? ? ?xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ? ? ?xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ? ? ?x:Class="SDKSample.DataBindingWindow"> ? ?<!-- Bind the TextBox to the data source (TextBox.Text to Person.Name) --> ? ?<TextBox Name="personNameTextBox" Text="{Binding Path=Name}" /> ?</Window> C# using System.Windows; // Window namespace SDKSample { ? ? public partial class DataBindingWindow : Window ? ? { ? ? ? ? public DataBindingWindow() ? ? ? ? { ? ? ? ? ? ? InitializeComponent(); ? ? ? ? ? ? // Create Person data source ? ? ? ? ? ? Person person = new Person(); ? ? ? ? ? ? // Make data source available for binding ? ? ? ? ? ? this.DataContext = person; ? ? ? ? } ? ? } }

在此示例中, Person 類在代碼隱藏中實(shí)例化并被設(shè)置為 DataBindingWindow的數(shù)據(jù)上下文。 在標(biāo)記中, Text 的 TextBox 屬性被綁定至 Person.Name 屬性(使用“{Binding ... }”XAML 語(yǔ)法)。 此 XAML 告知 WPF 將 TextBox 控件綁定至窗口的 Person 屬性中存儲(chǔ)的 DataContext 對(duì)象。

WPF 數(shù)據(jù)綁定引擎提供了額外支持,包括驗(yàn)證、排序、篩選和分組。 此外,數(shù)據(jù)綁定支持在標(biāo)準(zhǔn) WPF 控件顯示的用戶界面不恰當(dāng)時(shí),使用數(shù)據(jù)模板來(lái)為數(shù)據(jù)綁定創(chuàng)建自定義的用戶界面。

有關(guān)詳細(xì)信息,請(qǐng)參閱數(shù)據(jù)綁定概述。

顯卡

WPF 引入了一組廣泛、可伸縮的靈活圖形功能,具有以下優(yōu)點(diǎn):

  • 圖形與分辨率和設(shè)備均無(wú)關(guān)。 WPF 圖形系統(tǒng)中的基本度量單位是與設(shè)備無(wú)關(guān)的像素(即 1/96 英寸),且不考慮實(shí)際屏幕分辨率,并為實(shí)現(xiàn)與分辨率和設(shè)備無(wú)關(guān)的呈現(xiàn)提供了基礎(chǔ)。 每個(gè)與設(shè)備無(wú)關(guān)的像素都會(huì)自動(dòng)縮放,以匹配呈現(xiàn)它的系統(tǒng)的每英寸點(diǎn)數(shù) (dpi) 設(shè)置。

  • 精度更高。 WPF 坐標(biāo)系統(tǒng)使用雙精度浮點(diǎn)數(shù)字度量,而不是單精度數(shù)字。 轉(zhuǎn)換和不透明度值也表示為雙精度數(shù)字。 WPF 還支持廣泛的顏色域 (scRGB),并集成了對(duì)管理來(lái)自不同顏色空間的輸入的支持。

  • 高級(jí)圖形和動(dòng)畫支持。 WPF 通過(guò)為你管理動(dòng)畫場(chǎng)景簡(jiǎn)化了圖形編程,你無(wú)需擔(dān)心場(chǎng)景處理、呈現(xiàn)循環(huán)和雙線性內(nèi)插。 此外,WPF 還提供了點(diǎn)擊測(cè)試支持和全面的 alpha 合成支持。

  • 硬件加速。 WPF 圖形系統(tǒng)充分利用圖形硬件來(lái)盡量降低 CPU 使用率。

二維形狀

WPF 提供一個(gè)常用矢量繪制的二維形狀庫(kù),如下圖中所示的矩形和橢圓:

形狀的一個(gè)有趣功能是它們不只是用于顯示;形狀實(shí)現(xiàn)許多你期望的控件功能,包括鍵盤和鼠標(biāo)輸入。 下面的示例演示要處理的 MouseUp 的 Ellipse 事件:

XAML <Window ? ? ?xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ? ? xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ? ? x:Class="SDKSample.EllipseEventHandlingWindow" ? ? Title="Click the Ellipse"> ? ? <Ellipse Name="clickableEllipse" Fill="Blue" MouseUp="clickableEllipse_MouseUp" /> </Window> C# using System.Windows; // Window, MessageBox using System.Windows.Input; // MouseButtonEventHandler namespace SDKSample { ? ? public partial class EllipseEventHandlingWindow : Window ? ? { ? ? ? ? public EllipseEventHandlingWindow() ? ? ? ? { ? ? ? ? ? ? InitializeComponent(); ? ? ? ? } ? ? ? ? void clickableEllipse_MouseUp(object sender, MouseButtonEventArgs e) ? ? ? ? { ? ? ? ? ? ? // Display a message ? ? ? ? ? ? MessageBox.Show("You clicked the ellipse!"); ? ? ? ? } ? ? } }

下圖顯示了前面的代碼生成的內(nèi)容:

有關(guān)詳細(xì)信息,請(qǐng)參閱 WPF 中的形狀和基本繪圖概述。

二維幾何圖形

WPF 提供的二維形狀包含基本形狀的標(biāo)準(zhǔn)集。 但是,你可能需要?jiǎng)?chuàng)建自定義形狀以幫助改進(jìn)自定義用戶界面的設(shè)計(jì)。 為此,WPF 提供了幾何圖形。 下圖演示了使用幾何圖形來(lái)創(chuàng)建可直接繪制、用作畫筆或用于剪輯其他形狀和控件的自定義形狀。

Path 對(duì)象可用于繪制封閉式或開放式形狀、多個(gè)形狀,甚至曲線形狀。

Geometry 對(duì)象可用于剪輯、命中測(cè)試以及呈現(xiàn)二維圖形數(shù)據(jù)。

有關(guān)詳細(xì)信息,請(qǐng)參閱幾何圖形概述。

二維效果

WPF 二維功能的子集包括視覺效果,如漸變、位圖、繪圖、用視頻繪畫、旋轉(zhuǎn)、縮放和傾斜。 這些效果都可以使用畫筆實(shí)現(xiàn);下圖演示了一些示例:

有關(guān)詳細(xì)信息,請(qǐng)參閱 WPF 畫筆概述。

三維呈現(xiàn)

WPF 還包括三維呈現(xiàn)功能,這些功能與二維圖形集成,以創(chuàng)建更精彩、更有趣的用戶界面。 例如,下圖顯示呈現(xiàn)在三維形狀上的二維圖像:

有關(guān)詳細(xì)信息,請(qǐng)參閱三維圖形概述。

動(dòng)畫

WPF 動(dòng)畫支持可以使控件變大、抖動(dòng)、旋轉(zhuǎn)和淡出,以形成有趣的頁(yè)面過(guò)渡等。 你可以對(duì)大多數(shù) WPF 類,甚至自定義類進(jìn)行動(dòng)畫處理。 下圖顯示了運(yùn)行中的一個(gè)簡(jiǎn)單動(dòng)畫:

有關(guān)詳細(xì)信息,請(qǐng)參閱動(dòng)畫概述。

媒體

傳達(dá)豐富內(nèi)容的一種方法是使用視聽媒體。 WPF 為圖像、視頻和音頻提供特殊支持。

圖像

圖像對(duì)大多數(shù)應(yīng)用程序很常見,WPF 提供多種方式來(lái)使用它們。 下圖顯示一個(gè)用戶界面,該用戶界面中的列表框中包含縮略圖圖像。 選中一個(gè)縮略圖后,將顯示該圖像的原尺寸。

有關(guān)詳細(xì)信息,請(qǐng)參閱圖像概述。

視頻和音頻

MediaElement 控件能夠播放視頻和音頻,并且其足夠靈活,可以用作其他自定義媒體播放器的基礎(chǔ)。 下面的 XAML 標(biāo)記實(shí)現(xiàn)一個(gè)媒體播放器:

XAML <MediaElement ? ?Name="myMediaElement" ? ?Source="media/wpf.wmv" ? ?LoadedBehavior="Manual" ? ?Width="350" Height="250" />

下圖中的窗口顯示了運(yùn)行中的 MediaElement 控件:

有關(guān)詳細(xì)信息,請(qǐng)參閱圖形和多媒體。

文本和版式

為了促進(jìn)高質(zhì)量的文本呈現(xiàn),WPF 提供以下功能:

  • OpenType 字體支持。

  • ClearType 增強(qiáng)功能。

  • 利用硬件加速的高性能。

  • 文本與媒體、圖形和動(dòng)畫的集成。

  • 國(guó)際字體支持和回退機(jī)制。

作為文本與圖形集成的演示,下圖顯示了文本修飾的應(yīng)用程序:

有關(guān)詳細(xì)信息,請(qǐng)參閱 Windows Presentation Foundation 中的版式。

自定義 WPF 應(yīng)用

到目前為止,你已經(jīng)了解用于開發(fā)應(yīng)用程序的核心 WPF 構(gòu)建塊。 你可以使用該應(yīng)用程序模型來(lái)托管和交付應(yīng)用程序內(nèi)容,它主要由控件組成。 ?若要簡(jiǎn)化用戶界面中控件的排列,并確保保持該排列能夠應(yīng)對(duì)窗口大小和顯示設(shè)置的更改,你可以使用 WPF 布局系統(tǒng)。 ?由于大多數(shù)應(yīng)用程序允許用戶與數(shù)據(jù)交互,因此你可以使用數(shù)據(jù)綁定來(lái)減少將用戶界面與數(shù)據(jù)集成的工作。 若要增強(qiáng)你應(yīng)用程序的可視化外觀,可以使用 WPF ?提供的綜合圖形、動(dòng)畫和媒體支持。

不過(guò),在創(chuàng)建和管理真正獨(dú)特且視覺效果非凡的用戶體驗(yàn)時(shí),基礎(chǔ)知識(shí)通常是不夠的。 標(biāo)準(zhǔn)的 WPF 控件可能無(wú)法與你所需的應(yīng)用程序外觀集成。 ?數(shù)據(jù)可能不會(huì)以最有效的方式顯示。 你應(yīng)用程序的整體用戶體驗(yàn)可能不適合 Windows 主題的默認(rèn)外觀和感覺。 ?在許多方面,演示技術(shù)需要視覺擴(kuò)展性,需要的程度與任何其他類型的擴(kuò)展性一樣。

為此,WPF 提供了多種機(jī)制用于創(chuàng)建獨(dú)特的用戶體驗(yàn),包括控件、觸發(fā)器、控件和數(shù)據(jù)模板、樣式、用戶界面資源以及主題和皮膚的豐富內(nèi)容模型。

內(nèi)容模型

大多數(shù) WPF 控件的主要用途是顯示內(nèi)容。 在 WPF 中,可以構(gòu)成控件內(nèi)容的項(xiàng)的類型和數(shù)目稱為控件的 內(nèi)容模型。 某些控件可以包含一種內(nèi)容類型的一個(gè)項(xiàng);例如, TextBox 的內(nèi)容是分配給 Text 屬性的一個(gè)字符串值。 下面的示例設(shè)置 TextBox 的內(nèi)容:

XAML <Window ? ? xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ? ? xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ? ? x:Class="SDKSample.TextBoxContentWindow" ? ? Title="TextBox Content"> ? ? <TextBox Text="This is the content of a TextBox." /> </Window>

下圖顯示結(jié)果:

但是,其他控件可以包含不同內(nèi)容類型的多個(gè)項(xiàng); Button的內(nèi)容(由 Content 屬性指定)可以包含各種項(xiàng)(包括布局控件、文本、圖像和形狀)。 下面的示例演示了 Button,其內(nèi)容包括 DockPanel、Label、Border 和 MediaElement:

XAML <Window ? ? xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ? ? xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ? ? x:Class="SDKSample.ButtonContentWindow" ? ? Title="Button Content"> ? <Button Margin="20"> ? ? <!-- Button Content --> ? ? <DockPanel Width="200" Height="180"> ? ? ? <Label DockPanel.Dock="Top" HorizontalAlignment="Center">Click Me!</Label> ? ? ? <Border Background="Black" BorderBrush="Yellow" BorderThickness="2" ? ? ? ? CornerRadius="2" Margin="5"> ? ? ? ? <MediaElement Source="media/wpf.wmv" Stretch="Fill" /> ? ? ? </Border> ? ? </DockPanel> ? </Button> </Window>

下圖顯示此按鈕的內(nèi)容:

有關(guān)各種控件支持的內(nèi)容類型的詳細(xì)信息,請(qǐng)參閱 WPF 內(nèi)容模型。

觸發(fā)器

盡管 XAML 標(biāo)記的主要用途是實(shí)現(xiàn)應(yīng)用程序的外觀,你也可以使用 XAML 來(lái)實(shí)現(xiàn)應(yīng)用程序行為的某些方面。 其中一個(gè)示例是使用觸發(fā)器來(lái)基于用戶交互更改應(yīng)用程序的外觀。 有關(guān)詳細(xì)信息,請(qǐng)參閱樣式和模板。

控件模板

WPF 控件的默認(rèn)用戶界面通常是從其他控件和形狀構(gòu)造的。 例如, Button 由 ButtonChrome 和 ContentPresenter 控件組成。 ButtonChrome 提供了標(biāo)準(zhǔn)按鈕外觀,而 ContentPresenter 顯示按鈕的內(nèi)容,正如 Content 屬性所指定。

有時(shí),某個(gè)控件的默認(rèn)外觀可能與應(yīng)用程序的整體外觀不一致。 在這種情況下,可以使用 ControlTemplate 更改控件的用戶界面的外觀,而不更改其內(nèi)容和行為。

下面的示例演示如何使用 Button 更改 ControlTemplate 的外觀:

XAML <Window ? ?xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ? xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ? x:Class="SDKSample.ControlTemplateButtonWindow" ? Title="Button with Control Template" Height="158" Width="290"> ? <!-- Button using an ellipse --> ? <Button Content="Click Me!" Click="button_Click"> ? ? <Button.Template> ? ? ? <ControlTemplate TargetType="{x:Type Button}"> ? ? ? ? <Grid Margin="5"> ? ? ? ? ? <Ellipse Stroke="DarkBlue" StrokeThickness="2"> ? ? ? ? ? ? <Ellipse.Fill> ? ? ? ? ? ? ? <RadialGradientBrush Center="0.3,0.2" RadiusX="0.5" RadiusY="0.5"> ? ? ? ? ? ? ? ? <GradientStop Color="Azure" Offset="0.1" /> ? ? ? ? ? ? ? ? <GradientStop Color="CornflowerBlue" Offset="1.1" /> ? ? ? ? ? ? ? </RadialGradientBrush> ? ? ? ? ? ? </Ellipse.Fill> ? ? ? ? ? </Ellipse> ? ? ? ? ? <ContentPresenter Name="content" HorizontalAlignment="Center" ? ? ? ? ? ? ?VerticalAlignment="Center"/> ? ? ? ? </Grid> ? ? ? </ControlTemplate> ? ? </Button.Template> ? </Button> </Window> C# using System.Windows; // Window, RoutedEventArgs, MessageBox namespace SDKSample { ? ? public partial class ControlTemplateButtonWindow : Window ? ? { ? ? ? ? public ControlTemplateButtonWindow() ? ? ? ? { ? ? ? ? ? ? InitializeComponent(); ? ? ? ? } ? ? ? ? void button_Click(object sender, RoutedEventArgs e) ? ? ? ? { ? ? ? ? ? ? // Show message box when button is clicked ? ? ? ? ? ? MessageBox.Show("Hello, Windows Presentation Foundation!"); ? ? ? ? } ? ? } }

在此示例中,默認(rèn)按鈕用戶界面已被替換為 Ellipse ,它具有深藍(lán)色邊框并使用 RadialGradientBrush進(jìn)行填充。 ContentPresenter 控件顯示內(nèi)容 Button"Click Me!"。單擊 Button 時(shí),仍會(huì)引發(fā) Click 事件,這是 Button 控件的默認(rèn)行為。 結(jié)果如下圖所示:

數(shù)據(jù)模板

使用控件模板可以指定控件的外觀,而使用數(shù)據(jù)模板則可以指定控件內(nèi)容的外觀。 數(shù)據(jù)模板經(jīng)常用于改進(jìn)綁定數(shù)據(jù)的顯示方式。 下圖顯示 ListBox 的默認(rèn)外觀,它綁定到 Task 對(duì)象的集合,其中每個(gè)任務(wù)都具有名稱、描述和優(yōu)先級(jí):

默認(rèn)外觀是你對(duì) ListBox的期望。 但是,每個(gè)任務(wù)的默認(rèn)外觀僅包含任務(wù)名稱。 若要顯示任務(wù)名稱、描述和優(yōu)先級(jí),必須使用 ListBox 更改 DataTemplate控件綁定列表項(xiàng)的默認(rèn)外觀。 下面的 XAML 定義了此類 DataTemplate,它通過(guò)使用 ItemTemplate 屬性應(yīng)用于每個(gè)任務(wù):

XAML <Window ? xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ? xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ? x:Class="SDKSample.DataTemplateWindow" ? Title="With a Data Template"> ? <Window.Resources> ? ? <!-- Data Template (applied to each bound task item in the task collection) --> ? ? <DataTemplate x:Key="myTaskTemplate"> ? ? ? <Border Name="border" BorderBrush="DarkSlateBlue" BorderThickness="2" ? ? ? ? CornerRadius="2" Padding="5" Margin="5"> ? ? ? ? <Grid> ? ? ? ? ? <Grid.RowDefinitions> ? ? ? ? ? ? <RowDefinition/> ? ? ? ? ? ? <RowDefinition/> ? ? ? ? ? ? <RowDefinition/> ? ? ? ? ? </Grid.RowDefinitions> ? ? ? ? ? <Grid.ColumnDefinitions> ? ? ? ? ? ? <ColumnDefinition Width="Auto" /> ? ? ? ? ? ? <ColumnDefinition /> ? ? ? ? ? </Grid.ColumnDefinitions> ? ? ? ? ? <TextBlock Grid.Row="0" Grid.Column="0" Padding="0,0,5,0" Text="Task Name:"/> ? ? ? ? ? <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Path=TaskName}"/> ? ? ? ? ? <TextBlock Grid.Row="1" Grid.Column="0" Padding="0,0,5,0" Text="Description:"/> ? ? ? ? ? <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Path=Description}"/> ? ? ? ? ? <TextBlock Grid.Row="2" Grid.Column="0" Padding="0,0,5,0" Text="Priority:"/> ? ? ? ? ? <TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding Path=Priority}"/> ? ? ? ? </Grid> ? ? ? </Border> ? ? </DataTemplate> ? </Window.Resources> ? <!-- UI --> ? <DockPanel> ? ? <!-- Title --> ? ? <Label DockPanel.Dock="Top" FontSize="18" Margin="5" Content="My Task List:"/> ? ? <!-- Data template is specified by the ItemTemplate attribute --> ? ? <ListBox ? ? ? ItemsSource="{Binding}" ? ? ? ItemTemplate="{StaticResource myTaskTemplate}" ? ? ? HorizontalContentAlignment="Stretch" ? ? ? IsSynchronizedWithCurrentItem="True" ? ? ? Margin="5,0,5,5" /> ?</DockPanel> </Window>

下圖顯示了此代碼的作用:

注意, ListBox 已保留其行為和整體外觀;僅列表框顯示的內(nèi)容外觀已更改。

有關(guān)詳細(xì)信息,請(qǐng)參閱數(shù)據(jù)模板化概述。

樣式

通過(guò)樣式功能,開發(fā)人員和設(shè)計(jì)人員能夠?qū)ζ洚a(chǎn)品的特定外觀進(jìn)行標(biāo)準(zhǔn)化。 WPF 提供了一個(gè)強(qiáng)樣式模型,其基礎(chǔ)是 Style 元素。 下面的示例創(chuàng)建一個(gè)樣式,該樣式將窗口上的每個(gè) Button 的背景色設(shè)置為 Orange

XAML <Window ? ? xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ? ? xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ? ? x:Class="SDKSample.StyleWindow" ? ? Title="Styles"> ? ? ? ? ?<Window.Resources> ? ? ? ? <!-- Style that will be applied to all buttons for this window --> ? ? ? ? <Style TargetType="{x:Type Button}"> ? ? ? ? ? ? <Setter Property="Background" Value="Orange" /> ? ? ? ? ? ? <Setter Property="BorderBrush" Value="Crimson" /> ? ? ? ? ? ? <Setter Property="FontSize" Value="20" /> ? ? ? ? ? ? <Setter Property="FontWeight" Value="Bold" /> ? ? ? ? ? ? <Setter Property="Margin" Value="5" /> ? ? ? ? </Style> ? ? </Window.Resources> ? ? <StackPanel> ? ? ? ? <!-- This button will have the style applied to it --> ? ? ? ? <Button>Click Me!</Button> ? ? ? ? <!-- This label will not have the style applied to it --> ? ? ? ? <Label>Don't Click Me!</Label> ? ? ? ? <!-- This button will have the style applied to it --> ? ? ? ? <Button>Click Me!</Button> ? ? ? ? ? ? ?</StackPanel> </Window>

由于此樣式針對(duì)所有 Button 控件,因此將自動(dòng)應(yīng)用于窗口中的所有按鈕,如下圖所示:

有關(guān)詳細(xì)信息,請(qǐng)參閱樣式和模板。

資源

應(yīng)用程序中的控件應(yīng)共享相同的外觀,它可以包括從字體和背景色到控件模板、數(shù)據(jù)模板和樣式的所有內(nèi)容。 你可以對(duì)用戶界面資源使用 WPF 支持,以將這些資源封裝在一個(gè)位置以便重復(fù)使用。

下面的示例定義 Button 和 Label共享的通用背景色:

XAML <Window ? ? xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ? ? xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ? ? x:Class="SDKSample.ResourcesWindow" ? ? Title="Resources Window"> ? <!-- Define window-scoped background color resource --> ? <Window.Resources> ? ? <SolidColorBrush x:Key="defaultBackground" Color="Red" /> ? </Window.Resources> ? <!-- Button background is defined by window-scoped resource --> ? <Button Background="{StaticResource defaultBackground}">One Button</Button> ? <!-- Label background is defined by window-scoped resource --> ? <Label Background="{StaticResource defaultBackground}">One Label</Label> </Window>

此示例通過(guò)使用 Window.Resources 屬性元素實(shí)現(xiàn)背景色資源。 此資源可供 Window的所有子級(jí)使用。 有各種資源作用域,具體如下(按解析順序列出):

  1. 單個(gè)控件(使用繼承的 System.Windows.FrameworkElement.Resources 屬性)。

  2. Window 或 Page (也使用繼承的 System.Windows.FrameworkElement.Resources 屬性)。

  3. Application (使用 System.Windows.Application.Resources 屬性)。

這些不同種類的作用域在定義和共享資源的方式方面為你提供了靈活性。

作為直接將你的資源與特定作用域關(guān)聯(lián)的替代方法,可以通過(guò)使用單獨(dú)的 ResourceDictionary (可以在應(yīng)用程序的其他部分引用)打包一個(gè)或多個(gè)資源。 例如,下面的示例定義資源字典中的默認(rèn)背景色:

XAML <ResourceDictionary ? ? xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ? ? xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> ? <!-- Define background color resource --> ? <SolidColorBrush x:Key="defaultBackground" Color="Red" /> ? <!-- Define other resources --> </ResourceDictionary>

下面的示例引用上一個(gè)示例中定義的資源字典,以便在應(yīng)用程序中共享它:

XAML <Application ? ? xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ? ? xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ? ? x:Class="SDKSample.App"> ? <Application.Resources> ? ? <ResourceDictionary> ? ? ? <ResourceDictionary.MergedDictionaries> ? ? ? ? <ResourceDictionary Source="BackgroundColorResources.xaml"/> ? ? ? </ResourceDictionary.MergedDictionaries> ? ? </ResourceDictionary> ? </Application.Resources> </Application>

資源和資源字典是 WPF 主題和皮膚支持的基礎(chǔ)。

有關(guān)詳細(xì)信息,請(qǐng)參閱資源。

自定義控件

盡管 WPF 提供了大量自定義支持,但你仍可能會(huì)遇到現(xiàn)有 WPF 控件不滿足你的應(yīng)用程序或其用戶的需求的情況。 出現(xiàn)這種情況的原因有:

  • 不能通過(guò)自定義現(xiàn)有 WPF 實(shí)現(xiàn)的外觀和感覺創(chuàng)建所需的用戶界面。

  • 現(xiàn)有 WPF 實(shí)現(xiàn)不支持(或很難支持)所需的行為。

但是,此時(shí),你可以充分利用三個(gè) WPF 模型中的一個(gè)來(lái)創(chuàng)建新的控件。 每個(gè)模型都針對(duì)一個(gè)特定的方案并要求你的自定義控件派生自特定 WPF 基類。 下面列出了這三個(gè)模型:

  • 用戶控件模型。 自定義控件派生自 UserControl 并由一個(gè)或多個(gè)其他控件組成。

  • 控件模型。 自定義控件派生自 Control ,并用于生成使用模板將其行為與其外觀分隔開來(lái)的實(shí)現(xiàn),非常類似大多數(shù) WPF 控件。 派生自 Control 使得你可以更自由地創(chuàng)建自定義用戶界面(相較用戶控件),但它可能需要花費(fèi)更多精力。

  • 框架元素模型。 當(dāng)其外觀由自定義呈現(xiàn)邏輯(而不是模板)定義時(shí),自定義控件派生自 FrameworkElement 。

下面的示例演示一個(gè)派生自 UserControl 的自定義數(shù)值加/減控件:

XAML <UserControl ? xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ? xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ? x:Class="SDKSample.NumericUpDown"> ? <Grid> ? ? <Grid.RowDefinitions> ? ? ? <RowDefinition/> ? ? ? <RowDefinition/> ? ? </Grid.RowDefinitions> ? ? <Grid.ColumnDefinitions> ? ? ? <ColumnDefinition/> ? ? ? <ColumnDefinition/> ? ? </Grid.ColumnDefinitions> ? ? <!-- Value text box --> ? ? <Border BorderThickness="1" BorderBrush="Gray" Margin="2" Grid.RowSpan="2" ? ? ? ?VerticalAlignment="Center" HorizontalAlignment="Stretch"> ? ? ? <TextBlock Name="valueText" Width="60" TextAlignment="Right" Padding="5"/> ? ? </Border> ? ? <!-- Up/Down buttons --> ? ? <RepeatButton Name="upButton" Click="upButton_Click" Grid.Column="1" ? ? ? ?Grid.Row="0">Up</RepeatButton> ? ? <RepeatButton Name="downButton" Click="downButton_Click" Grid.Column="1" ? ? ? ?Grid.Row="1">Down</RepeatButton> ? </Grid> </UserControl> C# using System; // EventArgs using System.Windows; // DependencyObject, DependencyPropertyChangedEventArgs, ? ? ? ? ? ? ? ? ? ? ? // FrameworkPropertyMetadata, PropertyChangedCallback, ? ? ? ? ? ? ? ? ? ? ? // RoutedPropertyChangedEventArgs using System.Windows.Controls; // UserControl namespace SDKSample { ? ? public partial class NumericUpDown : UserControl ? ? { ? ? ? ? // NumericUpDown user control implementation ? ? } }

下面的示例說(shuō)明了將用戶控件合并到 Window 所需的 XAML:

XAML <Window ? ? xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ? ? xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ? ? x:Class="SDKSample.UserControlWindow" ? ? xmlns:local="clr-namespace:SDKSample" ? ? ?Title="User Control Window"> ? <!-- Numeric Up/Down user control --> ? <local:NumericUpDown /> </Window>

下圖顯示了 NumericUpDown 中托管的 Window 控件:

有關(guān)自定義控件的詳細(xì)信息,請(qǐng)參閱控件創(chuàng)作概述。

WPF 最佳做法

與任何開發(fā)平臺(tái)一樣,可以采用多種方式使用 WPF 以實(shí)現(xiàn)所需的結(jié)果。 為確保你的 WPF 應(yīng)用程序提供所需的用戶體驗(yàn)并滿足一般用戶的需求,針對(duì)輔助功能、全球化和本地化以及性能提供了一些建議的最佳做法。 有關(guān)詳細(xì)信息,請(qǐng)參閱:

  • 輔助功能

  • WPF 全球化和本地化

  • WPF 應(yīng)用性能

  • WPF 安全性

后續(xù)步驟

我們已經(jīng)了解了 WPF 的主要功能。 現(xiàn)在可以生成你的第一個(gè) WPF 應(yīng)用。


另請(qǐng)參閱

  • WPF 入門

  • Windows Presentation Foundation

  • WPF 社區(qū)資源


WPF 概述的評(píng)論 (共 條)

使用qq登录你需要登录后才可以评论。
宁阳县| 辽阳市| 鄂州市| 平昌县| 浪卡子县| 阿巴嘎旗| 林州市| 政和县| 晋江市| 大方县| 历史| 清苑县| 昌图县| 耒阳市| 南江县| 夏津县| 凤凰县| 莆田市| 伊金霍洛旗| 阆中市| 沧州市| 泾川县| 兴隆县| 家居| 台中县| 正定县| 铜山县| 淮南市| 恭城| 尼玛县| 杭州市| 和硕县| 元朗区| 保康县| 南充市| 呈贡县| 平利县| 西乡县| 翁牛特旗| 仁布县| 云龙县|