如何在Fuse中建立自定義的UI組件類

當Fuse的默認組件難以滿足我們需求的時候我們就可以通過自建UI組件來在App中使用捺檬,具體方法如下:
首先病线,我們需要引入一個概念——ux:Class"類"屬性:

ux類的建立(ux:Class)

我們通過在UX markup代碼里指定一個節(jié)點的ux:Class屬性來定義一個新的組件類经磅,“類”是一個可以在你的項目中的其它位置孵奶,通過實例化來重復多次使用的組件剥纷。
ux:Class建立了一個獨立而功能齊全的組件抒钱,能被用到項目的任何地方。在類的自身之外是?無法訪問到ux:Names的鼎天,如果需要建立一個在某些特定的上下文情況中能有權限訪問到ux:Names的類的話請參看ux:InnerClass區(qū)舀奶。
Example
下面的代碼建立了一個從Text元素繼承的被稱為Header的類:
<Text ux:Class="Header" FontSize="22" />
他能被實例化,就像其它的Fuse標準內建元素一樣斋射。
<Header>Welcome</Header>
在上述例子中育勺,Header類將成為一個來自于但不同于Text類的類, 盡管所有的可用屬性都來自于Text。注意罗岖,類可以放在單獨的.ux文件中定義涧至,通常情況下也一般是這么來定義的。
自定義類也可以做到很復雜的效果呀闻,如果你有需求的話:
<pre>
<Image ux:Class="BurgerIcon">
<MultiDensityImageSource>
<FileImageSource File="Burger.png" Density="1"/>
<FileImageSource File="Burger.png@2x.png" Density="2"/>
</MultiDenistyImageSoruce>
</Image>

<Panel>
<BurgerIcon />
</Panel>
</pre>
他們可以有自己的邏輯性"logic"化借,包括使用觸發(fā)器、動作捡多、和JavaScript等(triggers, actions)蓖康。
注意:使用ux:Class建立的類?映射到了真正的Uno類里邊Uno-classes,可以理解成為原生的了吧:
如:
<Panel ux:Class="MyPanel"/>
等同于下面的Uno類Uno-class:
public class MyPanel : Panel { ... }

ux類的屬性定義(ux:Property)

當建立一個自定義類時垒手,在很多情況下蒜焊,我們需要能夠定義出能實現交互效果的類,這可以通過UX來實現科贬,使用的是ux:Property語法泳梆,這樣我們就可以在實例化時用屬性來在有限的范圍內控制自己所寫的類了。
MyButton.ux:
<pre>
<Panel ux:Class="MyButton" Text="Click me!"
Fill="#f00" TextColor="#000" CornerRadius="10">
<string ux:Property="Text"/>
<float4 ux:Property="CornerRadius" />
<Brush ux:Property="Fill" />
<float4 ux:Property="TextColor"/>
<Text Alignment="Center" TextColor="{Property this.TextColor}" Value="{Property this.Text}"/>
<Rectangle Layer="Background" CornerRadius="{Property this.CornerRadius}" Fill="{Property this.Fill}" />
</Panel>
</pre>

上例我們建立了一個稱為MyButton的類榜掌,定義了并陳列出四個自定義的屬性(Text, CornerRadius, Fill and TextColor)优妙。這些屬性能被梆定到我們的類ux:Class之內,使用{Property this.PropName}句式來實現憎账。

  • 注意:現在存在一個被稱為this的隱藏名稱套硼,我們一般在{Property this.PropName}句式之內使用,此名稱常用來引用ux:Class里的最頂級根元素胞皱。(易咸注:其實個人覺得可以理解為面向對象里邊的this指針邪意,this指向的是實例化時的對象本身)九妈。

實例化時自定義ux類的屬性傳遞(ux:Property)

