آموزش Behaviors در زامارین فرم

آموزش Behaviors در زامارین فرم

آموزش Behaviors در زامارین فرم

Behaviors به شما امکان می دهد قابلیت هایی را به کنترل های رابط کاربر اضافه کنید. Behaviors مستقیماً با API کنترل ارتباط برقرار می کند به گونه ای که می تواند به کنترل متصل شود و برای استفاده مجدد در بیش از یک برنامه ایجاد شود.

می توان آنها را برای ارائه طیف کاملی از عملکردها به کنترل ها ، استفاده کرد از جمله

  1. افزودن اعتبار سنجی به ورودی ایمیل
  2. ایجاد کنترل رتبه بندی با استفاده از سنسور حرکتی
  3. ایجاد یک انیمیشین و استفاده برای کنترل
  4. افزودن افکت به کنترل

Behaviors همچنین برای سناریوهای commanding نیز مورد استفاده قرار می گیرد . Behaviors یک روش مفید برای اتصال کنترل به یک دستور command است. علاوه بر این ، می توان آنها را برای مرتبط کردن دستورات با کنترل هایی که برای تعامل با دستورات طراحی نشده اند ، استفاده کرد. به عنوان مثال ، می توان از آنها برای فراخوانی یک دستور در پاسخ به فراخوانی یک رویداد استفاده کرد.

Xamarin.Forms از دو سبک مختلف Behaviors پشتیبانی می کند

  1. Xamarin.Forms behaviors - کلاسهایی که از کلاس Behavior یا Behavior <T> مشتق می شوند ، جایی که T نوع کنترلی است که Behaviors باید اعمال شود.
  2. Attached behaviors -یک کلاس استاتیک که همراه یک یا چند ویژگی خاص باشد

Attached Behaviors

attached property نوع خاصی از bindable property است . انها در یک کلاس تعریف و به کنترل های دیگر متصل و در XAML  به عنوان attributes قابل استفاده می باشند . برای مطالعه بیشتر به این مقاله مراجعه کنید . attached property ها می توانند به عنوان propertyChanged delegate تعریف شوند .هنگامی که رویداد  propertyChanged اجرا شود ، به کنترل متصل شده و پارامترهایی که مقادیر قدیم و جدید برای property را دارند ، ارجاع داده می شود. از این delegate می توان برای اضافه کردن قابلیت ها و توابع و امکانات جدید به کنترل استفاده کرد . به طور کلی propertyChanged ، کنترل را به صورت BindableObject  دریافت می کند و ان را به کنترل مورد نظر cast می کند سپس با استفاده از متد های موجود بر روی کنترل و مقادیر ان ، تغییرات اعمال می شود .

مسئله ای که در مورد Attached Behaviors وجود دارد این است که این رفتارها در یک کلاس استاتیک ، با خواص و روشهای ایستا تعریف می شوند. این امر ایجاد رفتارهای متصل به کنترل را در بعضی حالات را دشوار می کند. 

ایجاد Attached Behavior

در زیر یک نمونه یک NumericValidationBehavior را نشان می دهد ، که مقدار وارد شده توسط کاربر به یک کنترل ورودی ، اگر از نوع داده double نباشد قرمز رنگ می شود . این رفتار در کد زیر نشان داده شده است

public static class NumericValidationBehavior
{
    public static readonly BindableProperty AttachBehaviorProperty =
        BindableProperty.CreateAttached (
            "AttachBehavior",
            typeof(bool),
            typeof(NumericValidationBehavior),
            false,
            propertyChanged:OnAttachBehaviorChanged);

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

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

