當前位置:編程學習大全網 - 編程語言 - WPF的介紹

WPF的介紹

本主題概述了WPF可視化圖層。本主題重點介紹WPF模型中渲染所支持的可視類的作用。

可視對象的角色可視類是基本的抽象,每個FrameworkElement對象都是從它派生的。它也是在WPF中編寫新控件的入口點。在Win應用程序模型中,這個類在很多方面都可以看作是壹個窗口句柄(HWND)。

可視對象是WPF的核心對象,其主要作用是提供渲染支持。用戶界面控件(如Button和TextBox)派生自Visual類,用於維護它們所呈現的數據。可視對象支持以下功能。

輸出顯示呈現可視對象的持久序列化繪圖內容。

轉換對可視對象執行轉換。

剪輯為可視對象提供剪輯區域支持。

點擊測試確定視覺對象的邊界是否包含坐標或幾何形狀。

邊界框計算確定視覺對象的邊界。

但是,可視對象不支持非呈現功能,如事件處理。

◆布局

◆風格

◆數據綁定

◆全球化

Visual被公開為壹個公共抽象類,必須從該類派生子類。下圖顯示了WPF中暴露的視覺對象的層次結構。

可視化類的層次結構

DrawingVisual類DrawingVisual是壹個輕量級繪圖類,用於呈現形狀、圖像或文本。該類被認為是輕量級的,因為它不提供布局或事件處理函數,而這些函數可以提高運行時性能,因此drawing最適合於背景和剪貼畫。

Viewport DVisual類Viewport DVisual在2D可視對象和可視D對象之間架起了壹座橋梁。Visual D class是所有3D可視元素的基類。視口視口要求您定義壹個攝影機值和壹個視口值。妳可以在照相機的幫助下觀看這個場景。映射到2D繪圖的區域稱為查看區域。

ContainerVisual類ContainerVisual類用作壹組可視對象的容器。DrawingVisual類是從ContainerVisual類派生的,這允許它包含Visual對象的集合。

視覺對象中的繪圖內容視覺對象將其演示數據保存為矢量圖形指令列表。指令表中的每壹項都以序列化格式表示壹組低級圖形數據及其相關資源。* * *有四種不同類型的演示數據可以包含圖形內容。

使用DrawingContext,您可以用可視內容填充Visual。當使用DrawingContext對象的drawing命令時,實際上是存儲了壹組渲染數據,供圖形系統在未來使用,而不是實時繪制到屏幕上。

當您創建WPF控件(如按鈕)時,該控件將隱式生成繪圖對象本身的呈現數據。例如,設置按鈕的Content屬性將導致控件存儲標誌符號的呈現形式。

Visual將其內容描述為DrawingGroup中包含的壹個或多個繪圖對象。DrawingGroup還描述了應用於其內容的不透明蒙版變換位圖效果和其他操作。呈現內容時,DrawingGroup操作會應用不透明度蒙版不透明度位圖效果剪輯幾何指導原則集,並按以下順序進行轉換。

下圖顯示了DrawingGroup操作在渲染過程中的應用順序。

繪圖組操作的順序

可視化層中的繪圖內容永遠不能直接實例化DrawingContext,但可以通過壹些方法來實現。

(例如,DrawingGroup :: Open和DrawingVisual :: RenderOpen)獲取DrawingContext以下示例從DrawingVisual中檢索繪圖上下文,並使用它來繪制壹個矩形。

在可視級別枚舉繪圖內容。此外,繪圖對象還可以提供用於枚舉可視內容的對象模型。

說明在枚舉可視化層的內容時,妳相當於檢索到了繪圖對象,而不是以矢量圖形指令列表的形式對渲染數據進行基本表示。下面的示例使用GetDrawing方法檢索Visual的DrawingGroup值並枚舉該值。

如何使用可視化對象生成控件?WPF中的許多對象由其他可視對象組成,這意味著它們可以包含子對象的各種層次結構。WPF中的許多用戶界面元素(如控件)由表示不同類型的表示元素的多個可視對象組成。例如,Button控件可以包含許多其他對象,包括classicbordecorator content presenter和TextBlock。

