學(xué)習(xí)資源wpf上位機(jī)開發(fā)指南_第1頁
學(xué)習(xí)資源wpf上位機(jī)開發(fā)指南_第2頁
學(xué)習(xí)資源wpf上位機(jī)開發(fā)指南_第3頁
學(xué)習(xí)資源wpf上位機(jī)開發(fā)指南_第4頁
學(xué)習(xí)資源wpf上位機(jī)開發(fā)指南_第5頁
已閱讀5頁,還剩254頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

WPF基礎(chǔ) WPF基礎(chǔ)由 XAML語 WPF控件開 WPF控件庫之 WPF控件庫之 WPF控件庫之 WPF數(shù)據(jù)綁 WPF數(shù)據(jù)綁定之綁定 WPF圖形和多開 WPF圖形動(dòng)畫和概 WPF的多開 WPF基礎(chǔ)本提供WindowsPresentationFoundation(WPF)類層次結(jié)構(gòu)的指導(dǎo),涵蓋了WPF的大部分主要子系統(tǒng),并描述它們是如何交互的。本還詳細(xì)介紹了WPF架構(gòu)師WPF主要編程模型是通過托管代碼公開的。在WPF的早期設(shè)計(jì)階段,曾有過大量關(guān)于如何界定系統(tǒng)的托管組件和非托管組件的爭(zhēng)論。CLR高并且更加可靠(包括內(nèi)存管理、錯(cuò)誤處理和通用類型系統(tǒng)等),下圖說明了WPF的主要組件。關(guān)系圖的紅色部分(PresentationFramework、PresentationCoremilcore)WPFmilcoremilcoreDirectXWPF中的所有顯示是通過DirectX引擎完成的,可實(shí)現(xiàn)高效的硬件和軟件呈現(xiàn)。WPF還要milcoreCLR的本的后面部分將討論WPF的托管和非托管部分之間的通信。下面介紹托管編程模型WPFDispatcherObject基本構(gòu)造。WPFWin32似;事實(shí)上,WPF調(diào)度程序使用User32消息執(zhí)行跨線程調(diào)用。要討論WPF中的并發(fā),首先必須真正理解兩個(gè)概念–調(diào)度程序和線程關(guān)聯(lián)WPF形式是使用線程本地(TLS)來狀態(tài)。線程關(guān)聯(lián)要求執(zhí)行的每個(gè)邏輯線程僅由操作User32于OLE2.0的系統(tǒng)、剪貼板和InternetExplorer均需要單一線程關(guān)聯(lián)(STA)執(zhí)行。假設(shè)您具有帶有STA線程的對(duì)象,則需要式來程之間通信,并驗(yàn)證您是否為的CLR對(duì)象,并在創(chuàng)建時(shí)獲得一個(gè)指向調(diào)度程序的指針。生成WPF時(shí)使用的主要體系結(jié)構(gòu)原理之一是首選屬性而不是方法或?qū)傩允切缘模瑑?nèi)容。這種理念的預(yù)期效果是創(chuàng)建您可以綁定到的屬性,從而更好地控制應(yīng)用程序的行為了從由屬性驅(qū)動(dòng)的系統(tǒng)獲得,需要一個(gè)比CLR提供的內(nèi)容更豐富的屬性系統(tǒng)。知。為了使行為與屬性值相關(guān)聯(lián),您需要在屬性值更改時(shí)得到通知。.NETFrameworkINotifyPropertyChange(不過,這關(guān)系更改時(shí)自動(dòng)重新驗(yàn)證屬性值。例如,如果您具有一個(gè)會(huì)繼承的屬性(FontSize),WPF屬性系統(tǒng)的基礎(chǔ)是屬性表達(dá)式的概念。在WPF的第一版中,屬性表達(dá)式系統(tǒng)是關(guān)屬性系統(tǒng)還提供屬性值的稀疏因?yàn)閷?duì)象可以有數(shù)十(如果達(dá)不到上百個(gè)屬性,WPF性與每個(gè)元素相關(guān)聯(lián)。這與JavaScript中的“expando”功能相似。VisualAPIVisual實(shí)際上是到WPF組合系統(tǒng)的點(diǎn)Visual是以下兩個(gè)子系統(tǒng)之間的連接點(diǎn):托管API和非托管milcore。WPFmilcore(稱為組合節(jié)(下圖右側(cè)所示)WPFVisual在圖形方面,WPF不會(huì)發(fā)生組合系統(tǒng)對(duì)用戶代碼的回調(diào)。這有助于防止出現(xiàn)應(yīng)用程序無響應(yīng)的情況。User32GDI受影響的組件即可–不會(huì)有兩個(gè)組件對(duì)一個(gè)像素的顏色更改起作用。,WPF使用“繪畫器的算法”繪制模型。這意味著并不是剪輯每個(gè)組件求從顯示,(User32/GDI的情況除外)如上面所述,WPF的一個(gè)原理是移動(dòng)到一個(gè)更具性且“以屬性為”的編程首先,如果您考慮保留的模式圖形系統(tǒng),則實(shí)際上是從命令性DrawLine/DrawLine類newLine()/newLine()。通過這一向數(shù)據(jù)驅(qū)動(dòng)的呈現(xiàn)移動(dòng),可以在使用屬性表達(dá)的繪制指令上進(jìn)行復(fù)雜的操作。從Drawing派生的類型實(shí)際上是用于開發(fā)人員或設(shè)計(jì)人員的意圖(5),系統(tǒng)就UIElement定義子系統(tǒng),包括Layout、Input和EventLayout是WPF中的一個(gè)概念。在許多系統(tǒng)中,可能有一組固定的布局模型(HTML(User32。WPFUIElementMeasure和Arrange處理過程的兩階段模型。MeasureArrange,因?yàn)樵谠S多情形下,體現(xiàn)了WPF的另一關(guān)鍵原則–內(nèi)容大小。WPF中的所有控件支持調(diào)整到內(nèi)容原始大小的功能。這使本地化更加容易,并允許在調(diào)整大小時(shí)對(duì)元素進(jìn)行動(dòng)態(tài)布局。Arrange輸入是作為內(nèi)核模式設(shè)備驅(qū)動(dòng)程序上的信號(hào)發(fā)出的,并通過涉及Windows內(nèi)核和User32的復(fù)雜進(jìn)程路由到正確的進(jìn)程和線程。與輸入相對(duì)應(yīng)的User32消息一旦路由到多個(gè)實(shí)際允許在保證傳遞到位的情況下在較低的系統(tǒng)級(jí)別實(shí)現(xiàn)類似“MouseEnter”的每個(gè)輸入至少會(huì)轉(zhuǎn)換為兩個(gè)–“預(yù)覽”和實(shí)際。WPF中的所有都具有通過元素樹路由的概念。如果從目標(biāo)向上遍歷樹直到根,則被稱為“冒泡”,如果從根開始向下遍歷到目標(biāo),它們被稱為“隧道”。輸入預(yù)覽隧道,使樹中的任何元素都有機(jī)會(huì)篩選或?qū)Σ扇〔僮鳌H缓?,常?guī)(非預(yù)覽)將從目標(biāo)向上冒泡到根(Ctrl+N中的輸入消息,并確定是否有任何消息與已的快捷鍵匹配。在WPF中,上述內(nèi)容不會(huì)TranslateAccelerator"。為了進(jìn)一步深化此功能,UIElementCommandBindingsWPF至此,本已重點(diǎn)討論了WPF的“”功能-PresentationCore程序集中實(shí)現(xiàn)WPF(MeasureArrange)和框FrameworkElementWPFFrameworkElement引入的主要策略是關(guān)于應(yīng)用程序布局。FrameworkElement在UIElementMinWidth和Margin等屬性使得從FrameworkElement派生的所有組件在布局容器內(nèi)具有利用FrameworkElement,WPF的層中具有的許多功能可以更方便地進(jìn)行API公開。例如,F(xiàn)rameworkElement通過BeginStoryboard方法提供對(duì)動(dòng)畫的直接。Storyboard提供一種針對(duì)一組屬性為多個(gè)動(dòng)畫編寫的方式。FrameworkElement曾經(jīng)使用Windows窗體或ASP.NET創(chuàng)建應(yīng)用程序用戶界面(UI)的用戶應(yīng)當(dāng)對(duì)WPF(的一個(gè)或多個(gè)實(shí)例。通過顯式通過設(shè)置Style屬性)或通過將樣式與元素的CLR類(WPF則控件可通過模板化以一種參數(shù)化的性方式描述其呈現(xiàn)ControlTemte實(shí)際上不過ControlForeground、Background、PaddingObject“ContentWindowsASP.NETWPFWPFWPFWindowsASP.NETWPF為應(yīng)用程序的驅(qū)動(dòng)力。本介紹可擴(kuò)展應(yīng)用程序標(biāo)記語言(XAML)語言的功能并演示如何使用XAML編寫WindowsPresentationFoundation(WPF)應(yīng)用程序。本專門介紹了WindowsPresentationFoundation(WPF)實(shí)現(xiàn)的XAML。XAML本身是比WindowsPresentationFoundation(WPF)更廣泛的一個(gè)語言概念。XAML簡(jiǎn)化了為.NETFramework編程模型創(chuàng)建UI的過程。您可以在性XAML標(biāo)記中UI(通過分部類定義與標(biāo)記相連接)UI與運(yùn)行時(shí)邏輯相分離。在XAML中混合代碼和標(biāo)記的功能很重要,因?yàn)閄ML本身是性的,不會(huì)為流控制真正建議一個(gè)模型?;赬ML的性語言非常直觀,可以為用戶(尤Web)創(chuàng)建從原型到生產(chǎn)的各種界面。與其他大多數(shù)標(biāo)記語言不同,XAMLXAML對(duì)象的代碼和調(diào)試。XAML.xamlXMLXAMLUI通過樣式獲得默認(rèn)的可視化表示形式,通過其類設(shè)計(jì)獲得默認(rèn)的行為。XAML(Property)或,并將XML命名空間映射為CLR命名空間。XAML元素映射為被程序集中定義的.NET類型,而屬性(Attribute)則映射為這些類型的成員。>同樣具有多個(gè)屬性;下一節(jié)將介紹屬性)StackPanelButtonWPFWPFXAMLXAML是通過調(diào)用基礎(chǔ)類或結(jié)構(gòu)的默認(rèn)構(gòu)造函數(shù)并對(duì)結(jié)果進(jìn)行而創(chuàng)建的為了可用作XAML中XAML屬性的特征,給定屬性可使用的語有所不同。XAML(Property)(Attribute)(Attribute(Property)定為Content的顯示文本。提供屬性(Property)值所需的對(duì)象或信息不能充分地表示為簡(jiǎn)單的字符串。對(duì)于這些情(Property)(Property),盡管這兩種語法的細(xì)微之處(如空白處理)(Attribute)Attribute)格的問題,而不屬于技術(shù)限制。下面的示例演示了面的屬性(Attribute)語法示例(Property),但這次對(duì)Button(Property)(Property)XAML的屬性(Property)元素語法表示了與標(biāo)記的基本XMLXMLTypeNameXAML.Property>Property作為WPFXAML屬性(Attribute)而出現(xiàn)的屬性(Property)通常從基類繼承而來。例如,在上一個(gè)示例中,如果您要查看類定義、反射結(jié)果或文檔,Background不是在Button類上直接的屬性。相反,Background是從基Control類繼承而來。WPFXAMLXMLDTDXSDXAMLXAML的“X”表示“extensible”(可擴(kuò)展),WPFXAML”XAML({)表示標(biāo)記擴(kuò)展用法。此用法指示XAML處理不要像通常那樣將屬性值視為一個(gè)字符串或者可直接轉(zhuǎn)換為文本字符串的WPF應(yīng)用程序編程中最常用的標(biāo)記擴(kuò)展是Binding(用于數(shù)據(jù)綁定表達(dá)式)以及資源StaticResource和DynamicResource。通過使用標(biāo)記擴(kuò)展,即使屬性(Property)不支持(Attribute)(Attribute)(Property)提供值;或者使特定行為能夠符合必須用屬性(Property)類型值填充XAML屬性(Property)這一常規(guī)行為要求。例如,下面的示例使用屬性(Attribute)語法設(shè)置Style屬性(Property)的值。Style屬性(Property)采用了Style類的一個(gè)實(shí)例,這是默認(rèn)情況下不能在屬性(Attribute)語法字符串中指定的類型。但在本例中,屬性(Attribute)了特定StaticResource。當(dāng)處理該標(biāo)記擴(kuò)展時(shí),它返回對(duì)以前在資源字典中作為鍵控資源進(jìn)行實(shí)例化的某個(gè)樣式的。WPFXAML支持Typeconverter的屬性值StringWPFCLR(Attribute)XAML屬性(Attribute)語法來為Margin提供值:(Attribute)中,Margin是通過包含Thickness對(duì)象元素的屬性(Property)元素語法設(shè)置的,而且Thickness的四個(gè)關(guān)鍵屬性(Property)設(shè)置為新實(shí)例的屬性(Attribute):XAMLXAML中不存在該集合的對(duì)象元素也是如此。在集合類型的SDK參考頁中,特意省略集合對(duì)象元素的這種語法在XAML語法部分中有時(shí)候稱為“隱式集合語法”。IListIDictionaryXAML容屬性值的元素(XAML)。換言之,一個(gè)標(biāo)記頁上的父元素與子元間的關(guān)系實(shí)際上就是一個(gè)根對(duì)象而根對(duì)象下面的每個(gè)對(duì)象元素要么是為父元素語法上與顯式指定的ResourceDictionary的對(duì)象元素等效。Resources集合是許多常見的WPFXAMLXAMLXAMLXAMLXAMLXAMLXML的任何子元素都將成為XAML內(nèi)容屬性的值。您已經(jīng)看過了未調(diào)用的XAML內(nèi)容屬性的示例:本中的第一個(gè)示例這里,ButtonStackPanel省略的StackPanel.Children屬性元素:StackPanel從Panel派生。Panel將Panel..::.ChildrenXAMLPanelXAML容屬性,而Panel..::.Children的屬性元素可省略。省略的UIElementCollection對(duì)象元素:Panel..::.Children屬性采用類型UIElementCollectionIListXAMLUIElementCollection,UIElementCollection能實(shí)例化為一個(gè)對(duì)象元素。您甚至無法顯式該集合對(duì)象。這是因?yàn)閁IElementCollectionWPF用法的構(gòu)造函數(shù),因?yàn)閄AML集合語法處理仍然允許它們?cè)赬AML中隱式工作。這就是XAMLStackPanelButtonButton(Attribute)ContentPropertyButtonContentButtonContentControlXAMLContent(Object)進(jìn)行計(jì)算。ObjectObject。ButtonXAMLXAML于UI和顯示文本,或用于控件合成,或同時(shí)用于此兩者。XAMLXAML內(nèi)容屬性的值必須完全在該對(duì)象元素的其他任何屬性元前或之后指定不管XAML這在本質(zhì)上是的因?yàn)槿绻苏Z法是通過使用內(nèi)容屬性的屬性元素語法而變?yōu)轱@式一個(gè)類似的示例是,如果內(nèi)容屬性是一個(gè)集合,則子元素是與屬性元素交錯(cuò)的位置時(shí)該元素才能在應(yīng)用程序或頁面上正常運(yùn)行例如Item通常只應(yīng)作為Base派生(如的子級(jí)放置特定元素的內(nèi)容模型在可用作XAML元素的控件和其他WPF的概念進(jìn)行說明。XAMLXAML(Property)(Attribute)BooleantrueTrue作為等效值,但只是因?yàn)锽oolean的默認(rèn)字符串類型轉(zhuǎn)換已經(jīng)允許這些值作為等效XAML有關(guān)XAML語法的信XAMLXAMLXAMLXAMLXMLXAML件。通常,應(yīng)選擇屬于應(yīng)用程序模型一部分的元素(WindowPage,ResourceDictionary,Application)。下面的示例演示W(wǎng)PF頁面的典型XAML文件的根元素,其中的根元素為Page。xmlnsxmlns:xXAML含標(biāo)記將要的元素的元素定義。xmlns屬性專門指示默認(rèn)的xmlns命名空間。在默認(rèn)xmlnsWPFSDKWPFxmlnsWPF命名空間/winfx/2006/xaml/presentationxmlns:x屬性指示另外一個(gè)xmlns命名空間,該命名空間映射XAML語言命名空間/winfx/2006/xaml。在具有此映射的文件的標(biāo)記中時(shí),XAML規(guī)范定義的必需語言組件帶有x:xmlns定義用法范圍和映射的這種做法符合XML1.0規(guī)范。請(qǐng)注意,xmlns屬性僅在每頁的根元素上和應(yīng)用程序定義上(如果在標(biāo)記中提供了應(yīng)用程序定義)才是嚴(yán)格必需的。xmlns(此xmlnsXML1.0)xmlnsxmlns命名空間可能會(huì)導(dǎo)致XAML標(biāo)記樣式難以閱讀。WPF支持WPF到默認(rèn)xmlns的映射程序集還映射到目標(biāo)文件中因此為了來自WPF程XAMLxmlnsWPFxmlns可以選擇其他xmlns作為默認(rèn)值,然后將WPF映射到前綴。x:x:XAML/winfx/2006/xaml。在此SDK的項(xiàng)目模板、示例以及文檔x:XAMLxmlns。x:/XAMLxmlnsXAML用到的編程構(gòu)造。下面列出了將用到的最常見x:前綴/XAMLxmlns編程構(gòu)造:x:Key:ResourceDictionary看到的所有x:用法中,x:Key可能占到90%。x:ClassXAMLCLRWPFNamex:Name。某些動(dòng)畫方案中會(huì)x:Static:?jiǎn)⒂靡粋€(gè)獲取靜態(tài)值的值,該靜態(tài)值只能是一個(gè)XAML可設(shè)置屬性x:Type:根據(jù)類型名稱構(gòu)造一個(gè)Type。它用于指定采用Type的屬性符串到Type的轉(zhuǎn)換功能,因此使用x:Type是可選的。x:/XAMLxmlns和XAML代碼隱藏WPF,XAML為.xaml文件,而使用CLR語言(如VisualBasic.NET或C#)編寫代碼隱XAMLXAMLXAML名空間和類作為XAML頁的根元素的x:Class屬性來確定的。發(fā)該時(shí)調(diào)用的該編寫特定的處理程序名稱以及要使用的處理程序的名稱在標(biāo)請(qǐng)注意,代碼隱藏文件使用命名空間MyNamespace并將MyPageCode為該命名空間內(nèi)的一個(gè)分部類。這相當(dāng)于在標(biāo)記根中提供的MyNamespace.MyPageCode的x:Class屬XAML當(dāng)您提供也會(huì)定義同一分部類的代碼隱藏時(shí)將在與編譯的應(yīng)用程序相同名空間和類中當(dāng)您在標(biāo)記中通過指定行為時(shí),通常使用屬性語法來附加處理程序。在其中指定屬性的對(duì)象元素則變成偵聽以及調(diào)用處理程序的實(shí)例您要處理的具體的名稱是屬性并使處理程序基于該的委托。您使用編程語言(如VisualBasic.NET或。時(shí),每個(gè)WPF都將報(bào)告數(shù)據(jù)處理程序可以這些數(shù)據(jù)。面的示例中處理程序通過數(shù)據(jù)獲取所報(bào)告的源然后在該源上設(shè)置屬性。路由是一個(gè)特殊的功能,該功能是WPF特有的并且是它的基礎(chǔ)。路由允許一個(gè)元素處理另一個(gè)元素的,只要這些元素通過元素樹關(guān)系連接起來。當(dāng)使用XAMLStackPanelButtonStackPanelStackPanel,XAML定義了x:Name屬性。您可以在任何對(duì)象元素上設(shè)置x:Name屬性的值。在代WPF框架級(jí)XAML元素繼承Name屬性(Property),該屬性等效于XAML定義的x:Name(Attributex:Name(Name)提供屬性StackPanelNameStackPanelButton的處理程序通過由Name設(shè)置的實(shí)例buttonContainer來StackPanel。附加屬性和附加,XAML指定了一個(gè)語言功能,該功能允許在任何元素上指定某些屬性或,而不管要為其設(shè)置屬性或的元素的成員表中是否存在該屬性或元素。該功能的屬性版本稱為附加屬性版本稱為附加。從概念上講,您可以將附加屬性和附加認(rèn)為是可以在任何,通常通過屬性(Attribute)語法來使用XAML中的附加屬性(Property)。在屬性(Attribute)(Property)。XAML設(shè)置附加屬性值所需要的器方法使用附加屬性的最常見方案是使子元素能夠向其父元下面的示例演示了DockPanel..::.Dock附加屬性。DockPanel類為DockPanel..::.Dock定義器,因此擁有附加屬性。DockPanel類還包括一個(gè)邏輯,該DockPanel..::.Dock位功能事實(shí)上是DockPanel類的激動(dòng)人心的一面。WindowsPresentationFoundation(WPF)XAML的附加的屬性值指定在元素上處理時(shí)調(diào)用的處理程序方法的名稱。使用附加的案適用于可在任何元素(如鼠標(biāo)按鈕)上處理的設(shè)備輸入。例如,Mouse..::.MouseDown就是這樣一個(gè)附加。但是,大多數(shù)WPF框架級(jí)元素可以使用此,而無需使用附加。這是因?yàn)榛仡怳IElement可為Mouse..::.MouseDown附加創(chuàng)建一個(gè)別名,并在UIElement成員表中公開該別名(為MouseDown)XAMLWindowsPresentationFoundation(WPF)用程序編程中指定附加語法。例外情況包括,您使用的是自定義元素,或者使用并非從UIElement派生但仍然具有可視化表示形式的對(duì)象元素(這些情況很少見)。在WPF中,所有附加還作為路由來實(shí)現(xiàn)。Contenement也為輸入公開別名,供流程文XAML下表顯示了一個(gè)典型的XAML頁面根元素分解結(jié)構(gòu)并顯示了本中介紹的根元素的具體基礎(chǔ)XAML及其架構(gòu)是一個(gè)類集合,這些類對(duì)應(yīng)于CLR對(duì)象以及要在XAML中使用的標(biāo)記元素。但是,并不是所有的類都能映射到元素。抽象類(如ButtonBase)和某些非抽象基類在CLR對(duì)象模型中用于繼承,并且不支持對(duì)應(yīng)的XAML標(biāo)記?;悾òǔ橄箢悾?duì)于XAMLXAML(Attribute)(Property),或者可以處理的。FrameworkElement是WPF在WPF框架級(jí)的具體UI基類。設(shè)計(jì)UI時(shí),您將使FrameworkElement關(guān)的基類FrameworkContenement,它使用可在FrameworkElement中特意鏡像API的API,支持適合流布局表示形式的面向文檔的元素。元素級(jí)的屬性(Attribute)和CLR對(duì)象模型的組合提供了一組通用的屬性(Property),可以在大多數(shù)具體的XAML元素上設(shè)置這些屬性(Property),而不管確切的元素類型及其基礎(chǔ)類是什么。XAMLXAMLXAML等效的生成代碼那樣與系統(tǒng)資源進(jìn)行交互(如網(wǎng)絡(luò)、文件系統(tǒng)IO)。WPF支持.NET安全框架代碼安全性(CAS)這意味著在Internet區(qū)域中運(yùn)行的WPF內(nèi)容具有更少的執(zhí)行權(quán)限。“松散XAML”(由XAML查看器在加載時(shí)解釋的未編譯XAML)XAML(XBAP)Internet的系統(tǒng)資源權(quán)限。有關(guān)信息,請(qǐng)參見WindowsPresentationFoundation部分信XAMLUIXAMLUI實(shí)現(xiàn)部分自定義、在本地信息、使用XAML提供業(yè)務(wù)對(duì)象或者各種可能的方案。這些方XamlReaderLoadXAMLXAML形式加載來輕松地本簡(jiǎn)單介紹了XAML語法概念和術(shù)語如果您尚未了解這些內(nèi)容,請(qǐng)嘗試閱讀WindowsPresentationFoundation。當(dāng)您真正創(chuàng)建本中介紹的標(biāo)記應(yīng)用程序時(shí)其中的練習(xí)將幫助您進(jìn)一步了解本中介WPFApplication生成WPF應(yīng)用程序(WPF)為您詳細(xì)介紹了如何通過命令行以及使用VisualStudioXAMLWindowsPresentationFoundation(WPF)最后,SDKXAMLPadXAML驗(yàn)XAML。WindowsPresentationFoundation(WPF)類在SDK文檔中常常被稱為基元素類。這些類包括UIElement、FrameworkElement、Contenement和FrameworkContenement。DependencyObject也是一個(gè)相關(guān)類,因?yàn)樗荱IElement和Contenement的通用基類。WPFUIElement和Contenement都是從DependencyObject派生而來,但途徑略有不同。此級(jí)別上的拆分涉及到UIElement或Contenement如何在用戶界面上使用,以及它們?cè)趹?yīng)用程序起到什么作用。UIElement在其類層次結(jié)構(gòu)中也有Visual,該類為WindowsPresentationFoundation(WPF)Visual更加開放,以允許不同的元素進(jìn)行組合。Contenement不是從Visual派生的;它的模型由其他對(duì)象(例如,閱讀器或查看器,用來解釋元素并生成完整的Visual供WindowsPresentationFoundation(WPF)使用)來使用Contenement。某些UIElement類可用作內(nèi)容宿主:它們?yōu)橐粋€(gè)或多個(gè)Contenement類(如Viewer)提供宿主和呈現(xiàn)。Contenement用作以下元素的基類:所具有的對(duì)象模型較小,并且多用于尋址可能宿主在UIElement中的文本、信息或文檔內(nèi)容。框架級(jí)和UIElement用作FrameworkElement的基類,Contenement用作FrameworkContenement的基類。對(duì)于此下一級(jí)類,原因是要支持與WPF框架級(jí)相分離的WPF級(jí),這種分離還存在于API如何在PresentationCore和PresentationFrameworkWPF框架級(jí)為基本應(yīng)用程序需要提供了一個(gè)更完整的解決方案,包括用于表示的布局管理器的實(shí)現(xiàn)。WPF級(jí)提供了法,以充WPF,而又不至于產(chǎn)生附加程序集開銷。對(duì)于大多數(shù)典型的應(yīng)用程序開發(fā)方案而言,這些級(jí)別之間的區(qū)別很少有影響,而且一般情況下應(yīng)將WPFAPI視為一個(gè)整體,而無需擔(dān)心WPF框架級(jí)與WPF級(jí)之間有何區(qū)別。如果您的應(yīng)用程序設(shè)計(jì)選擇替換大量WPF框UI)WPFWPF如果您要實(shí)現(xiàn)控件(WPF),您可能需要從以下類中派生:實(shí)際控件、控件系列基類或至少是Control基類。DependencyObjectGetValueSetValueUIElementDependencyObject對(duì)基本輸入和命令的支持FrameworkElementUIElement對(duì)動(dòng)態(tài)資源的支持WPFOnPropertyChanged(該重寫可如果您創(chuàng)建從Contenement派生的類則除了能夠繼承DependencyObject提供的對(duì)基本輸入和命令的支持如果您創(chuàng)建從FrameworkContenement派生的類則除了能夠繼承Conten對(duì)動(dòng)態(tài)資源的支持您不會(huì)繼承對(duì)布局系統(tǒng)修改(如ArrangeOverride)的權(quán)限。布局系統(tǒng)實(shí)現(xiàn)只在DispatcherObjectWPFWPFDispatcherUIElement,DependencyObjectVisual慮從DispatcherObject派生,以獲得此線程模型支持。VisualVisual用的已知類型。Visual實(shí)現(xiàn)命中測(cè)試,但它不公開報(bào)告命中的(這些都位于UIElement中)。,zable通用的基礎(chǔ)。值得注意的是zable不是一個(gè)Visual;當(dāng)應(yīng)用zable以填充另一,是直接表示UI控件或積極參與控件組合的類。Control實(shí)現(xiàn)的主要功能是控件模板化。WindowsPresentationFoundation(WPF)(CLR)WPFWPFWPF(XAML)本假設(shè)您在CLR和面向?qū)ο蟮木幊谭矫嬗幸恍┗A(chǔ)知識(shí)。若要采用本中的示例,還應(yīng)當(dāng)了解XAML并知道如何編寫WPF應(yīng)用程序。CLRWPFCLR)WPF依賴項(xiàng)屬性的用途在于提供法來基于其他輸入的值計(jì)算屬性值這些其他輸入可以包括系統(tǒng)屬性(如和用戶首選項(xiàng))、實(shí)時(shí)屬性確定機(jī)制(如數(shù)據(jù)綁定和動(dòng)畫/演示圖在SDK參,可以根據(jù)某個(gè)屬性的托管頁上是否存在“依賴項(xiàng)屬性信息”部分DependencyProperty標(biāo)識(shí)符字段的,還包括一個(gè)為該屬性設(shè)置的元數(shù)據(jù)選項(xiàng)的列表、CLRWPFDependencyProperty。定義WPF屬性系統(tǒng)的另一個(gè)重要類型是DependencyObjectDependencyObject定義可以和SDK)依賴項(xiàng)屬性:一個(gè)由DependencyProperty支持的屬性。獲得,之后將為一個(gè)類成員。在與WPF屬性系統(tǒng)交互的許多API中,此標(biāo)識(shí)符用作一CLR“getsetGetValueWPFIsSpinningDependencyProperty屬性以及支持它的DependencyProperty字段名約定非常重要字段總是與屬性同名,但其后面追加了Property后綴。XAMLXAML碼中,XAMLXAMLWPF(Color,通過SolidColorBrush)。XAMLCLR“set獲取屬性值實(shí)質(zhì)上也是在調(diào)用get您還可以直接調(diào)用屬性系統(tǒng)APIGetValue和SetValue。如果您使用的是現(xiàn)有屬性,但是在某些情況下適合直接調(diào)用API。還可以在XAML中設(shè)置屬性,然后通過代碼隱藏在代碼中這些屬性都表示或支持整套WPF功能中的特定功能:WPF依賴項(xiàng)屬性值可以通過資源來設(shè)置。資源通常指定為頁面根元素或應(yīng)用程序的子元素,通過這些位置可以最方便地資源。下面的示例演示如何定義SolidColorBrush資源。在定義了某個(gè)資源之后,可以該資源并使用它來提供屬性值DynamicResource(XAML資源)。若要使用動(dòng)態(tài)資源,必須設(shè)置為依賴項(xiàng)屬性,因此它是由WPF屬性系統(tǒng)明確啟用的動(dòng)態(tài)資源用法。資源被視為本地值,這意味著,如果您設(shè)置另一個(gè)本地值,該資源將被消除依賴項(xiàng)屬性可以通過數(shù)據(jù)綁定來值。數(shù)據(jù)綁定通過特定的標(biāo)記擴(kuò)展語法(在XAML中)XAMLButtonContentXmlDataProvider(未顯示出來)。綁定本身通過數(shù)據(jù)源中的XPath指定所需的源屬性。DependencyObjectINotifyPropertyChanged,以便為數(shù)據(jù)綁定操作生成有關(guān)DependencyObject源屬性值變化。(UI)的XAML下面的示例創(chuàng)建一個(gè)非常簡(jiǎn)單的樣式(Resources來),然后將該樣式直接應(yīng)用于Button的Style屬性。樣式中的setter將帶樣式的Button的Background屬性設(shè)置為green。ButtonBackground(在技術(shù)上,BackgroundSolidColorBrushBackground之后,該SolidColorBrush的Color屬性就是直接進(jìn)行動(dòng)畫處理的屬性)。在從最初依賴項(xiàng)屬性的類派生時(shí)可以通過重寫依賴項(xiàng)屬性的元數(shù)據(jù)來更改該屬性的某DefaultStyleKey的元數(shù)據(jù)是某個(gè)實(shí)現(xiàn)模式的一部分,該模式創(chuàng)建可以使用中的默認(rèn)樣式的控件。產(chǎn)生一定的影響。屬性值繼承通常只有在特定方案適合使用屬性值繼承時(shí)才對(duì)屬性啟用??梢酝ㄟ^在SDK參查看某個(gè)依賴項(xiàng)屬性的“依賴項(xiàng)屬性信息”部分,來確定該依在父級(jí)StackPanel元素中指定為Dontext的源。WPFWPF之后還指定了一個(gè)具有在本地設(shè)置的Background值的按鈕。SDK(Property)XAML屬性(Attribute)的屬性(Property)值。第二個(gè)按鈕沒有本地值(setter),因此該按鈕中的背景將來自樣式setter。WPF(CLR)1:1元素可以向其父元素報(bào)告屬性值即使父元素元素的類成員列表中均沒有該屬性也是如此。一個(gè)主要方案是,使子元素可以將其在UI中的表示方式通知給父級(jí)。方,或至少可被這樣的調(diào)用方發(fā)現(xiàn)。WPF基礎(chǔ)本描述WindowsPresentationFoundation(WPF)中路由的概念。本定何創(chuàng)建您自己的自定義路由。用樹的概念來說明WPF元間的關(guān)系。為了按照本中的示例操作,您還應(yīng)當(dāng)了解可擴(kuò)展應(yīng)用程序標(biāo)記語言(XAML)并知道如何編寫非?;镜腤PF應(yīng)用程序或頁。(功能定義:路由是一種可以針對(duì)元素樹中的多個(gè)偵而不是僅針對(duì)該的對(duì)象)調(diào)用處理程序的。(實(shí)現(xiàn)定義:路由是一個(gè)CLR,可以由RoutedEvent類的實(shí)例提供支持并WindowsPresentationFoundation(WPF)系統(tǒng)來處理,典型的WPF應(yīng)用程序中包含許多元素。無論這些元素是在代碼中創(chuàng)建的還是在XAML中的,它們都由共同所在的元素樹關(guān)聯(lián)起來。根據(jù)的定義路由可以按兩種方是頁面或窗口)。如果您以前用過DHTML對(duì)象模型,則可能會(huì)熟悉這個(gè)冒泡概念。,在這個(gè)簡(jiǎn)化的元素樹中,Click的源是某個(gè)Button元素,而所單擊的Button是有會(huì)處理該的第一個(gè)元素但是如果附加到Button的任何處理程序均未作用于該,則該將向上冒泡到元素樹中的Button父級(jí)(即StackPanel)。該可能會(huì)冒泡到換言之,此Click的路由為下面簡(jiǎn)要概述了需運(yùn)用路由的方案,以及為什么典型的CLR不適合這些方案單一處理程序附加點(diǎn):在Windows窗體中,必須多次附加同一個(gè)處理程序,才能處理并在必要時(shí)使用處理程序邏輯來確定該源自何處。例如,這可以是前面顯示的XAML的加的實(shí)例處理程序之前來處理。RoutedEvent字段作為標(biāo)識(shí)符以此提供不需要靜態(tài)反射或運(yùn)行時(shí)反射的可靠的標(biāo)識(shí)技路由是一個(gè)CLR,它由RoutedEvent類提供支持并用WPF系統(tǒng)。從注RoutedEventpublicstaticreadonly該類進(jìn)行了并因此“擁有”路由。與同名CLR(有時(shí)稱為“包裝”)的連接是通過重寫CLR的add和remove實(shí)現(xiàn)來完成的。通常,add和remove保留為由的支持和連接機(jī)制在概念上與以下機(jī)制相似:依賴項(xiàng)屬性是一個(gè)CLR屬性,該屬性由DependencyProperty類提供支持并用WPF屬性系統(tǒng)。下面的示例演示自定義Tap路由的其中包括和公開RoutedEvent標(biāo)識(shí)符字段以及對(duì)TapCLR進(jìn)行add和remove實(shí)現(xiàn)。路由處理程序和若要使用XAML為某個(gè)添加處理程序請(qǐng)將該的名稱為用作偵的元素用來添加標(biāo)準(zhǔn)CLR處理程序的XAML語法與用來添加路由處理程序的語法相同,因?yàn)槟鷮?shí)際上是在向下面具有路由實(shí)現(xiàn)的CLR包裝中添加處理程序。件或其他UI元素的輸入或狀態(tài)變化。Windows件的“路由”相似。但是,與標(biāo)準(zhǔn)CLR不同的是,直接路由支持類處理(類處理將在下一節(jié)中介紹)而且可以由EventSetter和EventTrigger使用。隧道:最初將在元素樹的根處調(diào)用處理程序。隨后,路由將朝著路由的源節(jié)點(diǎn)元素(即路由的元素)方向,沿路由線路到后續(xù)的子元素。在合成控件的過程中通常會(huì)使用或處理隧道路由,這樣,就可以有意地顯示復(fù)合部件中的,或者將其替換為特定于整個(gè)控件的在WPF中提供的輸入通常是以隧道/冒泡對(duì)實(shí)現(xiàn)的。隧道有時(shí)又稱作Preview,這是由隧道/冒泡對(duì)所使用名約定決定的。作為應(yīng)用程序開發(fā)人員,您不需要始終了解或關(guān)注正在處理的是否作為路由實(shí)現(xiàn)。路由具有特殊的行為,但是,如果您在該行為的元素上處理,則該行為通常會(huì)路由偵和路由源不必在其層次結(jié)構(gòu)中共享公用。任何UIElement或Contenement可以是任一路由的偵。因此,您可以使用在整個(gè)工作API集信息。路由的這個(gè)“接口”概念特別適用于輸入。路由還可以用來通過元素樹進(jìn)行通信因?yàn)榈臄?shù)據(jù)會(huì)永存到路由中的每個(gè)元素中一個(gè)元素可以更改數(shù)據(jù)中的某項(xiàng)內(nèi)容該更改將對(duì)于路由中的下一個(gè)元素可用之所以將任何給定的WPF作為路由實(shí)現(xiàn)(而不是作為標(biāo)準(zhǔn)CLR實(shí)現(xiàn)),除了路由方面的原因,還有兩個(gè)其他原因。如果您要實(shí)現(xiàn)自己的,則可能也需要考慮這某些WPF樣式和模板功能(如EventSetter和EventTrigger)要求所的是路由。前面提到的標(biāo)識(shí)符方案就是這樣的。為您的類可以強(qiáng)制執(zhí)行驅(qū)動(dòng)的類行為,以防它們?cè)谔幚韺?shí)例上的時(shí)被意外。若要在XAML中添加處理程序,只需將相應(yīng)的名稱作為一個(gè)屬性添加到某個(gè)元素中并將該屬性的值設(shè)置為用來實(shí)現(xiàn)相應(yīng)委托的處理程序的名稱如下面的示例中所示。b1SetColor是所實(shí)現(xiàn)的處理程序的名稱該處理程序中包含用來處理Click的代碼。b1SetColorRoutedEventHandlerClick的處理程序委托所有路由處理程序委托的第一個(gè)參數(shù)都指定要向其中添加處理程序的元素,第二個(gè)參數(shù)指定的數(shù)據(jù)。RoutedEventHandler是基本的路由處理程序委托。對(duì)于針對(duì)某些控件或方案而專以傳輸?shù)臄?shù)據(jù)。例如,在常見的輸入方案中,可以處理DragEnter路由。您的處理程序應(yīng)當(dāng)實(shí)現(xiàn)DragEventHandler委托。借助更具體的委托,可以對(duì)處理程序中的DragEventArgs進(jìn)行處理,并Data屬性,該屬性中包含拖動(dòng)操作的剪貼板內(nèi)容。在用代碼創(chuàng)建的應(yīng)用程序中為路由添加處理程序非常簡(jiǎn)單路由處理程序始終AddHandleradd有的WPF路由通常借助于支持機(jī)制來實(shí)現(xiàn)add和remove邏輯這些邏輯允許使用特定于語言的語法來添加路由的處理程序特定于語言的語法比幫助器方法更直C#(visualBasic同的方法來處理取消):VisualBasicHandles序的一部分來添加。所有的路由都共個(gè)公用的數(shù)據(jù)基類RoutedEventArgsRoutedEventArgs定義了一個(gè)采用布爾值的Handled屬性。Handled屬性的目的在于,允許路由中的任何處理程序通過將Handled的值設(shè)置為true來將路由標(biāo)記為“已處理”。處理程序在路由路徑上的某個(gè)元素處對(duì)共享數(shù)據(jù)進(jìn)行處理之后這些數(shù)據(jù)將再次報(bào)告給路由路徑上的每個(gè)偵。Handled的值影響路由在沿路由線路向遠(yuǎn)處時(shí)的報(bào)告或處理方式在路由的數(shù)據(jù)中,如果Handled為true,則通常不再為該特定實(shí)例調(diào)用負(fù)責(zé)在其他元素中的Handled為true時(shí)響應(yīng)路由。換言之,將數(shù)據(jù)標(biāo)記為“已處理”并不會(huì)真的停止路由。您只能在代碼或EventSetter中使用handledEventsToo機(jī)制:在代碼中,不使用適用于一般CLR的特定于語言的語法,而是通過調(diào)用WPFAddHandler(RoutedEvent,Delegate,Boolean)將handledEventsToo的值指定為true。EventSetterHandledEventsTootrue除了Handled狀態(tài)在路由中生成的行為以外,Handled概念還暗示您應(yīng)當(dāng)如何設(shè)計(jì)自己的應(yīng)用程序和編寫處理程序代碼??梢詫andled概念化為由路由公開的Handled如果路由標(biāo)記為“已處理”,則它不必由該路由中的其他元素再次處理冊(cè)處理程序或者已經(jīng)的處理程序選擇不操作數(shù)據(jù)并將Handled設(shè)置為true(或者,當(dāng)前的偵很可能就是路由中的第一個(gè)點(diǎn)。)當(dāng)前偵上的處理程序現(xiàn)在有三個(gè)不執(zhí)行任何操作;該保持未處理狀態(tài),該將路由到下一個(gè)偵執(zhí)行代碼以響應(yīng)該,但是所執(zhí)行的操作被視為不足以保證將標(biāo)記為“已處理”。該將路由到下一個(gè)偵。執(zhí)行代碼以響應(yīng)該。在傳遞到處理程序的數(shù)據(jù)中將該標(biāo)記為“已處理”,因?yàn)樗鶊?zhí)行的操作被視為不足以保證將該標(biāo)記為“已處理”該仍將路由到下一個(gè)偵,但是,由于其數(shù)據(jù)中存在Handled=true,因此只有handledEventsToo偵聽Handled設(shè)置為true,也會(huì)增加為所調(diào)用的路由附加處理程序的難度(盡管仍可以在有關(guān)Handled、路由的類處理的信息,以及針對(duì)何時(shí)適合將路由標(biāo)記Handled的建議,請(qǐng)參見將路由標(biāo)記為已處理以及類處理的做法因?yàn)檫@樣可以防止元素樹中位置更高的元素也對(duì)同一個(gè)路由附加了處理程序而如果您定義的類是以某種方式從DependencyObject派生的那么對(duì)于作為類的已或有些WPF控件對(duì)某些路由具有固有的類處理。路由可能看起來從未過,WPFXAML語言還定義了一個(gè)名為“附加”的特殊類型的。使用附加,可以將特定這個(gè)特定的對(duì)象和用來處理實(shí)例的目標(biāo)也都不必將該定義為類成員或?qū)⑵渥鲗?duì)該UIElement使用MouseDown(而不是在XAML或代碼中處理附加語法),可以針對(duì)任何給定的UIElement更方便地處理基礎(chǔ)附加Mouse..::.MouseDown。XAML中的限定名為子元素所的路由附加處理程序是另一個(gè)語法用法它與類型名稱.名稱附加在這里,在其中添加處理程序的父元素偵是StackPanel。但是,它正在為已經(jīng)聲Button(ButtonBaseButton)引件的處理程序附加到任何UIElement或Contenement實(shí)例偵,該偵可能會(huì)以其他方式為公共語言運(yùn)行庫(CLR)附加偵。對(duì)于這些限定的屬性名來說,默xmlnsWPFxmlns指定帶有前綴名空間。WPF路由在WPF平臺(tái)中的常見用法之一是用于輸入。在WPF中,按照約定,隧道路由的名稱以單詞“Preview”開頭。輸入通常成對(duì)出現(xiàn),一個(gè)是冒泡,另一個(gè)隧道。例如,KeyDown和PreviewKeyDown具有相同的簽名,前者是冒泡輸在本文檔中,當(dāng)存在具有替換路由策略的類似路由時(shí),路由交叉它們,而且托管頁面中的各個(gè)節(jié)闡釋每個(gè)路由的路由策略。實(shí)現(xiàn)成對(duì)出現(xiàn)的WPF輸入的目的在于,使來自輸入的單個(gè)用戶操作(如按鼠標(biāo)按鈕)按順序該對(duì)中的兩個(gè)路由。首先隧道并沿路由,然后冒泡事的實(shí)現(xiàn)類中的RaiseEvent方法調(diào)用會(huì)偵聽隧道中的數(shù)據(jù)并在新的中重用它。具有隧道處理程序的偵首先獲得將路由標(biāo)記為“已處理”的機(jī)(先是類處理程序后是實(shí)例處理程序如果隧道路由中的某個(gè)元素將路由標(biāo)記為“已非常有用因?yàn)榇藭r(shí)您可能希望所有基于命中測(cè)試的輸入或者所有基于焦點(diǎn)的輸入該路由“替換”為更特定于控件的。為了說明輸入處理的工作方式,請(qǐng)考慮下面的輸入示例。在下面的樹插圖中l(wèi)eafelement#2是先后發(fā)生的PreviewMouseDown和MouseDown的源PreviewMouseDown(隧道)1PreviewMouseDown(隧道)。針對(duì)源元素2處理PreviewMouseDown(隧道)。針對(duì)源元素2處理MouseDown(冒泡)。1MouseDown(冒泡)。針對(duì)根元素處理MouseDown(冒泡)。路由處理程序委托提供對(duì)以下兩個(gè)對(duì)象的該的對(duì)象以及在其中調(diào)用發(fā)的對(duì)象是由數(shù)據(jù)中的Source屬性報(bào)告的路由仍可以由同一個(gè)對(duì)象和處理在這種情況下,sender和Source是相同(處理示例列表中的步驟3和4就要知道源元素是哪個(gè)元素時(shí),可以通過Source屬性來標(biāo)識(shí)源元素。了用來對(duì)輸入的含義進(jìn)行特定于應(yīng)用程序的邏輯處理的處理程序就應(yīng)當(dāng)將輸入標(biāo)對(duì)于這個(gè)有關(guān)Handled狀態(tài)的通用有一個(gè)例外,那就是,為有意忽略數(shù)據(jù)Handled狀態(tài)的輸入處理程序仍將在其路由中被調(diào)用。通常隧道和冒泡之間的共享數(shù)據(jù)模型以及先隧道后冒泡事件等概念并非對(duì)于所有的路由都適用。該行為的實(shí)現(xiàn)取決于WPF輸入設(shè)備選擇和自己的輸入遵循該模型。一些類選擇對(duì)某些輸入進(jìn)行類處理其目的通常是重新定義用戶驅(qū)動(dòng)的特定輸入事件在該控件中的含義并新。EventSetter在樣式中可以通過使用EventSetter在標(biāo)記中包括某個(gè)預(yù)先的XAML處理語法。在應(yīng)用樣式時(shí),所的處理程序會(huì)添加到帶樣式的實(shí)例中。只能針對(duì)路由EventSetter。下面是一個(gè)示例。請(qǐng)注意,此處的b1SetColor方法位于代碼隱藏文件EventSetter成為該樣式的一部分甚至可以提高代碼在標(biāo)記級(jí)別的重用率。而且,EventSetter還進(jìn)一步從通用的應(yīng)用程序和頁面標(biāo)記中提取處理程序方法的名稱。另一個(gè)將WPF的路由和動(dòng)畫功能結(jié)合在一起的語法是EventTrigger。與EventSetter一樣,只有路由可以用于EventTrigger。通常將EventTrigger為樣式的一部分但是還可以在頁面級(jí)元素上將EventTrigger為Triggers集合的一部分或者在ControlTemte中對(duì)其進(jìn)行。使用EventTrigger,可以指定當(dāng)路由到達(dá)其路由中的某個(gè)元素(這個(gè)元素針對(duì)該了EventTrigger)時(shí)將運(yùn)行的Storyboard。與只是處理并且會(huì)導(dǎo)致它啟動(dòng)現(xiàn)有演示圖板相比,EventTrigger的好處在于,EventTrigger對(duì)演示圖板及其運(yùn)行時(shí)行為提供更好的控制。本主要從以下角度討論路由:描述基本概念;就如何以及何時(shí)響應(yīng)各種基元素和基控件中已經(jīng)存在的路由提供指南。但是,您可以為自定義類創(chuàng)建自己的路由,還可以創(chuàng)建所有必要的支持(如的數(shù)據(jù)類和委托)。路由的所有者可以是任何類但是路由只有在由UIElement或Contenement派生類和處理之后才有用??蓴U(kuò)展應(yīng)用程序標(biāo)記語言(XAML)定義了一個(gè)語言組件和稱為“附加”的類素添加處理程序在這種情況下對(duì)象既不會(huì)該目標(biāo)處理實(shí)例也不會(huì)定義或“擁有”該。本假定您已閱讀路由概述和XAML概述附加語附加具有一種XAML語法和編碼模式后備代碼必須使用該語法和編碼模式才支持附加在XAML語法中不僅可以通過名稱來指定附加而且還可以通過用點(diǎn)(.)分以附加語法允許將任何附加附加到可以實(shí)例化的任何元素上。例如,下面是為自定義NeedsCleaning附加附加處理程序的XAML語法請(qǐng)注意aqua:前綴該前綴在本例中是必需的因?yàn)楦郊邮莵碜宰远x映射的自定義WPF在WPF中附加由RoutedEvent字段來支持并在后通過元素樹進(jìn)行路由通常,附加的源(該的對(duì)象)是系統(tǒng)或服務(wù)源,所以運(yùn)行該的代碼的對(duì)象并附加的方在WPF中附加存在于具有服務(wù)級(jí)抽象的某些功能區(qū)域例如對(duì)于通過靜態(tài)Mouse類或Validation類實(shí)現(xiàn)的與服務(wù)交互或使用服務(wù)的類可以在附加語法中使用該事件,也可以選擇將附加作為路由來實(shí)現(xiàn)(這是類如何集成服務(wù)功能的一部分)。盡管WPF定義了許多附加,但您直接使用或處理附加的方案卻很有限。一般情況下,附加用于實(shí)現(xiàn)體系結(jié)構(gòu)目的,但隨后即被轉(zhuǎn)發(fā)給非附加(使用CLR“包裝”提供支持)路由。例如,通過針對(duì)該UIElement使用MouseDown(而不是在XAML或代碼中處理附加事件語法),可以針對(duì)任何給定的UIElement更方便地處理基礎(chǔ)附加假設(shè)的設(shè)備只需Mouse..::.MouseDown即可模擬鼠標(biāo)輸入,而不需要從Mouse派生。但是,此方案會(huì)涉及的代碼處理,而附加的XAML處理則與此方案無關(guān)。WPF處理附加的過程以及您將要編寫的處理程序代碼與路由基本相同一般情況下,WPF附加與WPF路由并沒有太大的區(qū)別。不同之處在于如何確定的源以及如何通過類將作為成員進(jìn)行公開(這還將影響XAML處理程序語法但是,正如前文所述,現(xiàn)有的WPF附加并不是專門用于在WPF中進(jìn)行處理。該事件常常在代碼中,并且還依賴于相關(guān)父類中的類處理。例如,Selector中的附加的Selected,該隨后將由Selector類進(jìn)行類處理,然后可能由類轉(zhuǎn)換為不同的路由SelectionChanged將您自己的附加定義為路由WPF的實(shí)用工具方法來實(shí)現(xiàn)您自己的附加。*帶有兩個(gè)參數(shù)的方法Remove*Handler。第一個(gè)參數(shù)必須標(biāo)識(shí),而標(biāo)識(shí)的必須*當(dāng)針對(duì)某個(gè)元素附加處理程序?qū)傩詴r(shí),Add*Handler器方法可以加快XAML處理。Add*Handler和Remove*Handler方法還可實(shí)現(xiàn)對(duì)附加的處理程序存儲(chǔ)區(qū)的代碼。這個(gè)普通模式對(duì)于框架中的實(shí)際實(shí)現(xiàn)還不夠精確因?yàn)槿魏谓o定的XAML器實(shí)現(xiàn)都可能采用不同的架構(gòu)在支持語言和體系結(jié)構(gòu)中標(biāo)識(shí)基礎(chǔ)。這是WPF將附加作為路由來實(shí)現(xiàn)的原因之一用于的標(biāo)識(shí)符(RoutedEvent)已經(jīng)由WPF系統(tǒng)進(jìn)行定義。而且,路由一個(gè)也是對(duì)附加的XAML語言級(jí)概念的自然實(shí)現(xiàn)擴(kuò)展。WPF附加的Add*Handler實(shí)現(xiàn)包括將路由和處理程序用作參數(shù)來調(diào)AddHandler此實(shí)現(xiàn)策略和路由系統(tǒng)一般將附加的處理限制為UIElement派生類Contenement派生類,因?yàn)橹挥羞@些類才具有AddHandler實(shí)現(xiàn)例如,下面的代碼按照WPF將附加作為路由進(jìn)行的附加策略為所有者類Aquarium定義NeedsCleaning附加。請(qǐng)注意,用來確定附加標(biāo)識(shí)符字段的方法RegisterRoutedEvent實(shí)際上與用來注冊(cè)非附加路由的方法相同附加和路由都是在集中管理的內(nèi)部區(qū)中進(jìn)行注冊(cè)的此區(qū)實(shí)現(xiàn)則實(shí)現(xiàn)了路由概述中討論的“作為界面”概念方面的注意WPF附加通常不需要從代碼中WPF定義的現(xiàn)有附加。這些采用一般的“服務(wù)”概念模型,而服務(wù)類(如InputManager)則負(fù)責(zé)。(但是如果您根據(jù)將RoutedEvent作為附加基礎(chǔ)的WPF模型來定義自定義附加事件,則可以使用RaiseEvent從任何UIElement或Contenement中附加。引發(fā)路由不管是否附加)要求您在元素樹中一個(gè)特定的元素作為源;該源被報(bào)告為RaiseEvent調(diào)用方。您的服務(wù)負(fù)責(zé)決定將哪個(gè)元素報(bào)告為元素樹中的源。(本描述WindowsPresentationFoundation(WPF)布局系統(tǒng)。了解在構(gòu)造外觀醒PanelChildrenPanelUIElement解哪些會(huì)調(diào)用布局系統(tǒng)就很重要,因?yàn)椴槐匾恼{(diào)用可能導(dǎo)致應(yīng)用程序性能變差。PanelMeasureOverrideArrangeOverride的布局行為。不論何時(shí)調(diào)用布局系統(tǒng),都會(huì)發(fā)生以下系列。子UIElement通過首先測(cè)量它的屬性來開始布局過程FrameworkElementWidth、HeightMargin。應(yīng)用Panel特定邏輯,例如Dock方向或堆棧Orientation。Children如果其他Children添加到集合應(yīng)用LayoutTransform或調(diào)用Updaayout方法,在WindowsPresentationFoundation(WPF)中構(gòu)思應(yīng)用程序布局時(shí),了解環(huán)繞所有元素FrameworkElementLayoutInformation約束的大小、布局特定屬性(如邊距和填充)及父Panel元素的個(gè)別行為來確定的。通過處理此數(shù)據(jù),系統(tǒng)將能夠計(jì)算給定的Panel的所有子級(jí)的位置。牢記在父元素上定義的哪些大小調(diào)整特性(如Border)會(huì)影響其子級(jí),這非常重要??梢允褂靡韵驴蓴U(kuò)展應(yīng)用程序標(biāo)記語言(XAML)TextBlockGrid為TextBlock分配的空間實(shí)際更大。可以使用GetLayoutSlot方法檢索任意FrameworkElement,TextBlock因?yàn)門extBlock是在Grid(它是允許共享布局坐標(biāo)的Panel元素)內(nèi)承載的。TextBlockGrid,此分配可能會(huì)收縮或擴(kuò)展,這取決于所添加元素的GetLayoutSlot(它是一項(xiàng)用于顯示元素邊界框的有用技術(shù))TextBlock的布局槽并將其轉(zhuǎn)換成PathWindowContent須定義根Panel(用于定義框架,Children是按框架在屏幕上組織的)。布局的第一個(gè)處理過程是測(cè)量處理過程,將在此對(duì)Children集合的每個(gè)成員進(jìn)行計(jì)MeasurePanelUIElementClipVisibility。這將生成一個(gè)名為constraintSize的傳遞給MeasureCore的值。FrameworkElementconstraintSizeUIElementHeightWidthMarginStyleconstraintSize為一個(gè)參數(shù)調(diào)用MeasureOverride。在Height、Width、ActualHeight和ActualWidth的屬性之間存在著差異。例如,ActualHeight實(shí)際呈現(xiàn)處理過程設(shè)置的,因此可能稍微小于屬性(Height)的ActualHeightDesiredSize,MeasureCore間發(fā)生的。該值由Measure,以便在內(nèi)容排列過程期間使用。ArrangePanel子級(jí)邊界的矩形。該值會(huì)傳遞給ArrangeCore方法以便進(jìn)行處理。邊距,并生成arrangeSize(作為參數(shù)傳遞給Panel的ArrangeOverride)。分配空間。然后,控件返回到父Panel,至此布局過程完成。WindowsPresentationFoundation(WPF)Panel自由流動(dòng)的布局可以使用Canvas來實(shí)現(xiàn)。定義一個(gè)區(qū)域,在此區(qū)域內(nèi),您可以使用相對(duì)于Canvas將子元素排列成一行(可沿水平或垂直方向)Panel上至下或從右至左的順序進(jìn)行,具體取決于Orientation屬性的值。PanelPanelMeasureOverrideArrangeOverride布局是一個(gè)遞歸過程。Children其值可能導(dǎo)致布局系統(tǒng)被初始化的相關(guān)性屬性會(huì)標(biāo)記為公共標(biāo)志。AffectsMeasureAffectsArrange常,任何可能影響元素邊界框大小的屬性應(yīng)將AffectsMeasure標(biāo)志設(shè)置為true。的效果無需對(duì)其他元素的位置施加影響,則最好改為使用RenderTransform,因?yàn)楸苊獠槐匾卣{(diào)用Upda 當(dāng)處理大型Children集合時(shí),請(qǐng)考慮使用VirtualizingStackPanel而非常規(guī)StackPanel。通過“虛擬化”子元素,VirtualizingStackPanel父ViewPort內(nèi)的對(duì)象。因此,在大多數(shù)情況下性能會(huì)得到極大改進(jìn)。WindowsPresentationFoundation(WPF)(樣式、模模型,以便在應(yīng)用程序內(nèi)部和應(yīng)用程序之間和共享外觀。WindowsPresentationFoundation(WPF)就提供了這樣的模型。使用C#或VisualBasic進(jìn)行邏輯編程時(shí),設(shè)計(jì)人員只需使用XAML即可設(shè)計(jì)程序的外ListBoxStyle通過直接對(duì)每個(gè)TextBlock元素設(shè)置FontSize和FontFamily等屬性可以更改默認(rèn)外TextBlockXAMLResources節(jié)中創(chuàng)建一個(gè)Style,如下所示:TargetTypeTextBlockTextBlock現(xiàn)在,TextBlock您可能希望兩個(gè)TextBlock元素共享某些屬性值(如FontFamily和居中的HorizontalAlignment),同時(shí)還希望文本“我的”具有某些其他屬性。在第一個(gè)樣式x:KeyTextBlockStyle性設(shè)置為x:Key值,如下所示:TextBlockHorizontalAlignmentCenter,F(xiàn)ontFamilyComicSansMS,F(xiàn)ontSize26,F(xiàn)oregroundLinearGradientBrush。請(qǐng)F(tuán)ontSizeSetterStyle進(jìn)行設(shè)置,則最后的Setter優(yōu)先。TextBlockTitleTextTextBlockx:Key以擴(kuò)展具有x:Key的樣式。TargetType(Property)x:Key(Attribute)如第一個(gè)示例所示,如果將TargetType屬性設(shè)置為TextBlock而不為樣式分配x:Key,樣式就會(huì)應(yīng)用于所有TextBlock元素。這種情況下,x:Key隱式設(shè)置為{x:TypeTextBlock}x:Key{x:TypeTextBlock}StyleTextBlockx:KeyTextBlockTargetType則必須提供x:Key。x:Key,TargetTypesetter如果未指定TargetType,則必須通過語法Property="ClassName.Property",用類名限定Setter對(duì)象的屬性。例如,必須將Property設(shè)置為"TextBlock.FontSize"或"Control.FontSize",而不要設(shè)置Property="FontSize"。WPFWPF某個(gè)類型的所有控件的樣式,可能會(huì)得到意想不到的結(jié)果。例如,如果針對(duì)Window中的TextBlock類型創(chuàng)建一個(gè)樣式,則該樣式會(huì)應(yīng)用于窗口中的所有TextBlock控件,即使TextBlock是另一個(gè)控件(如ListBox)的組成部分也不例外。任何派生自FrameworkElement或FrameworkContenement的元素都可以使用樣式。聲XAMLResources式,則該樣式只能在該XAML文件中使用。StyleObjectStyleStyletextblock1TextBlock設(shè)置定義的TitleText樣式,請(qǐng)執(zhí)行以下操作:Setter.ValueDynamicResource在本示例應(yīng)用程序中,有一個(gè)綁定到列表的ListBox控件此ListBox列表。在WPF中,使用DataTemte可以定義數(shù)據(jù)的可視表示形式。基本上,輸DataTemte的內(nèi)容決定了數(shù)據(jù)在呈現(xiàn)的應(yīng)用程序中的外觀在我們的示例應(yīng)用程序中,每個(gè)自定義Photo屬性,該屬性指定圖像的文件路徑。當(dāng)前,對(duì)象顯示為文件路徑。對(duì)于要顯示為圖像的,可以將DataTemte作為資源創(chuàng)建請(qǐng)注意,DataType屬性與Style的TargetType屬性非常相似。如果DataTemte型出現(xiàn),便會(huì)應(yīng)用DataTemte。任何時(shí)候都可以為DataTemte分配x:Key,然后將其設(shè)置為DataTemte類型的屬性(如ItemTemte屬性或ContentTemte屬性)的StaticResource。實(shí)質(zhì)上上面示例的DataTemte確定只要存在Photo對(duì)象該對(duì)象就應(yīng)作為顯示在Border中。通過此DataTemte,應(yīng)用程序現(xiàn)在的外觀如下HeaderedItemsControl(如一個(gè)數(shù)據(jù)模板化功能是DataTemteSelector,利用這能可以根據(jù)自定義邏輯選擇要使用的DataTemte。有關(guān)信息,請(qǐng)參見數(shù)據(jù)模板概述,該概述對(duì)不同的數(shù)據(jù)模板化望ListBox是水平的。不使用ControlTem具有ItemsPanel屬性,利用該屬性可以設(shè)置ItemsPanelTemte,即控制ListBox的項(xiàng)的布局的模板。法是只創(chuàng)建ListBox樣式,然后設(shè)置ItemsPanel屬性,如下例所在本示例中,如果希望獲得具有其他屬性(如圓角)ListBoxListBox的ControlTemte。在提供示例來演示具體操作之前,首先需要說明ControlTemte的概念什么是ControlTem擊時(shí)所的Click。組成控件的組件設(shè)置屬性值,就需要使用ControlTemte。在WPF中,控件的ControlTemte定義控件的外觀。通過為控件定義新的匹配的默認(rèn)模板,該模板向Button控件提供默認(rèn)外觀。請(qǐng)注意:一旦為控件創(chuàng)建ControlTemte,就會(huì)替換整個(gè)ControlTemte。例如,可以通過以下方式定義ButtonControlTemte。請(qǐng)注意,ContentPresenterButtonContent應(yīng)用此模板之后,ButtonButton如果要?jiǎng)?chuàng)建ControlTemte,使用ControlTemte示例是最好的方法。如果確實(shí)需要查看控件的組成部分,可以查看位于的文件,也可以使用XAMLPad(隨Windows軟件開發(fā)工具包(SDK)安裝的應(yīng)用程序)的ShowVisualTree功能。創(chuàng)建ControlTem現(xiàn)在,繼續(xù)演示示例,我們創(chuàng)建一個(gè)ControlTemte,它定義一個(gè)水平的圓角ListBox。若要替換控件的ControlTemte,請(qǐng)將Temte屬性設(shè)置為新的ControlTemte。以這種方式設(shè)置Temte屬性,實(shí)際上與使用Style設(shè)置其他控件屬性沒有區(qū)別:您將Style用作一個(gè)工具來幫助設(shè)置Temte屬性。也就是說,設(shè)置ControlTemte的另法是直接設(shè)置控件的Temte屬性。如果以這種方式設(shè)置,則會(huì)在Resources節(jié)中創(chuàng)建一個(gè)ControlTemte,并為它提供x:Key,然后將它作為靜態(tài)資源使用。如上例所示,ControlTemte類具有TargetType屬性,該屬性類似于Style類的TargetType屬性。但要注意,與Style和DataTemte不同,ControlTemte對(duì)象沒某個(gè)類型,則ControlTemte不會(huì)自動(dòng)應(yīng)用于該類型。另請(qǐng)注意,如果模板定義包含ContentPresenter,則ControlTemte需要TargetType屬性。嘗試使用ControlTemte例如用WrapPanel替換StackPanel,將ScrollViewerHorizontalScrollBarVisibilityDisabledListBox為300。(只有第一行空間不足時(shí),WrapPanel才會(huì)將項(xiàng)放置到下一行。如果沒有將ScrollViewerHorizontalScrollBarVisibilityDisabled,由于可以滾動(dòng)到末尾,則第一行不會(huì)空間不足。因此,WrapPanel不會(huì)對(duì)項(xiàng)進(jìn)行換行。)IsItemsHost在此示例中,一個(gè)必需的重要屬性是IsItemsHost屬性。IsItemsHost屬性用于指示在ItemsControl(ListBox)的模板中,生成的元素應(yīng)放在什么位置。如果將StackPanel的這一屬性設(shè)置為true,則添加到ListBox的所有項(xiàng)都將進(jìn)入StackPanel。請(qǐng)注意,此屬性只對(duì)Panel類型有效。ItemsPresenter請(qǐng)注意如果以這種方式在ControlTemte中指定一個(gè)面板并將其標(biāo)記為IsItemsHost,控件的用戶不使用ControlTemte就無法替換ItemsPanel。因此,除非您確信必須使用標(biāo)記項(xiàng)的位置,然后通過設(shè)置ItemsPanel屬性來指定ItemsPanelTemte。ItemsPanelTemte頁提供了一個(gè)示例,為您演示如何操作。同樣,將此元素放置到ContentControl類型的ControlTemte中,可以指示內(nèi)容應(yīng)在什么位置顯示,如什么是ControlTemte?一節(jié)中的示例所示。有關(guān)其他示例,請(qǐng)參見LabelControlTemte示例和ListBoxItemControlTemte示例。在上一示例中,需要注意的另一個(gè)重點(diǎn)是設(shè)置為{TemteBindingListBox.Background}的Background值。它只是指示Border的Background應(yīng)與ListBox上設(shè)置的Background值同步。TemtBinding與Binding類似。實(shí)際上,TemtBinding比Binding更有效,但功能更弱;使用TemtBinding等效于使用Source屬性設(shè)置為RelativeSource.TemtedParent的Binding。若要使控件用戶能夠控制某些屬性的值,可以在ControlTemte中使用TemteBinding。TemteBinding是一個(gè)由TemteBindingExtension類表示的標(biāo)記DataTem成了對(duì)象的外觀。通過ListBoxControlTemte定義,應(yīng)用程序現(xiàn)在的外觀如下:Style、ControlTemte和DataTemte都具有Triggers屬性,該熟悉可以包含一組為了演示如何使用觸發(fā)器來設(shè)置屬性,每個(gè)ListBoxItem都設(shè)置為部分透明(除非ListBoxItemOpacity0.5IsSelectedtrue,Opacity此示例使用Trigger來設(shè)置屬性值,但請(qǐng)注意,Trigger類還具有EnctionsExitActionsListBoxItemMaxHeight75。在下面的屏幕快照中,ntTriggerTrigger器是EventTrigger,它根據(jù)的來啟動(dòng)一組操作。例如,下面的EventTrigger對(duì)ListBoxItemMaxHeight0.2為值90。當(dāng)鼠標(biāo)離開該項(xiàng)時(shí),該屬性在1秒時(shí)間內(nèi)還原為

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論