偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

WPF Attached屬性相關(guān)概念解析

開發(fā) 開發(fā)工具
WPF Attached屬性這一知識(shí)點(diǎn)需要我們?cè)诓粩嗟膶?shí)際開發(fā)使用中去慢慢體會(huì)其含義。這篇文章提供了一些基礎(chǔ)概念,希望對(duì)大家有所幫助。

WPF Attached屬性在實(shí)際使用中,是一個(gè)比較難以理解的一個(gè)部分。在這里我們可以了解到一些關(guān)于WPF Attached屬性的相關(guān)知識(shí)。#t#

我們?cè)倏匆环N特殊的Dependency屬性:WPF Attached屬性。Attached屬性可以非常高效地Attach到其他的對(duì)象中。
我們?nèi)匀挥们懊娴囊粋€(gè)簡(jiǎn)單XAML代碼為例:

  1. < Window>   
  2. < StackPanel>   
  3. < Label>LabelText< /Lable>   
  4. < /StackPanel>   
  5. < /Window>   

現(xiàn)在,如果需要對(duì)StackPanel及其子元素設(shè)置字體大小,應(yīng)該如何做呢?在Window元素中,WPF Attached屬性有一個(gè)屬性FontSize,可以直接設(shè)置。但是,StackPanel自己本身并沒有FontSize這樣的屬性。這就該Attached屬性出場(chǎng)了。這里我們需要用定義在TextElement元素中的Attached屬性FontSize來設(shè)置StackPanel的字體。

  1. < Window>   
  2. < StackPanel TextElement.
    FontSize
    =”30”>   
  3. < Label>LabelText< /Lable>   
  4. < /StackPanel>   
  5. < /Window>  

這樣,StackPanel的子元素就能通過屬性值繼承得到新的FontSize屬性。對(duì)于這樣的XAML代碼,XAML編譯器或者解析器看到這種語法時(shí),就要求TextElement(有時(shí)也稱為Attached屬性提供者)有相應(yīng)的靜態(tài)方法SetFontSize來設(shè)置對(duì)應(yīng)的屬性值。因此,上面的WPF Attached屬性設(shè)置代碼,可以如下用C#實(shí)現(xiàn):

  1. StackPanel panel = 
    new StackPanel();  
  2. TextElement.SetFontSize
    (panel, 30); 

從這里的代碼可以看出,Attached屬性并不神秘。只是調(diào)用方法把元素和不相關(guān)的屬性關(guān)聯(lián)起來。而SetFontSize實(shí)現(xiàn)也比較簡(jiǎn)單。它只是調(diào)用了Dependency屬性訪問函數(shù)所調(diào)用的DependencyObject.SetValue方法。注意調(diào)用的對(duì)象是傳入的DependencyObject,而不是當(dāng)前的實(shí)例:

  1. public static void SetFontSize
    (DependencyObject element, 
    double value) {   
  2. element.SetValue(TextElement.
    FontSizeProperty, value);   

同樣地,WPF Attached屬性也定義了對(duì)應(yīng)的GetXXX函數(shù)。它調(diào)用的DependencyObject.GetValue方法:

  1. public static double GetFontSize
    (DependencyObject element) 
  2. { return (double)element.GetValue
    (TextElement.FontSizeProperty); 

與普通的Dependency屬性一樣,這些GetXXX和SetXXX方法除了實(shí)現(xiàn)對(duì)GetValue和SetValue的調(diào)用,不能做任何其他額外的工作。

其實(shí),在WPF應(yīng)用中,Attached屬性更多的用來控制UI的布局。除了前面的StackPanel,還有Grid等等。

補(bǔ)充說明:上面的代碼還有一個(gè)問題需要說明。我們?cè)O(shè)置StackPanel的字體屬性時(shí)用的是TextElement元素。為什么不用其他的元素Control、Button呢?

這個(gè)問題的關(guān)鍵之處在于Dependency屬性的注冊(cè)方法。我曾在Dependency屬性[1]做過簡(jiǎn)單的說明。我們看看Element的FontSizeProperty屬性的注冊(cè)代碼:

  1. TextElement.FontSizeProperty = 
    DependencyProperty.RegisterAttached
    ( “FontSize”, typeof(double), 
    typeof(TextElement), new Framework
    PropertyMetadata( SystemFonts.
    MessageFontSize, FrameworkProperty
    MetadataOptions.Inherits | 
    FrameworkPropertyMetadataOptions.
    AffectsRender | FrameworkProperty
    MetadataOptions.AffectsMeasure), 
    new ValidateValueCallback(Text
    Element.IsValidFontSize)); 

這里與我們前面的IsDefault屬性類似,只是RisterAttached方法優(yōu)化了WPF Attached屬性需要的屬性元數(shù)據(jù)的處理過程。

另一方面,Control的FontSize屬性是在TextElement元素已經(jīng)注冊(cè)的屬性之上調(diào)用AddOwner方法,獲取一個(gè)完全相同的實(shí)例引用:

  1. Control.FontSizeProperty = 
    TextElement.FontSizeProperty.
    AddOwner( typeof(Control), new 
    FrameworkPropertyMetadata(
    SystemFonts.MessageFontSize, 
    FrameworkPropertyMetadata
    Options.Inherits)); 

所以,在實(shí)現(xiàn)WPF Attached屬性時(shí)我們使用的是TextElement,而不是Control等等。

責(zé)任編輯:曹凱 來源: IT168
相關(guān)推薦

2009-12-29 10:22:34

WPF附加屬性

2009-12-29 10:11:56

WPF布局屬性

2009-12-29 09:54:27

WPF文字布局

2009-12-28 16:20:50

WPF內(nèi)嵌樣式

2009-12-23 15:27:34

WPF圖形系統(tǒng)

2009-12-28 15:18:29

WPF控件模型

2009-12-23 16:13:00

WPF Attache

2009-12-25 11:23:43

WPF命令模型

2009-12-28 14:40:08

WPF屬性

2010-02-24 16:52:59

WCF支持WebGet

2010-01-11 15:43:06

VB.NET類屬性

2009-12-23 09:26:56

ADO.NET屬性

2011-08-16 15:04:15

交換機(jī)快速啟動(dòng)

2009-12-15 15:55:43

Ruby模塊

2009-12-28 17:54:49

WPF嵌入式資源

2009-12-25 16:58:23

WPF名稱范圍

2010-01-06 18:21:24

2010-02-02 16:15:38

C++變量聲明

2010-01-19 15:08:18

VB.NET對(duì)象成員

2010-02-01 11:01:30

C++靜態(tài)構(gòu)造函數(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)