當我們實例化了我們自己定義的類的時候,就可以直接訪問變量了雾鬼。
MainView.ux:
<pre>
<App>
<MyButton CornerRadius="20" Text="MyText"
TextColor="#fff" Width="200" Height="50">
<LinearGradient ux:Binding="Fill">
<GradientStop Color="#0f0" Offset="0" />
<GradientStop Color="#00f" Offset="1" />
</LinearGradient>
</MyButton>
</App>
</pre>

你可以使用ux:Binding來設置或訪問父元素引用類別的屬性萌朱,像筆刷Brush這類,在上例中策菜,我們建立了一個線性漸變LinearGradient晶疼,接著又把它梆定到父元素的Fill屬性上,從而看起來像是直接作為Fill使用的又憨。

我們做一個圖來分析一下

通過此圖我們不難看出:

  • 定義類時使用的元素樣本是可以設置默認值的冒晰,當實例化時如果沒有設置這個屬性的值的話,會使用在類中的默認值來實例化類(已測竟块,公共屬性與自定義屬性都支持默認值的設置);
  • 像Width和Height這些元素公共屬性在實例化時是可以直接使用的耐齐,也就是是說無須做自定義屬性的浪秘,因為生成的實例繼承了類中樣本元素的屬性(已測);
  • 如果你定義類的自定義屬性時使用了與樣本元素的公共屬性集里的名稱埠况,也就是說重名了的話耸携,Fuse不會提示錯誤,但是你的自定義屬性不會生效(已測),可在此處查到這些元素對應的屬性https://www.fusetools.com/learn/reference辕翰;

可見量/數組屬性 Observable/Array properties

如果你想進入一個可見量或數組以屬性的方式夺衍,可以用object類型,如下例:
<pre>
<Panel ux:Class="ListView">
<object ux:Property="ListItems" />
<StackPanel>
<Each Items="{Property this.ListItems}">
<Panel Padding="10">
<Text Value="{}" />
</Panel>
</Each>
</StackPanel>
</Panel>
<JavaScript>
exports.items = ["Foo", "Bar", "Baz"];
</JavaScript>
<ListView ListItems="{items}" />
</pre>

ux內部類(ux:InnerClass)

內部類的定義
內部類是定義在其他類內部的類喜命。它幾乎可以處于類內部任何位置沟沙,可以與實例變量處于同一級,或處于方法之內壁榕,甚至是一個表達式的一部分矛紫!
優(yōu)點如下
⒈ 內部類對象可以訪問創(chuàng)建它的對象的實現,包括私有數據牌里;
⒉ 內部類不為同一包的其他類所見颊咬,具有很好的封裝性;
⒊ 使用內部類可以很方便的編寫事件驅動程序牡辽;
⒋ 匿名內部類可以方便的定義運行時回調喳篇;
好了,普及完了态辛,回歸正題吧麸澜!
一個內部類隸屬于一個特定的范圍或作用域,而且對在此作用域中聲明的ux:Names具有訪問權限因妙。內部類僅僅只能用在聲明過他的作用域中痰憎。
<pre>
<App Theme="Basic">
<Button ux:InnerClass="ActivateButton" ux:Name="btn" Margin="10">
<Clicked>

<Set highlight.LayoutMaster="btn" />
</Clicked>
</Button>
<StackPanel>
<ActivateButton Text="Option A" ux:Name="defaultOption"/>
<ActivateButton Text="Option B" />
<ActivateButton Text="Option C" />
<Rectangle Fill="Red" ux:Name="highlight" Margin="-5" LayoutMaster="defaultOption">
<LayoutAnimation>
<Move RelativeTo="PositionChange" X="1" Y="1" Duration="0.4" Easing="BackOut" />
</LayoutAnimation>
</Rectangle>
</StackPanel>
</App>
</pre>

ux文件包含(ux:Include)

