XAML in Xamarin.Forms 基礎篇 電子書

XAML in Xamarin.Forms 基礎篇 電子書
XAML in Xamarin.Forms 基礎篇 電子書

Xamarin.Forms 快速入門 電子書

Xamarin.Forms 快速入門 電子書
Xamarin.Forms 快速入門 電子書

2016/08/19

Xamarin.Forms 警告與動作表對話窗

Xamarin.Forms 警告與動作表對話窗

這份筆將將會整理出 警告 Alert 對話窗與 動作表 Action Sheet 對話窗的使用;由於 Xamarin.Forms 提供了這兩種方法的使用 ( DisplayAlert / DisplayActionSheet ),不過,這兩種方法卻是定義在 Page 類別中,因此,這兩個方法僅能夠在程式碼後置 (code-behind) 的地方使用。
若您是採用了 Prism 的框架來進行開發 Xamarin.Forms 應用程式,根據 MVVM 的規範,您應該要在 檢視模型(ViewModel) 內來使用兩個方法,而在檢視模型內,因為 MVVM 的規範,是無法存取到 檢視 內的物件(當然,也是有辦法的,不過,有點違反 MVVM 設計模式了),因此,Prism 提供了 IPageDialogService 介面,您可以在建構式內注入這個介面,並取得其執行個體(Instance),就可以透過這個執行個體進行這兩個對話窗的操作了。
這份筆記的範例專案可以底下網址取得

傳統的 Xamarin.Forms 的用法

  1. 在範例專案中的 檢視(View),定義了這個應用程式所有的使用者介面,其 XAML 宣告如下,而這個範例的執行畫面也如下圖。
    XFandPrismAlert
    XFandPrismAlert
    XFandPrismAlert
    XFandPrismAlert
  2. 這個頁面中,定義了四個按鈕與四個標籤(Label),前兩個按鈕的按下事件將會定義在 code-behind 程式碼內,後兩個按鈕的按下事件,將會透過 ICommand 資料繫結到 檢視模型內的 DelegateCommand 物件。
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
             prism:ViewModelLocator.AutowireViewModel="True"
             x:Class="XFAlert.Views.MainPage"
             Title="MainPage">
  <StackLayout
    HorizontalOptions="Center" VerticalOptions="Center">
    <Button
      x:Name="btnAlert"
      Text="顯示 Xamarin.Forms 警告視窗"
      />
    <Label
      x:Name="lblXF選擇結果"
      Text="Xamarin.Forms 選擇結果"
      />
    <Button
      x:Name="btnActionSheet"
      Text="顯示 Xamarin.Forms 動作表單"
      />
     <Label
      x:Name="lblXF動作表單選擇結果"
      Text="Xamarin.Forms 動作表單 選擇結果"
      />
    <Button
      Text="顯示 Prism 警告視窗"
      Command="{Binding PrismAlertCommand}"
      />
    <Label
      Text="{Binding PrismAlert輸出結果}"
      />
    <Button
      Text="顯示 Prism 動作表單"
      Command="{Binding PrismActionSheetCommand}"
      />
    <Label
      Text="{Binding PrismActionSheet輸出結果}"
      />
 </StackLayout>
</ContentPage>
  1. MainPage.xaml 的 code-behind 定義如下:
  2. btnAlert.Clicked 事件展示了 DisplayAlert 的用法
  3. btnActionSheet.Clicked 事件展示了 DisplayActionSheet 的用法
using Xamarin.Forms;

namespace XFAlert.Views
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();

            btnAlert.Clicked += async (s, e) =>
              {
                  await DisplayAlert("警告", "您確定要繼續執行嗎?", "確定");
                  bool 選擇結果 = await DisplayAlert("通知", "您要開始下載這個檔案嗎?", "是", "否");
                  lblXF選擇結果.Text = 選擇結果.ToString();
              };
            btnActionSheet.Clicked += async (s, e) =>
              {
                  var 選擇結果 = await DisplayActionSheet("請選擇您要分享的目的應用程式?", "取消", "Google+", "Email", "Twitter", "Facebook");
                  lblXF動作表單選擇結果.Text = 選擇結果;
              };
        }

    }
}