下面的代碼顯示了標記中定義的按鈕控件。

如果您想要枚舉包含默認按鈕控件的可視對象,您會發現可視對象的層次結構如下所示。

可視化樹層次結構圖

Button控件包含壹個ClassicBorderDecorator元素,該元素又包含壹個ContentPresenter元素。ClassicBorderDecorator元素負責繪制按鈕的邊框和背景,ContentPresenter元素負責在此頁面中顯示按鈕的內容。在該示例中,因為您希望顯示文本,所以ContentPresenter元素包含壹個TextBlock元素。Button控件使用ContentPresenter,這意味著控件的內容可以用其他元素(如Image)或幾何形狀(如EllipseGeometry)來表示。

將控件擴展到控件層次結構中的關鍵是,控件模板為控件指定了默認的可視層次結構。當您顯式引用壹個控件時,您將隱式引用它的視覺層次結構。您可以重寫控件模板的默認值,為控件創建自定義視覺外觀。例如,您可以修改Button控件的背景色值,以便它使用線性漸變顏色值而不是純色值。

用戶界面元素(如按鈕控件)包含幾個矢量圖形指令列表,它們描述了控件的所有呈現定義。下面的代碼顯示了標記中定義的按鈕控件。

如果要枚舉包含按鈕控件的可視對象和矢量圖形指令的列表

妳會發現壹個可視化的對象層次,如下所示。

可視化樹和演示數據圖

Button控件包含壹個ClassicBorderDecorator元素,該元素又包含壹個ContentPresenter元素。ClassicBorderDecorator元素負責繪制構成按鈕邊框和背景的所有離散圖形元素,ContentPresenter元素負責顯示按鈕內部。在本例中,因為您想要顯示壹個圖像,所以ContentPresenter元素包含壹個Image元素。

視覺對象的層次結構和矢量圖形指令表有很多需要註意的地方。

該層級中的等級指示繪圖信息的呈現順序。從可視元素的根開始,從左到右和從上到下遍歷子元素。如果壹個元素有可視的子元素,那麽首先遍歷該元素的子元素,然後遍歷該元素的兄弟元素。

層次結構中的非葉節點元素(如ContentPresenter)用於包含子元素,它們不包含指令列表。

如果壹個可視元素同時包含壹個矢量圖形指令列表和壹個可視子對象,則父可視元素中的指令列表將首先顯示,然後顯示任何可視子對象中的圖形。

矢量圖形指令列表中的項目從左到右顯示。

視覺樹包含應用程序的用戶界面使用的所有視覺元素。因為可視元素包含持久的繪圖信息,所以您可以將可視樹視為場景圖,其中包含將輸出寫入顯示設備所需的所有表示信息。該樹集合了應用程序在代碼或標記中直接創建的所有可視元素。視覺樹還包含由元素的模板擴展功能創建的所有視覺元素(例如控件和數據對象)。

以下代碼顯示了標記中定義的StackPanel元素。

如果您想在標記示例中枚舉包含StackPanel元素的可視對象,您會發現可視對象的層次結構如下所示。

可視化樹層次結構圖

呈現順序可以由可視化樹來確定。WPF可視化對象和繪圖對象的呈現順序將從位於可視化樹中最頂端節點的可視化元素的根開始遍歷,然後可視化元素的根的子元素將從左向右遍歷。如果可視化元素具有子元素,則將首先遍歷可視化元素的子元素,然後遍歷其兄弟元素,這意味著子可視化元素的內容將在可視化元素本身的內容之前呈現。

顯示可視化樹順序的圖表。

視覺元素的根是視覺樹層次結構中的頂層元素。在大多數應用程序中,可視元素根的基類是Window或NavigationWindow,但如果您在Win應用程序中托管可視對象,則可視元素的根將是Win窗口中托管的頂級可視元素。

與邏輯樹的關系WPF中的邏輯樹表示運行時應用程序的元素。雖然不直接操作樹,但是應用程序視圖對於理解屬性繼承和事件路由非常有用。與可視化樹不同,邏輯樹可以表示非可視化數據對象(如ListItem)。在許多情況下,邏輯樹緊密地映射到應用程序的標記定義。以下代碼顯示了標記中定義的DockPanel元素。

