色尼玛亚洲综合影院,亚洲3atv精品一区二区三区,麻豆freexxxx性91精品,欧美在线91

Silverlight 布局(附照片墻示例及源碼)

  前言

  很喜歡一種人,他們可以把一種技術(shù)分析得很透徹,由淺入深,深入淺出,不管你是初學(xué)者還是資深人士,看上去都會(huì)感覺(jué)非常舒服。

  但是有時(shí)候,試圖去描述一個(gè)技術(shù)點(diǎn)是很困難的事情。

  開始,你覺(jué)得這個(gè)技術(shù)很有價(jià)值,你通過(guò)自己花了一定時(shí)間去學(xué)習(xí),想要把自己的理解與心得分享,于是就打算寫一篇隨筆;可是當(dāng)你開筆之后,突然發(fā)現(xiàn)描述起來(lái)很困難,雖然在你心中那個(gè)概念已經(jīng)很簡(jiǎn)單了,但是卻要用很多文字來(lái)描述,而且不同的技術(shù)可能有不同的“上下文”,每個(gè)人可能也有不同的“上下文”,在寫了幾個(gè)字之后你有點(diǎn)想放棄了;可是最后又不甘心,聰明的你靈機(jī)一動(dòng),做了一個(gè)Demo,大概對(duì)著圖片描述一下,然后發(fā)布,讓讀者自己去猜吧!

  我想說(shuō)的是,這并不算心得和學(xué)習(xí)經(jīng)驗(yàn),這充其量算是一篇索引或者“提醒”,讀者看了想,還可以這樣子,于是又不得不自己去找資料學(xué)習(xí)。因?yàn)槟阈闹械慕?jīng)驗(yàn)沒(méi)有描述出來(lái)啊。

  想想看,我們現(xiàn)在學(xué)習(xí)技術(shù)的途徑是什么。可能主要是SDK之類的,其次呢,我相信你印象應(yīng)該很深刻:其中有一些是別人寫的你覺(jué)得非常好的文章。很多Blog尤其是國(guó)外的Blog已經(jīng)成為了我們提升技術(shù)和積累經(jīng)驗(yàn)的一種無(wú)形的方式。

  文化的傳承有口述和媒介承載,口述精準(zhǔn)簡(jiǎn)單,但是也許文字更能深刻的描述事物而且可以反復(fù)理解,所以好的文字是文化傳載的重要方式。誠(chéng)然,寫技術(shù)文章也許需要一點(diǎn)點(diǎn)技巧,有些時(shí)候描述一個(gè)技術(shù)點(diǎn)需要篇幅,需要時(shí)間,需要耐心,更需要的是對(duì)讀者負(fù)責(zé),你能為讀者帶來(lái)什么?

  所以,寫作需要用心,從構(gòu)思到文字,這篇文章的價(jià)值是什么?你對(duì)技術(shù)的理解是什么,不要因?yàn)闀r(shí)間問(wèn)題(一篇有內(nèi)容的文章肯定需要花很多時(shí)間)就對(duì)你認(rèn)為核心的理解一筆帶過(guò)。我相信,這樣才是再學(xué)習(xí)的過(guò)程,這樣才對(duì)得起讀者的時(shí)間和關(guān)注,這樣才叫分享!

  Silverlight中的布局

  對(duì)于Silverlight學(xué)習(xí)來(lái)說(shuō),首先要面對(duì)的應(yīng)該是布局:你得把元素放到你想擺放的位置,然后是考慮元素的層次以及可見性,之后可能你想讓它動(dòng)起來(lái),就學(xué)習(xí)動(dòng)畫,最后理解更深入之后,可能會(huì)開發(fā)如Behavior之類的行為,或者設(shè)置復(fù)雜的控件狀態(tài),模板。

  很多教程是從使用Grid開始,然后是Canvas,StackPanel之類的控件,他教你怎樣設(shè)置元素的位置。然后就沒(méi)有下文,很少會(huì)去講解布局的原理,不過(guò)如果是看Silverlight SDK,是能看到的。其實(shí)最好的教程就是Silverlight SDK,包括像兩個(gè)不同的SL插件(即使它們?cè)诓煌臑g覽器窗口)之間的通信這些一般人沒(méi)有注意到的特性,里面都是講得清清楚楚。所以,建議不要花錢去買Silverlight相關(guān)的書。

  其實(shí),不是能使用Grid之類的就知道了布局,Silverlight布局包含更多的東西,理解布局系統(tǒng)有利于更深層的理解Silverlight,從而開發(fā)更得心應(yīng)手。遺憾的事初學(xué)者理解布局也許有點(diǎn)復(fù)雜,可能是因?yàn)槠渲械倪f歸,但是我們生活中其實(shí)有很多遞歸系統(tǒng)的。我試著學(xué)習(xí)郭欣用鐵路系統(tǒng)描述網(wǎng)絡(luò)傳輸一樣,也來(lái)構(gòu)造這樣一個(gè)場(chǎng)景。

  故事場(chǎng)景-巴比難題

  我們假設(shè)巴比基金現(xiàn)在愿意把所有的錢捐獻(xiàn)給某個(gè)國(guó)家的收入在該國(guó)平均收入以下的老百姓。但是他們不能自己去每個(gè)地方發(fā)放這筆資金,所以要求該國(guó)中央政府處理好這件事情,將這筆資金發(fā)放到各個(gè)省份的相關(guān)百姓手中。中央政府高度重視這件事情,但是這么大的工程應(yīng)該怎樣完成了,財(cái)政官員很為難?這時(shí)候負(fù)責(zé)行政的長(zhǎng)官提出了自己的建議,中央政府覺(jué)得很好,于是采納了該建議。

  行政長(zhǎng)官的建議分為兩道程序:調(diào)查和發(fā)放。

  調(diào)查:首先中央向各級(jí)地方行政官發(fā)出調(diào)查通知,要求各地方政府統(tǒng)計(jì)一下年收入在平均收入以下的人數(shù),并要匯報(bào)每個(gè)人的差額。省級(jí)行政長(zhǎng)官在收到通知后統(tǒng)計(jì)了一下省會(huì)的情況,然后把通知轉(zhuǎn)發(fā)給縣級(jí)行政官;縣級(jí)行政官接到通知還是首先統(tǒng)計(jì)縣城的情況,然后轉(zhuǎn)發(fā)通知到各個(gè)村子。村子就是最小的行政單位了,于是村委會(huì)秘密調(diào)查了每個(gè)人的收入,并計(jì)算差額。然后上報(bào)給縣級(jí),縣級(jí)在結(jié)合縣里面的情況,整理一份整個(gè)縣的報(bào)告給省級(jí),省級(jí)重新整理,上報(bào)給中央政府。

  發(fā)放:哈哈,現(xiàn)在中央政府就拿著全國(guó)的需求單。哇,全國(guó)有1000億的需求,而巴比只基金只有500億。也不好意思叫巴比找中國(guó)的富豪勸捐。于是只有把每個(gè)省的比例縮小一半了,并且最后做了一些調(diào)整,有的省份潛力比較好,自己能解決一些問(wèn)題,就少發(fā)放一些,有些地方經(jīng)濟(jì)差,就多發(fā)了一些,有的省級(jí)居然亂報(bào)說(shuō)需要10000億,可能是計(jì)算錯(cuò)誤,最后只發(fā)了100,有的地方雖然貧窮,但是很有志氣,不想要美國(guó)人的施舍,一分錢都沒(méi)有報(bào)。

  這樣,做一些根據(jù)實(shí)際情況調(diào)整之后,中央政府就按照調(diào)整的數(shù)額將錢發(fā)放到各個(gè)省級(jí)政府,省級(jí)政府拿到錢感到不對(duì)勁,感覺(jué)跟自己上報(bào)金額不一致,但有不好意思反應(yīng)情況,畢竟上面是老大,想給多少就多少,反應(yīng)也沒(méi)有用;但是有些政府也發(fā)現(xiàn)比自己期望的要多,有良知的官員還是決定平分到每個(gè)縣級(jí),但是也有一些官員主張直接貪污算了。

  總之也按中央政府的做法重新調(diào)整各個(gè)縣的發(fā)放金額,然后發(fā)放到各個(gè)縣級(jí),最后到村子,村委會(huì)在發(fā)到每個(gè)人手中。

  這個(gè)巴比問(wèn)題就這樣解決了。值得注意的是:

  1,各級(jí)政府在發(fā)放調(diào)查通知的時(shí)候也可以給縣級(jí)政府一個(gè)指標(biāo),我能給你的最大金額,或者最小金額,或者固定金額,或者無(wú)限制,你盡管反應(yīng)實(shí)際情況,這樣下級(jí)政府可能就會(huì)在上報(bào)前做一個(gè)實(shí)際調(diào)整。但下級(jí)也要做好心理準(zhǔn)備,這個(gè)數(shù)字不一定是真的,只是個(gè)參考數(shù)字。

  2,每個(gè)人或政府在發(fā)放之后拿到的錢不一樣,可能比需要的要多,這個(gè)時(shí)候政府可以選擇貪污或者公平發(fā)放,而來(lái)百姓會(huì)去買二鍋頭慶祝一下;有時(shí)候比需要的少,這個(gè)時(shí)候就只有拮據(jù)點(diǎn)花了。

  讀完這個(gè)故事,我們想一想,把一定數(shù)量的錢一層一層的發(fā)到每個(gè)人手里,是不是類似于Silverlight把插件大小的空間一塊一塊地分給每個(gè)空間啊?

   布局原理

  沒(méi)錯(cuò),Silverlight也是按類似的原理來(lái)實(shí)現(xiàn)布局:

  首先,所有元素的最頂層必須是一個(gè)容器(通常如Grid,Canvas,StackPanel等),然后在容器中擺放元素,容器中也可能包含容器。這里的容器就像行政長(zhǎng)官一樣,他們負(fù)責(zé)分配元素的空間。同樣,首先頂層的容器一個(gè)一個(gè)的問(wèn)自己的子元素:你想要多大的空間?如果子元素也是容器,它又繼續(xù)向下遞歸,最后又頂層開始向上匯報(bào)。這就是所謂的測(cè)量。

  測(cè)量完之后就是排列,這個(gè)時(shí)候每個(gè)容器知道自己每個(gè)子元素想要的空間大小,就按自己的實(shí)際情況進(jìn)行分配。一致遞歸到最底層。

  注意上述紅色字體部分,通過(guò)前面的故事,我們知道,資金的發(fā)放完全由行政長(zhǎng)官控制,不管下面想要多少,都是他說(shuō)了算,他甚至可以一分錢都不給,或者給你超多你的預(yù)期的數(shù)目。

  這里的容器也一樣,容器擁有完全的分配權(quán),不過(guò)這里容器不僅僅是分配空間,還決定元素的位置,因?yàn)榭臻g總是跟位置相關(guān)的。也就是說(shuō),容器說(shuō)想給你多大空間你就只有有那么大的空間可使用,容器想讓你擺在什么位置,你就得乖乖呆著什么位置。

  只不過(guò),這里的容器是遵守規(guī)則的,它遵守開發(fā)者指定的規(guī)則:

  Grid的規(guī)則是:我把我這個(gè)空間分成一格一格的格子,看起來(lái)有些像Table,在我里面的元素我完全按照附加屬性Grid.Row,Grid.Column,Grid.RowSpan,Grid.ColumnSpan來(lái)決定其大小和位置。

  Canvas的規(guī)則是:我讀取附加屬性Canvas.Left,Canvas.Right,Canvas.Top,Canvas.Bottom,并以此來(lái)決定元素的位置,我通常不限制元素開用空間

  StackPanel的規(guī)則是:根據(jù)附加屬性,我要么讓元素橫著排列,要么豎著排列。

  聰明的你是不是立刻想到,我可不可以定義自己的規(guī)則呢?哈哈,當(dāng)然可以!比如,你可以讓Panel里面的元素隨機(jī)分布,并可讓它們隨機(jī)旋轉(zhuǎn)一定角度,這不就是現(xiàn)在某些很酷的相冊(cè)嗎;你可以讓元素排成一個(gè)圓形,這不就是Blend里面的例子嗎;你可以讓元素根據(jù)某個(gè)Path元素排列,這不就是PathListBox嗎?如下圖:   

  所以,你現(xiàn)在是不是覺(jué)得布局不是那么簡(jiǎn)單并且很好玩呢?下面我們就來(lái)看怎么實(shí)現(xiàn)這么酷的東西!

  基礎(chǔ)框架-FrameworkElement

  為Silverlight布局中涉及的對(duì)象提供公共API的框架。FrameworkElement還定義在Silverlight中與數(shù)據(jù)綁定,對(duì)象樹和對(duì)象生存期功能區(qū)域相關(guān)的API。繼承層次結(jié)構(gòu):

  System.Object
    System.Windows.DependencyObject
      System.Windows.UIElement
      System.Windows.FrameworkElement
        System.Windows.Controls.Border
        System.Windows.Controls.Control
        System.Windows.Controls.Panel
        System.Windows.Shapes.Shape

NET技術(shù)Silverlight 布局(附照片墻示例及源碼),轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 商洛市| 北宁市| 清新县| 乌兰察布市| 合江县| 吴堡县| 伊金霍洛旗| 澄城县| 元江| 扎鲁特旗| 珲春市| 佛冈县| 庆元县| 资源县| 会昌县| 江门市| 绩溪县| 神木县| 鱼台县| 赤峰市| 潜江市| 碌曲县| 宁阳县| 黔西县| 余江县| 邵东县| 临汾市| 大洼县| 枣强县| 资溪县| 汝城县| 若羌县| 昔阳县| 奎屯市| 定结县| 博白县| 汉寿县| 嫩江县| 石渠县| 垣曲县| 田东县|