閑話WPF之十(Dependency屬性 [2] )

在前一個Post中,曾提到將要重點研究Dependency屬性的三個方面:變化通知;屬性值的繼承;支持多個提供對象。下面,我將分別就這三個內容進行簡單地說明。

【變化通知】

在任何時候,只要Dependency屬性的值發生了變化,WPF可以自動地根據屬性的元數據觸發不同的行為。前面提到過:Dependency屬性最大的特點就是內建的變化通知功能。這種內建變化通知所提供的最值得注意的就是屬性觸發器(Property Trigger),就是它使用我們不需要編寫任何的程序代碼就能在屬性變化使執行自定義行為。請看下面XAML編碼的一個屬性觸發器例子:

<Trigger Property=”IsMouseOver” Value=”True”>

???? <Setter Property=”Foreground” Value=”Blue”/>

</Trigger>

它的功能就是在屬性值IsMouseOver變為True的時,將屬性Foreground的值設置為Blue。而且,它會在IsMouseOver變為False時自動將Foreground的值設置為原來的值。就是這樣簡單的三行代碼完成了我們曾經需要多個函數、變量才能實現的功能。

使用屬性觸發器時需要注意:觸發器默認適用于每個類對象。 而且,在WPF 3.0中由于人為的限制,Property Trigger將不能應用在單獨的元素。只能應用在某個Style對象之中。因此,如果想在某個單獨對象上實現Property Trigger。必須用如下的XAML進行封裝:

<Button MinWidth=”75” Margin=”10”>

<Button.Style>

???? <Style TargetType=”{x:Type Button}”>

???? <Style.Triggers>

?????????? <Trigger Property=”IsMouseOver” Value=”True”>

??????????????? <Setter Property=”Foreground” Value=”Blue”/>

?????????? </Trigger>

???? </Style.Triggers>

???? </Style>

</Button.Style>

???? OK

</Button>

【屬性值繼承】

屬性值繼承是指在設置邏輯樹某個結點元素的屬性后,它的所有之結點都繼承這個屬性值(當然,前提是子元素必須支持這個屬性)。我們仍然利用閑話WPF之八中的一個例子進行說明:

<Window FontSize=”30”>

???? <StackPanel>

?????????? <Label>LabelText</Lable>

???? </StackPanel>

</Window>

我們修改了Window是FontSize屬性為30。通過實際觀察將發現它的子元素Label的FontSize也變為了30。注意這里的StackPanel是一個容器元素,它本身并不支持FontSize屬性。

現在我們給上面的Window添加一個狀態欄。XAML代碼如下:

<Window ......>

???? <StackPanel>

?????????? <Label>LabelText</Lable>

?????????? <StatusBar>This is a Statusbar</StatusBar>

???? </StackPanel>

</Window>

這時你會發現:雖然StatusBar支持這個FontSize這個屬性,它也是Window的子元素,但是它的字體大小卻沒有變化。為什么呢?因為并不是所有的元素都支持屬性值繼承。還存在如下兩種例外的情況:

1、部分Dependency屬性在用Register注冊時可以指定Inherits為不可繼承。

2、如果有其他更高優先級方法設置了其他的值。(關于優先級的介紹且看下面分解。)

部分控件如StatusBar、Menu和Tooptip內部設置它們的字體屬性值以匹配當前系統的設置。這樣用戶通過控制面板可以修改它們的外觀。這種方法存在一個問題:StatusBar等截獲了從父元素繼承來的屬性,并且不影響其子元素。比如,如果我們在StatusBar中添加了一個Button。這個Button的字體屬性會因為StatusBar的截斷沒沒有改變,將保留其默認值。

附加說明:屬性值繼承的最初設計只適用于元素Tree,現在已經進行多個方面的擴展。比如,值可以傳遞下級看起來像Children,但在邏輯或者視覺Tree中并不是Children的某些元素。這些偽裝的子元素可以是觸發器、屬性的值,只要它是從Freezable繼承的對象。對于這些內容沒有很好的文檔說明。我們只需要能使用就行不必過多關心。