    static void OnAttachBehaviorChanged (BindableObject view, object oldValue, object newValue)
    {
        var entry = view as Entry;
        if (entry == null) {
            return;
        }

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

    static void OnEntryTextChanged (object sender, TextChangedEventArgs args)
    {
        double result;
        bool isValid = double.TryParse (args.NewTextValue, out result);
        ((Entry)sender).TextColor = isValid ? Color.Default : Color.Red;
    }
}

کلاس NumericValidationBehavior شامل یک property با نام AttachBehavior و به همراه متد های getter و setter که وظیفه اضافه  و حذف کردن behavior به کنترل را دارند .propertyChanged این کلاس با متد OnAttachBehaviorChanged پر شده است . کنترل در پارامتر ورودی و در قالب BindableObject به این متد ارسال می شود . پس از cast ان به کنترل entry رویداد OnEntryTextChanged را به entry.TextChanged اضافه می کنیم . 

نحوه استفاده از Attached Behavior

همانطور که در کد XAML زیر نشان داده شده است ، کلاس NumericValidationBehavior را می توان با افزودن ویژگی  AttachBehavior به یک کنترل ورودی استفاده کرد

<ContentPage ... xmlns:local="clr-namespace:WorkingWithBehaviors;assembly=WorkingWithBehaviors" ...>
    ...
    <Entry Placeholder="Enter a System.Double" local:NumericValidationBehavior.AttachBehavior="true" />
    ...
</ContentPage>

معادل کد XAML بالا به صورت سی شارپ در مثال زیر نشان داده شده است

var entry = new Entry { Placeholder = "Enter a System.Double" };
NumericValidationBehavior.SetAttachBehavior (entry, true);

حذف Attached Behavior از کنترل

همانطور که در مثال کد XAML زیر نشان داده شده است ، کلاس NumericValidationBehavior را می توان از کنترل خارج کرد ، زیرا ویژگی AttachBehavior روی false تنظیم شده است

<Entry Placeholder="Enter a System.Double" local:NumericValidationBehavior.AttachBehavior="false" />

معادل کد سی شارپ

var entry = new Entry { Placeholder = "Enter a System.Double" };
NumericValidationBehavior.SetAttachBehavior (entry, false);

در زمان اجرا ، ورودی AttachBehavior="false" است در نتیجه متد OnEntryTextChanged از ثبت TextChanged خارج می شود به عبارتی de-register می شود و اعتبار سنجی بر روی کنترل کار نمی کند .

Xamarin.Forms behaviors

Xamarin.Forms behaviors مشتق شده از دو کلاس Behavior یا Behavior<T> می باشد . روند ایجاد behaviors به شرح زیر است

  1. ایجاد یک کلاس که از یکی از دو کلاس Behavior یا Behavior<T> مشتق شده باشد . T  همان نوع کنترلی است که مورد استفاده قرار می گیرد به عنوان مثال Lable
  2. بازنویسی متد OnAttachedTo برای تنظیم behaviors
  3. بازنویسی متد OnDetachingFrom برای تنظیم cleanup
  4. پیاده سازی عملکرد اصلی تابع

این منجر به ساختاری می شود که در مثال کد زیر نشان داده شده است

public class CustomBehavior : Behavior<View>
{
    protected override void OnAttachedTo (View bindable)
    {
        base.OnAttachedTo (bindable);
        // Perform setup
    }

    protected override void OnDetachingFrom (View bindable)
    {
        base.OnDetachingFrom (bindable);
        // Perform clean up
    }

    // Behavior implementation
}

متد OnAttachedTo بلافاصله بعد از اینکه behavior اضافه شد ، اجرایی می شود .ورودی این متد ، ارجاعی از کنترل را دریافت می کند و رویداد های handler  را برای Behavior implementation ثبت (register ) می کند .

متد OnDetachingFrom بلافاصله بعد از اینکه behavior از کنترل حذف شد ، اجرایی می شود .ورودی این متد ، ارجاعی از کنترل را دریافت می کند و رویداد های handler  را برای Behavior implementation حذف (cleanup) می کند .

ایجاد Xamarin.Forms Behavior

در مثال زیر درصورتی که کاربر نوع داده غیر double را وارد کند رنگ متن قرمز می شود .

public class NumericValidationBehavior : Behavior<Entry>
{
    protected override void OnAttachedTo(Entry entry)
    {
        entry.TextChanged += OnEntryTextChanged;
        base.OnAttachedTo(entry);
    }

    protected override void OnDetachingFrom(Entry entry)
    {
        entry.TextChanged -= OnEntryTextChanged;
        base.OnDetachingFrom(entry);
    }