如果您在標記示例中枚舉包含DockPanel元素的邏輯對象,您會發現邏輯對象的層次結構如下所示。

邏輯樹圖

視覺樹和邏輯樹與應用程序元素的當前集合同步,並且反映元素的任何添加、刪除或修改,但是這些樹表示不同的應用程序視圖和視覺樹。不同的邏輯樹不展開控件的ContentPresenter元素,也就是說同壹組對象的邏輯樹和可視化樹之間沒有直接的壹壹對應關系,實際上是用同壹個元素作為參數。調用LogicalTreeHelper對象的GetChildren方法和調用VisualTreeHelper對象的GetChild方法會產生不同的結果。

使用XamlPad查看可視化樹WPF工具(XamlPad)提供了查看和瀏覽可視化樹的選項,這對應於當前定義的XAML內容。點擊菜單欄上的[顯示視覺樹]按鈕,顯示相應的視覺樹。

下面將解釋如何在XamlPad的[可視化樹資源管理器]面板中將XAML內容展開成可視化樹節點。

XamlPad中的[可視化樹資源管理器]面板

請註意,Label TextBox和Button控件分別在XamlPad的[可視化樹資源管理器]面板中顯示壹個可視化對象層次結構。這是因為WPF控件有壹個包含其可視化樹的ControlTemplate。當您顯式引用控件時,您隱式引用了它的視覺層次結構。

分析可視化性能WPF提供了壹套性能分析工具,幫助您分析應用程序的運行時行為,並確定可以應用的性能優化類型。visual profiler工具通過直接映射到應用程序的可視化樹,提供了豐富的性能數據圖形視圖。在此屏幕截圖中,CPU使用情況visual profiler的CPU使您能夠清楚地了解對象對WPF服務(如渲染和布局)的使用情況。

可視化資源管理器顯示輸出

視覺對象的表現行為WPF引入了幾種影響視覺對象表現行為的功能保留模式圖形、矢量圖形和設備無關圖形。

保留模式圖形理解立即模式和保留模式圖形系統的區別是理解視覺對象作用的關鍵點之壹。基於GDI或GDI+的標準Win應用程序使用即時模式圖形系統,這意味著應用程序負責重新繪制工作區中因某個操作(如調整窗口大小)或對象的視覺外觀發生變化而無效的部分。

獲獎展示順序圖

相比之下,WPF使用保留模式系統,這意味著具有視覺外觀的應用程序對象定義了壹組序列化的圖形數據。定義繪圖數據後,系統將響應所有重繪請求來呈現應用程序對象。即使在運行時,您也可以修改或創建應用程序對象,並且仍然依賴系統來響應繪圖請求。保留模式圖形系統中有壹個強大的功能,即總是應用繪圖信息。程序保持序列化,但是渲染功能仍然是系統的責任。下圖顯示了應用程序如何依靠WPF來響應繪圖請求。

WPF演示順序圖

使用保留模型圖形進行智能重繪的最大好處之壹是,WPF可以高效地優化應用程序中需要重繪的內容。即使妳有壹個各種不透明度的復雜場景,妳通常也不必編寫專用代碼來優化重繪功能。請比較壹下智能重繪功能和Win編程。後者,妳可以通過最小化更新區域的重繪量來盡力優化應用。

矢量圖形WPF使用矢量圖形作為其演示數據的格式。矢量圖形(包括可縮放矢量圖形(SVG) Windows圖元文件(wmf)和TrueType字體)存儲演示數據,並以指令列表的形式傳輸演示數據。這些說明描述了如何使用圖形元素重新創建圖像,如TrueType字體。矢量圖形的主要好處之壹是它可以縮放到任何大小和分辨率。

與矢量圖形不同,位圖圖形以圖像逐像素表示的形式存儲演示數據,位圖圖形格式與矢量圖形格式的主要區別之壹是對原始圖像的保真度。例如,當源圖像的尺寸改變時,位圖圖形系統將拉伸圖像,而矢量圖形系統將擴展和收縮圖像以保持圖像的保真度。