Prism 提供的功能

  1. 底下為 MainPage 的檢視模型程式碼
  2. Prism 提供了 IPageDialogService 頁面,讓您可以使用者兩個對話窗功能,因此,您需要透過建構式注入的方法,取得這個介面的執行個體。
  3. 您也需要定義兩個 DelegateCommand 屬性,用於資料繫結到 XAML 上的 Button.Command 屬性上。
  4. 另外,也定義了兩個 string 的屬性,並且要實作出 INotifyPropertyChanged 介面的功能,在這裡使用的是 SetProperty
  5. 不論是使用 Xamarin.Forms 提供的方法或者 Prism 提供的方法,都需要使用非同步的方式來呼叫。
using Prism.Commands;
using Prism.Mvvm;
using Prism.Navigation;
using Prism.Services;
using System;
using System.Collections.Generic;
using System.Linq;

namespace XFAlert.ViewModels
{
    public class MainPageViewModel : BindableBase, INavigationAware
    {
        public IPageDialogService _dialogService { get; set; }
        public DelegateCommand PrismAlertCommand { get; set; }
        public DelegateCommand PrismActionSheetCommand { get; set; }

        #region PrismAlert輸出結果
        private string _PrismAlert輸出結果;
        public string PrismAlert輸出結果
        {
            get { return _PrismAlert輸出結果; }
            set { SetProperty(ref _PrismAlert輸出結果, value); }
        }
        #endregion

        #region PrismActionSheet輸出結果
        private string _PrismActionSheet輸出結果;
        public string PrismActionSheet輸出結果
        {
            get { return _PrismActionSheet輸出結果; }
            set { SetProperty(ref _PrismActionSheet輸出結果, value); }
        }
        #endregion

        public MainPageViewModel(IPageDialogService dialogService)
        {
            _dialogService = dialogService;

            PrismAlertCommand = new DelegateCommand(PrismAlert);
            PrismActionSheetCommand = new DelegateCommand(PrismActionSheet);

            PrismAlert輸出結果 = "Prism 選擇結果";
            PrismActionSheet輸出結果 = "Prism 動作表單 選擇結果";
        }

        private async void PrismAlert()
        {
            await _dialogService.DisplayAlertAsync("警告", "您確定要繼續執行嗎?", "確定");
            bool 選擇結果 =await _dialogService.DisplayAlertAsync("通知", "您要開始下載這個檔案嗎?", "是", "否");
            PrismAlert輸出結果 = 選擇結果.ToString();
        }

        private async void PrismActionSheet()
        {
            var 選擇結果 = await _dialogService.DisplayActionSheetAsync("請選擇您要分享的目的應用程式?", "取消", "Google+", "Email", "Twitter", "Facebook");
            PrismActionSheet輸出結果 = 選擇結果;
        }

        public void OnNavigatedFrom(NavigationParameters parameters)
        {

        }

        public void OnNavigatedTo(NavigationParameters parameters)
        {
        }
    }
}

Xamarin.Forms 附加行為 Behaviors 應用

Xamarin.Forms 附加行為 Behaviors 應用

在這份範例中,將會記錄如何自行客製化一個行為 (Behavior),用來減少在進行開發專案過程之中,不再需要過度撰寫許多程式碼;當需要某些功能或特性的時候,可以直接在 XAML 上進行宣告即可,如此,在頁面上的檢視(View 也可以稱為控制項 Control),就具備了這些預先設定的行為特性。
在這個範例專案中,將會設計一個使用者登入系統的頁面,這個頁面內有一個 Label 與兩個 Entry 控制項,您想要設計這樣的行為:當使用者尚未輸入任何帳號與密碼的時候,Entry 控制項的背景要顯示紅色,提醒使用者要輸入文字到這些欄位中;若使用者有在 Entry 輸入了文字,但是不足 6 個字元,則會使用紅色文字顏色作為提醒。因此,您將會需要新增一個新圍,提供這兩個功能,並且在 XAML 語言上直接套用新設計的行為。
底下為這個範例專案的執行結果
附加屬性行為範例