轉載于:https://www.cnblogs.com/YilingLai/archive/2006/12/24/601994.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277120.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277120.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277120.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

1037 Magic Coupon

題目鏈接&#xff1a;https://pintia.cn/problem-sets/994805342720868352/problems/994805451374313472 這個題目有毒&#xff0c;開始我的while判斷是使用的相乘大于0這種判斷方式&#xff0c;但是最后一個案例始終過不了&#xff0c;可能是因為越界了&#xff0c;但是越界的…

利用解構賦值獲取后端特定字段數據

很多時候&#xff0c;后端接口傳過來的數據并不正好是我們需要的。有些場景下會有很多不需要的字段。 這時如果采用單個賦值的方法賦值數據無疑會比較麻煩。解決的辦法就是利用解構賦值。 mounted(){let objs {name:test,sex:nan,caree:kaifa,height:180,country:country};({na…

理解ORACLE數據庫字符集

一&#xff0e;引言 ORACLE數據庫字符集&#xff0c;即Oracle全球化支持(Globalization Support)&#xff0c;或即國家語言支持&#xff08;NLS&#xff09;其作用是用本國語言和格式來存儲、處理和檢索數據。利用全球化支持&#xff0c;ORACLE為用戶提供自己熟悉的數據庫母語環…

軟件設計師09-面向對象-用例圖

感謝任鑠老師滴視頻 用例圖 1&#xff09;描述一組用例、參與者及它們之間的關系 2&#xff09;用例模型用于需求分析階段 3&#xff09;關系&#xff08;依賴關系&#xff09;&#xff1a;1&#xff09;包含&#xff08;include&#xff09; 1&#xff09;兩個以上用例具有共同…

利用正則表達式截取特定字符中間字符

有如下場景&#xff0c;已知一個長字符串&#xff0c;需要獲取指定字符串之間的字符。 // 已知字符串 var str body908888huhuc實測實《hu需要body和《hu之間的字符串。定義正則表達式。 var reg /(?<body).(?《hu)/;上述正則表達式利用了&#xff1a;獲取指定字符串之后…

資源的積累

最近整理機器里邊的各種文檔&#xff0c;進行異地備份&#xff0c;整理后&#xff0c;看了看尺寸&#xff0c;天呀&#xff0c;竟然有855M&#xff0c;主要是各種文檔、圖片和代碼等非2進制的東東。我按照日期整理了一下&#xff0c;最久的大概是在2003年&#xff0c;公司是在2…

【MySQL】4、Select查詢語句

4.Select查詢語句 4.1、select語句 <?php $servername "localhost"; $username "username"; $password "password"; $dbname "myDB";// 創建連接 $conn mysqli_connect($servername, $username, $password, $dbname); // Che…

一、環境調試確認

1、確認系統網絡 2、確認yum可用 3、確認關閉iptables規則 4、確認停用selinux 兩項安裝 yum -y install gcc gcc-c autoconf pcre pcre-devel make automake yum -y install wget httpd-tools vim 一次初始化 cd /opt/ mkdir app backup download logs work轉載于:https…

JavaScript方法

1、hasOwnProperty&#xff1a;是用來判斷一個對象是否有你給出名稱的屬性或對象。不過需要注意的是&#xff0c;此方法無法檢查該對象的原型鏈中是否具有該屬性&#xff0c;該屬性必須是對象本身的一個成員。isPrototypeOf是用來判斷要檢查其原型鏈的對象是否存在于指定對象實…

Ajax:如何運用updatepanle進行局部刷新

1.設定ScriptManager的EnablePartialRendering"true"(一般默認為true)2.設定要進行局部刷新panel的UpdateMode"Conditional"(本panel 的id為zz) 這樣就可以保在本panle內的控件操作refresh頁面時&#xff0c; 不會將整個page刷新&#xff0c;而刷新本pan…