    void OnEntryTextChanged(object sender, TextChangedEventArgs args)
    {
        double result;
        bool isValid = double.TryParse (args.NewTextValue, out result);
        ((Entry)sender).TextColor = isValid ? Color.Default : Color.Red;
    }
}

کلاس NumericValidationBehavior مشتق شده از Behavior<T> و T  همان کنترل Entry زامارین می باشد .متد OnAttachedTo یک event handler  را برای رویداد textchanged ثبت (registers) کرده است .همچنین متد OnDetachingFrom رویداد TextChanged  را برای  جلوگیری از memory leaks حذف (de-registering) می کند . متد OnEntryTextChanged هم بررسی ورودی کاربر را انجام می دهد .

در زامارین فرم behavior  ، خصوصیت  BindingContext قابل ست شدن و استفاده نیست .  زیرا می توان behavior را از طریق style به اشتراک گذاشت و برای چندین کنترل اعمال کرد.

نحوه استفاده از Xamarin.Forms Behavior

هر کنترل Xamarin Forms یک مجموعه Behavior دارد که می تواند یک یا چند Behavior به آن اضافه کرد ، همانطور که در مثال کد XAML زیر نشان داده شده است

<Entry Placeholder="Enter a System.Double">
    <Entry.Behaviors>
        <local:NumericValidationBehavior />
    </Entry.Behaviors>
</Entry>

معادل کد سی شارپ 

var entry = new Entry { Placeholder = "Enter a System.Double" };
entry.Behaviors.Add (new NumericValidationBehavior ());

نحوه استفاده از Xamarin.Forms Behavior در Style

Behaviors ها را می توان در یک سبک صریح یا ضمنی نیز استفاده کرد. با این حال ، ایجاد سبکی که ویژگی Behaviors را برای یک کنترل تنظیم کند ، امکان پذیر نیست زیرا این ویژگی فقط خواندنی است. راه حل این است که یک attached property به کلاس Behavior اضافه کنید که افزودن و حذف Behavior را کنترل کند. 

مثال زیر یک attached property را نشان می دهد که کنترل و اضافه کردن NumericValidationBehaviour را کنترل می کند

public class NumericValidationBehavior : Behavior<Entry>
{
    public static readonly BindableProperty AttachBehaviorProperty =
        BindableProperty.CreateAttached ("AttachBehavior", typeof(bool), typeof(NumericValidationBehavior), false, propertyChanged: OnAttachBehaviorChanged);

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

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

    static void OnAttachBehaviorChanged (BindableObject view, object oldValue, object newValue)
    {
        var entry = view as Entry;
        if (entry == null) {
            return;
        }

        bool attachBehavior = (bool)newValue;
        if (attachBehavior) {
            entry.Behaviors.Add (new NumericValidationBehavior ());
        } else {
            var toRemove = entry.Behaviors.FirstOrDefault (b => b is NumericValidationBehavior);
            if (toRemove != null) {
                entry.Behaviors.Remove (toRemove);
            }
        }
    }
    ...
}

کلاس NumericValidationBehavior شامل یک attached property به نام AttachBehaviorProperty  است که Behavior کنترلی که به آن متصل می شود را کنترل می کند.همچنین متد OnAttachBehaviorChanged در ان register  شده است.در این متد در صورتی که پارامتر new value  ارزش درستی داشته باشد به کنترل entry  رفتار NumericValidationBehavior اضافه می شود .

در مثال زیر یک سبک صریح را برای NumericValidationBehaviour نشان می دهد که از ویژگی  AttachBehavior استفاده می کند و می تواند بر کنترل های ورودی اعمال شود

<Style x:Key="NumericValidationStyle" TargetType="Entry">
    <Style.Setters>
        <Setter Property="local:NumericValidationBehavior.AttachBehavior" Value="true" />
    </Style.Setters>
</Style>

در صورتی که کنترلی خصوصیت style را با کلید NumericValidationStyle در خود تعریف کند ، این رفتار به ان افزوده می شود 

<Entry Placeholder="Enter a System.Double" Style="{StaticResource NumericValidationStyle}">

حذف Behavior از کنترل

روش OnDetachingFrom برای حذف رفتار از کنترل استفاده می شود . با این حال ، رفتارها به طور ضمنی از کنترل ها حذف نمی شوند ، مگر اینکه از متد های حذف و Clear استفاده شود. مثال زیر ، حذف یک رفتار خاص از کنترل را نشان می دهد.

var toRemove = entry.Behaviors.FirstOrDefault (b => b is NumericValidationBehavior);
if (toRemove != null) {
    entry.Behaviors.Remove (toRemove);
}

برای پاک و clear کردن از دستور زیر استفاده کنید

entry.Behaviors.Clear();

 توجه داشته باشید که هنگام بیرون آمدن صفحات از پشته ناوبری ، Behavior به طور ضمنی از کنترل ها حذف نمی شوند. و باید انها را قبل از خارج شدن از محدوده صفحه ها ، صریحاً حذف شوند.

افزودن نظر جدید

در صورتی که وارد نشده باشید نظر شما بعد از تایید ادمین منتشر خواهد شد

نظرات بدون نمایش ایمیل و شماره تماس منتشر خواهد شد

وارد کردن فیلد های ستاره دار ( * ) الزامی است

 
 
 
 
 

 

0 نظر ثبت شده است