產生一個附加行為 Behavior

  1. 產生一個類別檔案
  2. 在這個類別檔案內,以底下程式碼加以置換
  3. 在這個類別檔案內,透過 BindableProperty.CreateAttached 宣告與產生的附加屬性,這個BindableProperty 必須要宣告為靜態。其中,最後一個參數是 propertyChanged 是用來處理當這個附加屬性的值有變動的時候,需要呼叫的委派方法。
  4. 接著,您需要定義兩個方法,用來存取這個附加屬性 GetAttachBehavior / SetAttachBehavior
  5. 透過在建立附加屬性物件(BindableProperty.CreateAttached)的時候,有指定 propertyChanged 參數,您需要定義這個委派方法。
    OnAttachBehaviorChanged 這個委派方法中,首先會先判斷現在的檢視(View)是不是一個 Entry 類型物件,若不是,則不做任何處理。接著會取得新設定的附加屬性值,若該附加屬性的值為真,則會綁定Entry.TextChanged 這個事件,否則,將會解除綁定事件。
  6. 最後,定義當發生了 TextChanged 事件之後,就會來檢查當時的 Entry 控制項的 Text 屬性是否有值,若沒有,則會設定背景顏色為紅色;若 Text 屬性有值,則會再檢查其輸入的字串長度是否有大於等於六個字元,若沒有,則會設定 TextColor 的屬性值為紅色。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;

namespace XFAttBehavior
{
    public class EmptyHighlightBehavior
    {
        // 產生一個附加屬性,用來定義是否要啟用空字串檢查與提示行為
        public static readonly BindableProperty EmptyHighlightProperty =
             BindableProperty.CreateAttached(
                 "EmptyHighlight",
                 typeof(bool),
                 typeof(EmptyHighlightBehavior),
                 false,
                 propertyChanged: OnAttachBehaviorChanged);

        public static bool GetAttachBehavior(BindableObject view)
        {
            return (bool)view.GetValue(EmptyHighlightProperty);
        }

        public static void SetAttachBehavior(BindableObject view, bool value)
        {
            view.SetValue(EmptyHighlightProperty, value);
        }

        static void OnAttachBehaviorChanged(BindableObject view, object oldValue, object newValue)
        {
            var entry = view as Entry;
            // 若這個檢視不是 Entry 類別,則不需要做任何處理動作
            if (entry == null)
            {
                return;
            }

            bool attachBehavior = (bool)newValue;
            if (attachBehavior)
            {
                RefreshBackgroundColor(entry);
                entry.TextChanged += OnEntryTextChanged;
            }
            else
            {
                entry.TextChanged -= OnEntryTextChanged;
            }
        }

        static void OnEntryTextChanged(object sender, TextChangedEventArgs args)
        {
            RefreshBackgroundColor(sender);
        }

        // 根據現在 Entry 檢視的 Text 屬性值,判斷是否要提示背景顏色,告知該欄位尚未輸入任何值
        static void RefreshBackgroundColor(object sender)
        {
            if (string.IsNullOrEmpty(((Entry)sender).Text))
            {
                ((Entry)sender).BackgroundColor = Color.Red;
            }
            else
            {
                if (((Entry)sender).Text.Length >= 6)
                {
                    ((Entry)sender).BackgroundColor = Color.Default;
                    ((Entry)sender).TextColor = Color.Default;
                }
                else
                {
                    ((Entry)sender).BackgroundColor = Color.Default;
                    ((Entry)sender).TextColor = Color.Red;
                }
            }
        }
    }
}

在 XAML 上使用剛剛定一個行為

  1. 請打開 MainPage.xaml,如同底下內容。
  2. 在底下的 XAML 標記語言中,您可以看到有在 Entry 控制項中,使用了附加屬性local:EmptyHighlightBehavior.EmptyHighlight="true" 宣告要使用 EmptyHighlightBehavior 這個附加屬性行為功能。
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:XFAttBehavior"
             x:Class="XFAttBehavior.MainPage">

  <ContentPage.Padding>40</ContentPage.Padding>

  <StackLayout>

  <Label 
    Text="請登入系統"
    VerticalOptions="Center" HorizontalOptions="Center" />

    <Entry
      Placeholder="請輸入帳號"
      local:EmptyHighlightBehavior.EmptyHighlight="true"
      />

    <Entry
      Placeholder="請輸入密碼"
      IsPassword="True"
      local:EmptyHighlightBehavior.EmptyHighlight="true"
      />



  </StackLayout>

