2017/3/31

Xamarin.Forms 教學系列文(十二.壹)Styles - 多元件可套用樣式


學習目標
  • Style 的基本屬性與寫法
  • Setter Value 引用資源檔
  • Style 繼承 - BaseOn

可以先複習一下 第十章,有個很重要的東西叫 ResourceDictionary 會在這章節出現。

Xamairn 提供了一個 Style 的類別,顧名思義... 有點類似網頁上的 css。

當同一個畫面上有許多物件要用到相同的屬性時,可以利用 Style 省下許多重複的標籤,讓程式碼簡潔,更好維護。

還記得第十章我們將 Button 的屬性做成資源檔後用 StaticResource 呼叫:
    <Button Text=" Discere faciendo " 
            HorizontalOptions="{StaticResource horzOptions}" 
            VerticalOptions="{StaticResource vertOptions}" 
            BorderWidth="{StaticResource borderWidth}" 
            TextColor="{StaticResource textColor}"
            BackgroundColor="{StaticResource backgroundColor}"
            BorderColor="{StaticResource borderColor}" 
            FontSize="{StaticResource fontSize}" />

其實這樣寫也沒減少多少垃圾標籤...

所以需要 Style 來幫忙!!! 而 Style 也是 ResourceDictionary 的一種,

寫起來會像這樣:
  <ContentPage.Resources>
    <ResourceDictionary>
      <Style x:Key="buttonStyle" TargetType="Button">
        …
      </Style>
    </ResourceDictionary>
  </ContentPage.Resources>

2017/3/24

Xamarin.Forms 教學系列文(十.貳)擴充標籤 - 動態 & 客製化



學習目標
  • DynamicResource
  • ResourceDictionary 的階層制
  • 客製化擴充標籤

延續上一小節的 Resource,除了 StaticResource 外,還有一個 DynamicResource,顧名思義就是要顯示動態資訊的資源檔,而最常見的動態資料就是時間

直接來看程式,我們先在 C# 設定好 Resource,其值每秒都會更改:
        public partial class DynamicVsStaticPage : ContentPage
        {
            public DynamicVsStaticPage()
            {
                InitializeComponent();

                Device.StartTimer(TimeSpan.FromSeconds(1), () =>
                {
                    Resources["currentDateTime"] = DateTime.Now.ToString();
                    return true;
                });
                
            }
        }

2017/3/17

Xamarin.Forms 教學系列文(十.壹)擴充標籤 - 靜態 & 資源檔使用


學習目標
  • x:Static - XAML 類 C# 再來一發
  • Resource - StaticResource - 可重複利用的擴充標籤

Xamarin 一直積極的要讓 XAML 做一些 C# 能做的事情,例如這一章節要講的擴充標籤  (markup extensions)。

在 C# 內要指派給 triangle.Angle1 值的話可以如下:
triangle.Angle1 = 45; 
triangle.Angle1 = 180 * radians / Math.PI; 
triangle.Angle1 = angles[i]; 
triangle.Angle1 = animator.GetCurrentAngle();

只要 結果回傳 是浮點數 (double) 就好。

但你沒辦法在 XAML 內寫上這種鬼東西的:

<triangle.Angle1>
    180 * radians / Math.PI
</triangle.Angle1>
讓哥懷念起 MVC 的 Razor 真是方便...
 鑒於以上原因,Xamarin 在 XAML 2009 規格內定義了 擴充標籤 (markup extensions),讓我們在編寫 XAML 時能有更多的彈性。

2017/3/14

Xamarin.Forms 教學系列文(八.貳 + 九)事件 x 觸擊 x 跨平台方法




學習目標
  • XAML Events
  • Tap gestures
  • 跨平台方法實作與使用

這小節主要延續第八章 XAML 和 C# 的配合,介紹 XAML 事件指派,與設定任何 Visual Elements 都可以進行的 互動事件 ( GestureRecognizers )。
Xamarin GestureRecognizers 互動事件目前有三種,觸擊 (Tap)、縮放 (Pinch) 和 Pan (拖曳)。

最後講解第九章,針對不同平台的方法實作,與前面提到的 onplatform 不一樣,

因為有些 "共用" 方法還未出現於 Xamarin.Forms,所以必須將實作拉到 iOS 或 Android 專案內,再回到 Portable 專案內執行。

原文書第八章末和第九章其實有實作一個叫做 Monkey tap 的小遊戲 (篇幅滿大的),但不會出現在本小節教學,有機會再另一開篇好了...
這系列的教學著重於方法的介紹。

2017/3/9

Xamarin.Forms 教學系列文(八.壹)XAML 與 C# 完美配合


學習目標
  • 從 XAML 使用參數與呼叫方法 來建構物件
  • x:Name - Visual Elements 相對於 C# 的 ID
  • 客製化 XAML View,可重複利用的 View

在建立 XAML 時都會附帶一支 .cs 檔案,除了將關注點分離外,也讓我們在寫 XAML 時擁有更多的彈性,能夠利用 .cs 去控制 XAML 的物件。

這也是我們稱呼為 code-behind 的作法。

此章節會比較分散,每一段落講解的東西都較獨立,基本上就是了解一下 XAML 和 cs 之間如何互相運作。

先來看一下如何在 XAML 類 C#,達到 建構物件 的目的。

2017/3/6

Xamarin XAML Intellisense 失效/無作用

特地開一篇文章來講這件事好了,

有在使用 Visual Studio 應該知道,intellisense 是 coding 時不可或缺的內建工具...


什麼是 intellisense ??

就是當你按下第一個字元後出現的智慧選詞功能,

如圖:


Intellisense 可以避免很多我們打字時的失誤... 甚至加速編寫程式時的速度。

若我們寫 Xamarin XAML 時發現  Intellisense 失效...

會很幹。

2017/3/4

Xamarin.Forms 教學系列文(七)XAML vs. code


學習目標
  • XAML 與 code 的差異
  • 屬性標籤(Property-element syntax)
  • OnPlatform in XAML 
  • 可省略的 Content property

XAML 是微軟拿來設計 Windows Phone 前端用,一種衍生自 XML 的標籤式語法

最早出現於一般桌面 windows 應用程式~ 感謝 布陋閣 指證。

標籤式語法的好處就是關注點分離 (Separation of concerns,SOC):

將邏輯從前端分離出來,可以讓前端設計師程式設計師專注於他們要做的事情上 (幫台灣的全端工程師QQ)。 

另一個好處是較好維護,畢竟 Visual Elements 是以巢狀的方式去堆疊,而標籤語法維護巢狀時是相對容易的。

不過,XAML 有許多無法辦到的事情,例如迴圈、流程控制…等邏輯控制。
另外,Visual Studio 還沒支援拖曳物件設計前端 (或許未來吧?),截至目前還是直接寫 code。

2017/3/1

Xamarin.Forms 教學系列文(六.貳)App Lifecycle & Properties


本篇沒有圖就是狂。


學習目標
  • Application.Current.Properties 不死系儲存值物件
  • App Lifecycle
  • App class 和 Page class 全域變數溝通

假設你在 六.壹 最後一個範例程式按下一長串重要的數字,卻來了一通電話導致 App 中斷 ( terminate ),當你結束通話後重新開啟 App,你還是會希望此串數字是 存在 的吧!

當然系統不會聰明到自動幫你存下這些資料,所以這一小節教你如何在 App 中斷時,手動存下資訊。