下圖顯示了源圖像放大到倍時的情況。請註意,源圖像在拉伸為位圖圖形時會變形,但在拉伸為矢量圖形時不會變形。

光柵圖形和矢量圖形的區別

下面的標簽顯示了定義的兩個Path元素,第二個元素使用ScaleTransform將第壹個元素的繪制指令放大到多倍。請註意,Path元素中的繪圖指令保持不變。

關於分辨率和獨立於設備的圖形,屏幕上的文本大小和圖形大小可由以下兩個系統因素決定。分辨率和DPI分辨率描述了屏幕上顯示的像素數量。隨著分辨率變大,像素將變小,導致顯示的圖形和文本變小。當顯示器的分辨率從X變為X時,顯示器上顯示的圖形會小得多。

另壹種系統設置(DPI)以像素為單位描述屏幕的英寸大小。大多數Windows系統的DPI意味著壹個屏幕英寸等於壹個像素。提高DPI設置會使屏幕英寸變大,而降低DPI會使屏幕英寸變小。這意味著屏幕英寸不等於實際英寸。在大多數系統中,很可能當您提高DPI時,屏幕英寸會變得更大,因此支持DPI的圖形和文本也會變得更大。提高DPI可以增強文本的可讀性,尤其是在高分辨率下。

並非所有應用程序都支持DPI。壹些應用程序使用硬件像素作為其主要測量單位。更改系統DPI不會對這些應用程序產生任何影響。許多其他應用程序使用支持DPI的單位來描述字體大小。使用像素來描述任何其他內容可能會導致這些應用程序中的布局問題,因為應用程序的文本將遵循系統的DP。我設置和縮放,但是應用的UI不會有這樣的問題。使用WPF開發的應用程序已經解決了這個問題。

WPF通過使用與設備無關的像素(而不是硬件像素)作為其主要測量單位來支持自動縮放。圖像和文本將適當縮放,無需應用程序開發人員的任何額外工作。下圖顯示了WPF文本和圖形在不同DPI設置下的顯示示例。

不同DPI設置下的圖形和文本

?VisualTreeHelper類VisualTreeHelper類是壹個靜態幫助器類,它提供了壹個在可視對象級別編程的低級函數。該類在非常特殊的情況下非常有用,例如開發高性能的自定義控件。

在大多數情況下,更高級的WPF框架對象(如Canvas和TextBlock)提供了更大的靈活性,並且更易於使用。

當默認的點擊測試支持不能滿足您的需要時,VisualTreeHelper類為可視對象提供點擊測試方法。可以使用VisualTreeHelper類中的hittest方法來確定幾何形狀或點坐標值是否在給定對象(如控件或圖形元素)的邊界內。例如,您可以使用點擊測試來確定鼠標是否在右邊。就像邊框中的單擊點是否落在圓形幾何圖形內壹樣,您也可以選擇重寫點擊測試的默認實現,以執行您自己的自定義點擊測試計算。

枚舉VisualTreeHelper類提供了枚舉可視化樹成員的功能。若要檢索父級,請調用GetParent方法。若要檢索可視對象的子級或直接子級,請調用GetChild方法。此方法返回父級位於指定索引處的子visual。

下面的示例演示如何枚舉visual對象的所有子級。如果您對序列化可視化對象層次結構的所有表示信息感興趣,您可能希望使用這種技術。

在大多數情況下,邏輯樹可以更好地表示WPF應用程序中的元素。雖然您不直接修改邏輯樹,但是應用程序視圖對於理解屬性繼承和事件路由非常有用。與可視化樹不同,邏輯樹可以表示非可視化數據對象(如ListItem)。VisualTreehelper類提供了壹種方法,通過調用GetC返回可視對象的邊框。返回可視對象的邊框。通過調用GetDescendantBounds,可以返回可視對象及其所有後代的邊框。下面的代碼演示如何計算可視對象及其所有後代的邊框。

Lishi Xinzhi/Article/program/net/201311/11370

  • 上一篇:西寧市湟中職業學校專業有哪些?專業介紹
  • 下一篇:win10應用商店無法下載軟件怎麽回事?win10應用商店無法下載軟件的解決方法
  • copyright 2024編程學習大全網