衣咸注:前面我們在《如何在Fuse中建立自定義的UI組件類》這篇文章有講過如何建立一個自定義的組件類,如果說前文講的是操作層面的內容的話,那么本文講的則針對新建類的后臺實現方式與運作機制的分析。
一個簡單的.ux文件
一個簡單的被命名為MyApp.ux
的UX Markup代碼文件一般如下:
<pre>
<App Theme="Basic">
<Text Value="Hello, World!" />
</App>
</pre>
在通過Fuse編譯器編譯后,Uno編譯系統將轉換上述代碼為等價的Uno代碼,如下:
<pre>
public class MyApp: Fuse.App
{
public MyApp()
{
InitializeUX();
}
internal void InitializeUX()
{
Theme = Fuse.BasicTheme.Singleton;
RootNode = new Text() { Value = "Hello, World!" };
}
}
</pre>
給你的類命名
默認狀態時,類使用的名稱取自定義他自身的.ux文件名前綴。在上述例子中的類將取MyApp.ux文件名的前綴作為類命名,也就是MyApp。本文英文原文:https://www.fusetools.com/learn/guides/ux-markup-creating-new-classes
你也可以在你的根節點使用ux:Class
屬性來指定一個不同的名稱(和命名空間):
<pre>
<App Theme="Basic" ux:Class="NinjaProductions.NinjaApp">
<Text Value="Hello, World!" />
</App>
</pre>
這將會產生出如下代碼:
<pre>
namespace NinjaProductions
{
public class NinjaApp: Fuse.App
{
...
}
}
</pre>
你也可以在一個UX文檔中指定你的內部類,具體參看Fuse手冊的《Styling and Resources》章節的詳述。
每一個XML元素都是對象
在一個UX Markup文檔中的每一個XML元素都是一個簡單的對象——一個從Uno類中實例化而來的對象。
這意味著下面的UX代碼:
<Button Text="OK" />
大致等價于:
<pre>
var temp1 = new Button();
temp1.Text = "OK";
</pre>
在你的UX文檔中,每一個XML元素都可以在你的代碼編輯器里邊選擇Go to Source
來查看他詳細的實施執行細節。(衣咸注:不過我沒有找到哈!)
給對象建立一個后端支持字段(ux:Name)
當設立一個你自己的類時,默認狀態為,通過引用所產生的對象僅僅存儲在臨時變量集中。
如果你想要存儲一個引用所產生的對象到你的類中的后端字段,你可以給他一個名稱,使用屬性ux:Name
。
<Button Text="OK" ux:Name="button1" />
這將在你的類中合成產生一個用button1
命名的內部字段:
internal Button button1;
然后,分配這個新產生的類到那個字段中,來代替一個臨時的變量:
button1 = new Button();
button1.Text = "OK";
你也可以參看:《UX Markup語言之屬性與梆定》
后臺代碼(代碼后置)
定義:每一個UX(后綴為.ux)文件都會產生一個partial
局部類,這意思是你自由地增加了額外的Uno文件到你的項目中,他使用了你自己自定義的Uno代碼來拓展擴充了所產生的Uno代碼。這種機制就稱為代碼后置(也可稱為后臺代碼)。
這些后臺代碼通常包含了與你的UI層級交互的邏輯,像額外的設置代碼呀、數據全域data population、自定義事件處理等。
如果一個UX文件被命名為Foo.ux
,那么與之相應的后代碼就特別地被命名為Foo.ux.uno
。
注意,后臺代碼不同于你項目文件里面的.cache
文件夾中的所產生的對應的合成碼,他們被命名為Foo.ux.g.uno
。
使用ux:AutoCtor來禁用默認的構建器constructor
你的UX層級將會建立,在產生的合成InitializeUX
方法中。
默認狀態,將會自動為你的類建立一個默認的構建器用來調用呼叫這個方法。
一些時候你想要在后臺代碼中手動地控制你的類的構建器,為了做到這些,你常常需要禁用自動產生的構建器。你可以通過指定ux:AutoCtor="false"
在你的類元素中來實現,像這樣:
<pre>
<App ux:AutoCtor="false" ux:Class="MyApp">
...
</App>
</pre>
然后,在你的后臺代碼中你做的實際上是:
<pre>
public partial class MyApp
{
public MyApp()
{
InitializeUX();
// ... Custom code here
}
}
</pre>
Tag:Fuse, Fuseapp, Fusetools, native app
發布時間:2016年05月14日
博客被黑,挪窩簡書安家……