XAML in Xamarin.Forms 基礎篇 電子書

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

Xamarin.Forms 快速入門 電子書

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

2016/09/16

Xamarin.Forms 自訂附加屬性 Attached Property

在這個範例中,將會說明如何產生一個具有類似 Grid.Row 這樣用法的附加屬性;這裡,將會新建一個附加屬性類別,當這個附加屬性設定在 Entry 控制項上的時候,就會自動設定該 Entry 控制項上的其他相關屬性。
自訂附加屬性
首先您需要先產生一個類別。
使用 BindableProperty.CreateAttached 靜態方法,產生一個附加屬性物件,在產生這個附加屬性的當時,定義 propertyChanged 引數,用於設定當該附加屬性值有異動的時候,需要呼叫的委派方法;在這個方法內,將會依據新設定的附加屬性值,設定所附加這個 Entry 的浮水印、字體大小、輸入鍵盤的屬性;若附加屬性並不是設定 Entry 控制項內,則不會做任何處理動作。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;

namespace AttProp
{
    public class EntryTypeAttached
    {
        public static readonly BindableProperty EntryTypeProperty =
               BindableProperty.CreateAttached(
                   propertyName: "EntryType",
                   returnType: typeof(string),
                   declaringType: typeof(Entry),
                   defaultValue: null,
                   defaultBindingMode: BindingMode.OneWay,
                   validateValue: null,
                   propertyChanged: OnEntryTypeChanged);

        private static void OnEntryTypeChanged(BindableObject bindable, object oldValue, object newValue)
        {
            var fooEntry = bindable as Entry;
            if (fooEntry == null)
                return;

            var foooldValue = (oldValue as string)?.ToLower();
            var foonewValue = (newValue as string)?.ToLower();
            if(foonewValue == null)
            {
                return;
            }
            switch (foonewValue)
            {
                case "None":
                    break;
                case "email":
                    fooEntry.SetValue(Entry.PlaceholderProperty, "請輸入電子郵件");
                    fooEntry.Keyboard = Keyboard.Email;
                    fooEntry.FontSize = 20;
                    break;
                case "phone":
                    fooEntry.SetValue(Entry.PlaceholderProperty, "請輸入電話號碼");
                    fooEntry.Keyboard = Keyboard.Telephone;
                    fooEntry.FontSize = 20;
                    break;
                case "number":
                    fooEntry.SetValue(Entry.PlaceholderProperty, "請輸入數值");
                    fooEntry.Keyboard = Keyboard.Numeric;
                    fooEntry.FontSize = 20;
                    break;
                default:
                    break;
            }
        }

        // Helper methods for attached bindable property. 
        public static void SetEntryType(BindableObject bindable, string entryType)
        {
            bindable.SetValue(EntryTypeProperty, entryType);
        }
        public static string GetEntryType(BindableObject bindable)
        {
            return (string)bindable.GetValue(EntryTypeProperty);
        }
    }
}
當要引用這個附加屬性到 Entry 控制項內,可參考底下用法:
在這裡,您需要先定義使用這個附加屬性的 XAML 命名空間,您可以在根項目內,使用xmlns:CustomAttached="clr-namespace:AttProp"來加入新可使用的 XAML 命名空間。
此時,您就可以在 XAML 頁面中,在 Entry 控制項內,使用這個新建立的附加屬性 : <EntryCustomAttached:EntryTypeAttached.EntryType="Email" />
<?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"
             xmlns:CustomAttached="clr-namespace:AttProp"
             x:Class="AttProp.Views.MainPage"
             Title="MainPage">
  <StackLayout HorizontalOptions="Center" VerticalOptions="Center">
    <Label Text="自訂附加屬性 Attached Property" />
    <Entry />
    <Entry CustomAttached:EntryTypeAttached.EntryType="Email" />
    <Entry CustomAttached:EntryTypeAttached.EntryType="Phone" />
    <Entry CustomAttached:EntryTypeAttached.EntryType="Number" />
  </StackLayout>
</ContentPage>

沒有留言:

張貼留言