你可以插入一個UX文件中的內容到另外一個UX文件中票髓,使用ux:Include。
上面例子铣耘,ux:InnerClass 能被分開成單獨的文件洽沟,分離后的主文件大致如下:
<pre>
<App Theme="Basic">
<ux:Include File="ActivateButton.ux" />
<StackPanel>
<ActivateButton Text="Option A" ux:Name="defaultOption"/>
...
</StackPanel>
</App>
</pre>
需要引用的代碼放到ActivateButton.ux中:
<pre>
<Button ux:InnerClass="ActivateButton" ux:Name="btn" Margin="10">
<Clicked>

<Set highlight.LayoutMaster="btn" />
</Clicked>
</Button>
</pre>
需要注意的是,包含的文件不能有ux:Class在文檔根節(jié)點蜗细,那樣的話將會在你的項目中建立基于類生成的兩個實例裆操,可是,包含文件能指定ux:InnerClass炉媒。這將建立一個內部類的本地版本踪区,在每一個包含他的位置。

附:
英文原文:https://www.fusetools.com/learn/fuse#creating-custom-ui-components
高級部分參看吊骤,建立一個新類
https://www.fusetools.com/learn/guides/ux-markup-creating-new-classes
屬性與梆定Properties and bindings
https://www.fusetools.com/learn/guides/ux-markup-properties-and-bindings
使用你自己的Uno類Using your own Uno classes
https://www.fusetools.com/learn/guides/ux-markup-using-your-own-classes

Tag:Fuse, Fuseapp, Fusetools, native app
發(fā)布時間:2016年05月10日
博客被黑缎岗,挪窩簡書安家……

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市白粉,隨后出現的幾起案子传泊,更是在濱河造成了極大的恐慌,老刑警劉巖鸭巴,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件眷细,死亡現場離奇詭異,居然都是意外死亡鹃祖,警方通過查閱死者的電腦和手機溪椎,發(fā)現死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恬口,“玉大人校读,你說我怎么就攤上這事】蓿” “怎么了地熄?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長芯杀。 經常有香客問我端考,道長,這世上最難降的妖魔是什么揭厚? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任却特,我火速辦了婚禮,結果婚禮上筛圆,老公的妹妹穿的比我還像新娘裂明。我一直安慰自己,他們只是感情好太援,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布闽晦。 她就那樣靜靜地躺著扳碍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仙蛉。 梳的紋絲不亂的頭發(fā)上笋敞,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機與錄音荠瘪,去河邊找鬼夯巷。 笑死,一個胖子當著我的面吹牛哀墓,可吹牛的內容都是我干的趁餐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼篮绰,長吁一口氣:“原來是場噩夢啊……” “哼后雷!你這毒婦竟也來了?” 一聲冷哼從身側響起吠各,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤喷面,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后走孽,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡琳状,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年磕瓷,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片念逞。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡困食,死狀恐怖,靈堂內的尸體忽然破棺而出翎承,到底是詐尸還是另有隱情硕盹,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布叨咖,位于F島的核電站瘩例,受9級特大地震影響,放射性物質發(fā)生泄漏甸各。R本人自食惡果不足惜垛贤,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望趣倾。 院中可真熱鬧聘惦,春花似錦、人聲如沸儒恋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至禀酱,卻和暖如春炬守,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背比勉。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工劳较, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浩聋。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓观蜗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親衣洁。 傳聞我的和親對象是個殘疾皇子墓捻,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現坊夫,斷路器砖第,智...
    卡卡羅2017閱讀 134,663評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,172評論 25 707
  • 國家電網公司企業(yè)標準(Q/GDW)- 面向對象的用電信息數據交換協議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,988評論 6 13
  • 朝霞漫天始出發(fā),車馬勞頓心卻歡环凿。 群山巍峨風景麗梧兼,快步如飛趕路急。 山路崎嶇十八彎智听,歌聲縈繞徹云間羽杰。 狂風驟雨浴吾...
    牧峰閱讀 698評論 2 2
  • 兩周前去了趟地壇公園,聽說那里的杏葉非常漂亮到推。在門口買了串冰糖葫蘆就去逛了考赛,走到一條兩邊是法國梧桐的小路邊坐著,仰...
    阿溯閱讀 769評論 0 0