</ContentPage>

2016/08/18

專有名詞英中對照表

專有名詞英中對照表

由於在整理相關文件的時候,經常會遇到一些英文專有名詞要翻要成為中文名稱,所以,整理這份筆記,將有遇到的專有名詞的英文/中文名詞,整理成為這份對這表。
關於中文翻譯名詞的來源,主要會由微軟官方網站的網頁 https://msdn.microsoft.com/zh-tw/library/67ef8sbd.aspx ,另外,也會從這個網址: http://terms.naer.edu.tw/,最後才是一些中文翻譯書籍
英文中文
Abstract factory pattern抽象工廠
Adapter轉換器
Adapter pattern介面卡 / 配接器模式 / 轉換器模式
Aggregate Root聚合根
Ambient Context環境脈絡
Anonymous types匿名類型
Anti-Pattern反模式
AOP (Aspect Oriented Programming)切面導向程式設計
Array陣列
Automatic Factory自動工廠
Auto-Wiring自動匹配
Base Type基底類型
Bastard Injection私生注入
Bridge pattern橋接模式
Builder Pattern生成器模式
Business Layer商業邏輯層
Caching快取
Chain of Responsibility責任鏈模式
Command命令模式
Composite組合
Composition Root組合根
Constructor Injection建構式注入
Context Object環境物件
Controller控制器
Cross-Cutting橫切面
Collections集合
Coupling耦合
DAL (Data Access Layer)資料存取層
DDD領域驅動設計
Decorator Pattern裝飾模式
DI (Dependency Injection)相依性注入
DTO (Data Transfer Object)資料傳送物件
Decorator裝飾模式
Delegates委派
Deferred Resolution延遲解析
Design Pattern設計模式
DIP (Dependency Inversion Principle)相依反轉原則
Domain Object領域物件
Enumeration Types列舉類型
Exception Handling異常處理
Extract Class提煉類別
Extract Interface提煉介面
Facade Pattern外觀模式
Factory Method工廠方法
Fluent串接呼叫的
Garbage Collection記憶體回收
Generics泛型
Hosting裝載
Inheritance繼承
Instance執行個體
Interception攔截
Interoperability互通性
IOC (Inversion of Control)控制反轉
ISP (Interface Segregation Principle)介面隔離原則
Iterator疊代器模式/迭代器
Late Binding晚期繫結
Layered Architecture分層架構
Lazy Initialization延遲初始化
Logging日誌
LSP (Liskov Substitution Principle)里氏替換原則
Losse Coupling寬鬆耦合
Mediator pattern中介者模式
Message Handlers訊息處理常式
Method Injection方法注入
Model模型
Null object Pattern空對象模式
Observer觀察者模式
OCP (Open/Closed Principle)開放/封閉原則
Onion Architecture洋蔥架構
ORM (Object Relation Mapping)物件關聯對應
Overloaded多載
Overloaded Constructors多載建構函數
Parameter Object參數物件
Presentation Layer展現層
Property Injection屬性注入
Prototype原型模式
Proxy Pattern代理模式
Reference Type參考類型
Reflection反映
Registration Convention依慣例註冊
Sealed密封
Service服務
Service Locator服務定位器
Setter injection設定函式注入
Singleton獨身模式 / 單例模式
Simple Factory簡單工廠
SRP (Single Responsibility Principle)單一責任原則
Strategy策略模式
TDD (Test-Driven Development)測試驅動開發
Template Method模板方法
Transient臨時的
Two-Factor Authentication雙因素認證
Type Resolving型別解析
Type類型
Unit Test單元測試
using引用
Value Type實值類型
Visitor訪問者模式
View檢視
ViewModel檢視模型
Weakly Typed弱型別的