Shell語法—— while 條件語句

while 循環語句 while 循環語句語法格式為&#xff1a; while < 條件表達式 > do指令 done 有關腳本運行的相關用法 命令說明sh file.sh &把 file.sh 腳本放到后臺運行&#xff08;后臺運行腳本的常用方法&#xff09;ctlc停止執行當前腳本或任務ctlz暫停執行當前腳本…

C變量常量

變量是指其值可以變化的量。計算機中&#xff0c;指令代碼、數據都存儲于內存中。變量也需要存儲在內存中。在計算機中&#xff0c;每個變量都被分配了一塊內存空間&#xff0c;在這些空間里存儲的就是變量的值。變量之所以可以變化&#xff0c;就是這個存儲空間可以存儲不同的…

slot

slot就是父組件把內容分發給子組件,插槽模板是slot&#xff0c;它是一個空殼子&#xff0c;因為它的顯示與隱藏以及最后用什么樣的html模板顯示由父組件控制。但是插槽顯示的位置確由子組件自身決定&#xff0c;slot寫在組件template的什么位置&#xff0c;父組件傳過來的模板將…

手把手教你可復用的SSO組件設計(設計篇)

周末陪女朋友去了&#xff0c;沒寫&#xff0c;告罪&#xff0c;上班后急忙補上。 這里說到了可復用得設計&#xff0c;所謂可復用就是指的&#xff0c;引入Dll&#xff0c;改改配置就能使用&#xff0c;而不是打開源代碼東改改西改改再來調試調試最后OK。我們這里盡量提高抽象…

Object類和常用的API

第一章Object類 1.1 概述 1),Object 類是Java語言所有“引用類型”的父類&#xff0c;括我們自定義的類、類庫中的類&#xff0c;數組&#xff0c;集合&#xff0c;字符串。 2),所有的的引用類型都從Object類繼承了一些方法&#xff1a; 如&#xff0c;1).toString() 2).equal…

前端能力劃分

前端學習學的是什么&#xff0c;在不同的階段我思考這個問題。 最近的結論是&#xff1a;前端學習要學的是前端的三大能力。工程能力&#xff0c;架構能力&#xff0c;開發能力。 工程能力 工程能力的范疇我認為涵蓋了項目模板的自動化生成、項目的自動化編譯和構建。 當然傳統…

英語學習網址

英文寫作網 &#xff08; www.4ewriting.com &#xff09;提供英文寫作的各種相關技巧&#xff0c;主要內容包括寫作語法文法、應用寫作、考試作文、寫作范文、背景文化 佳作欣賞、原創發表、英文blog、英語筆友、名師指導、寫作論壇等。 1. 英語學習&#xff1a;英語學習頻道(…

Anaconda+vscode+pytorch環境搭建

1、安裝Anaconda Anaconda指的是一個開源的Python發行版本&#xff0c;其包含了conda、Python等180多個科學包及其依賴項。在官網上下載https://www.anaconda.com/distribution/&#xff0c;因為服務器在國外會很慢&#xff0c;建議從清華鏡像https://mirrors.tuna.tsinghua.ed…

git learn

$ git config --global user.name "Your Name" $ git config --global user.email "emailexample.com"因為Git是分布式版本控制系統&#xff0c;所以&#xff0c;每個機器都必須自報家門&#xff1a;你的名字和Email地址。你也許會擔心&#xff0c;如果有人…

C#.NET 中的類型轉換

C# 出來也有些日子了&#xff0c;最近由于編程的需要&#xff0c;對 C# 的類型轉換做了一些研究&#xff0c;其內容涉及 C# 的裝箱/拆箱/別名、數值類型間相互轉換、字符的 ASCII 碼和 Unicode 碼、數值字符串和數值之間的轉換、字符串和字符數組/字節數組之間的轉換、各種數值…