شروع دوره پایتون از پنجشنبه 1 خرداد ، مقدماتی تا پیشرفته، بدون پیش نیاز شروع دوره پایتون از پنجشنبه 1 خرداد ، مقدماتی تا پیشرفته، بدون پیش نیاز
🎯 ثبت نام

ساخت LogView

کلیه حقوق مادی و معنوی این مقاله متعلق به آموزشگاه تحلیل داده می باشد و هر گونه استفاده غیر قانونی از آن پیگرد قانونی دارد.

ساخت LogView

در این مقاله به شما آموزش خواهم داد چطور یک با استفاده از Font Awesome یک رابط کاربری برای LoginView ایجاد کنیم، چطور  LoginViewModel را ایجاد کنیم و در آخر چطور انتقال بین صفحات مختلف را کنترل کنیم.

ساخت UI با استفاده از Font Awesome

Font Awesome شامل آیکونی هایی است که می توان آن ها را بوسیله یک برچسب نمایش داد. به این ترتیب خواهید توانست از این فونت ها برای نمایش آیکون ها در برنامه استفاده کنید. برای مثال از آیکون های Microsoft، Google و Facebook به جای استفاده از تصاویر  استفاده خواهیم کرد.

پروژه ENEI.SessionsApp را باز کنید و یک صفحه XAML در پوشه Views اضافه کنید:


آموزش Xamarin


نتیجه یک صفحه به شکل زیر خواهد بود:

<?xml version="1.0" encoding="utf-8" ?>  

<ContentPage  

    xmlns="http://xamarin.com/schemas/2014/forms"  

    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"  

             x:Class="ENEI.SessionsApp.Views.LoginView">  

    <Label Text="{Binding MainText}" VerticalOptions="Center" HorizontalOptions="Center" />  

</ContentPage> 

حالا می توانید رابط کاربری  را تعریف کنید. اما قبل از آن باید در هر پلتفرم یکسری کارهای اضافی انجام دهید تا مطمئن شوید هنگام اجرای برنامه، فونت مورد نظر بر روی صفحه نمایش، ظاهر خواهد شد.

در حالت کلی به موارد زیر نیاز خواهید داشت:

در ENEI.SessionsApp.iOS

فایل FontAwesome.ttf را به پوشه Resources اضافه کنید:

آموزش Xamarin

تغییرات لازم را در Info.plist انجام دهید و فونت را در آن include کنید. در Visual Studio یا Xamarin Studio می توانید فایل XML را به شکل زیر ویرایش کنید:

<?xml version="1.0" encoding="UTF-8"?>  

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">  

<plist version="1.0">  

    <dict>  

      

      

  

      

        <key>UIAppFonts</key>  

        <array>  

            <string>FontAwesome.ttf</string>  

        </array>  

    </dict>  

</plist> 

در Xamarin Studio به شکل زیر فونت را اضافه می کنیم:

 

آموزش Xamarin

Android

فایل FontAwesome.ttf را به پوشه Assets اضافه می کنیم:

آموزش Xamarin

یک Render برای CustomLabel ایجاد کنید:

[assembly: ExportRenderer(typeof(CustomLabel), typeof(CustomLabelRenderer))]  

namespace ENEI.SessionsApp.Droid.Renders {  

    public class CustomLabelRenderer: LabelRenderer {  

        protected override void OnElementChanged(ElementChangedEventArgs < Label > e) {  

            base.OnElementChanged(e);  

  

            var label = (TextView) Control;  

            Typeface font = Typeface.CreateFromAsset(Forms.Context.Assets, "FontAwesome.ttf");  

            label.Typeface = font;  

        }  

    }  

}

در ENEI.SessionsApp.WinPhone یا ENEI.SessionsApp.WinRT:

فایل FontAwesome.ttf را به پوشه Assets/Fonts اضافه کنید:

آموزش Xamarin

FontAwesome.ttf را به عنوان Content و Copy Always تنظیم کنید.

آموزش Xamarin

در  ENEI.SessionsApp

یک کلاس به نام CustomLabel ایجاد کنید و برای هر پلتفرم یک FontFamily تعریف کنید.

public class CustomLabel: Label {  

    public CustomLabel() {  

        FontFamily = Device.OnPlatform(  

        iOS: "FontAwesome",  

        Android: null,  

        WinPhone: @  

        "\Assets\Fonts\FontAwesome.ttf#FontAwesome");  

  

        if (Device.OS == TargetPlatform.Windows) {  

            FontFamily = @  

            "\Assets\Fonts\FontAwesome.ttf#FontAwesome";  

        }  

    }  

} حالا می توانید UI مربوط به LoginView را ایجاد کنید. این صفحه به شکل زیر خواهد بود:

<?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:controls="clr-namespace:ENEI.SessionsApp.Controls;assembly=ENEI.SessionsApp"  

             x:Class="ENEI.SessionsApp.Views.LoginView"  

             Title="Authentication" BackgroundColor="White" x:Name="ContentPage"  

             Icon="ic_action_users.png">  

    <Grid BackgroundColor="White">  

        <Grid.RowDefinitions>  

            <RowDefinition Height="Auto" />  

            <RowDefinition Height="*" />  

        </Grid.RowDefinitions>  

        <!-- Title - Only for WP-->  

        <StackLayout Grid.Row="0" Orientation="Horizontal" Padding="20,10,0,0">  

            <StackLayout.IsVisible>  

                <OnPlatform Android="false" WinPhone="true" iOS="false"  

                    x:TypeArguments="x:Boolean" />  

            </StackLayout.IsVisible>  

            <Image WidthRequest="48"  

             HeightRequest="38"  

             Source="Images/ic_action_users.png"/>  

            <Label FontSize="Medium" FontAttributes="Bold"  

           TextColor="Black">  

                <OnPlatform Android="" WinPhone="Authentication"  

                    iOS="" x:TypeArguments="x:String" />  

            </Label>  

        </StackLayout>  

        <StackLayout Spacing="20" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" Grid.Row="1">  

            <!—login by social network will be here -->  

        </StackLayout>  

    </Grid>  

</ContentPage> 

سپس می توانید گزینه های login از طریق Faceboock، Google یا Microsoft را به شکل زیر تعریف کنید:

Facebook

<StackLayout WidthRequest="300" HeightRequest="60" Orientation="Horizontal" BackgroundColor="#3b5998" HorizontalOptions="Center" Spacing="20">  

    <controls:CustomLabel FontSize="Small"  

                            HorizontalOptions="CenterAndExpand"  

                            Text=""  

                            TextColor="White"  

                            VerticalOptions="CenterAndExpand" />  

    <Label FontAttributes="Bold"  

                FontSize="Small"  

                HorizontalOptions="StartAndExpand"  

                Text="Facebook"  

                TextColor="White"  

                VerticalOptions="CenterAndExpand" />  

</StackLayout> 

Google

<StackLayout WidthRequest="300" HeightRequest="60"  Orientation="Horizontal" BackgroundColor="#dd4b39" HorizontalOptions="Center" Spacing="20">  

    <controls:CustomLabel FontSize="Small"  

                              HorizontalOptions="CenterAndExpand"  

                              Text=""  

                              TextColor="White"  

                              VerticalOptions="CenterAndExpand" />  

    <Label FontAttributes="Bold"  

                FontSize="Small"  

                HorizontalOptions="StartAndExpand"  

                Text="Google"  

                TextColor="White"  

                VerticalOptions="CenterAndExpand" />  

</StackLayout> 

Microsoft

<StackLayout WidthRequest="300" HeightRequest="60"  Orientation="Horizontal" BackgroundColor="#219dfd" HorizontalOptions="Center" Spacing="20">  

    <controls:CustomLabel FontSize="Small"  

                           HorizontalOptions="CenterAndExpand"  

                           Text="ï…º"  

                           TextColor="White"  

                           VerticalOptions="CenterAndExpand" />  

    <Label FontAttributes="Bold"  

               FontSize="Small"  

               HorizontalOptions="StartAndExpand"  

               Text="Microsoft"  

               TextColor="White"  

               VerticalOptions="CenterAndExpand" />  

</StackLayout> 

 

     وقتی برنامه را اجرا کنید، نتیجه به شکل زیر خواهد بود:

آموزش Xamarin

ساخت LoginViewModel

تا اینجا رابط کاربری  LoginView ایجاد شده است و حالا نوبت به LoginViewModel رسیده است که یک Action برای هر گزینه از LoginView خواهد داشت.

پروژه ENEI.SessionsApp را باز کرده و LoginViewModel را به پوشه ViewModels اضافه کنید:



آموزش Xamarin


سپس به شکل زیر LoginCommnad را ایجاد می کنیم:

public class LoginViewModel

{

    public LoginViewModel()

    {

        LoginCommand = new Command(DoLogin);

    }

 

    private void DoLogin(object param)

    {

        var option = param.ToString();

        switch (option)

        {

            case "facebook":

                //connect with facebook api  

                break;

            case "goolge":

                //connect with google api  

                break;

            case "microsoft":

                //connect with microsoft api  

                break;

        }

    }

 

    public ICommand LoginCommand

    {

        get;

        set;

    }

} 

 

تا اینجا شما فقط ICommand را ایجاد کرده اید که در تمام گزینه ها ی LoginView مورد استفاده قرار می گیرد. به همین دلیل لازم است یک CommandParameter به نام گزینه ارسال کنید.

جهت اتصال UI به LoginViewModel باید آن را تعریف کرده و آن را به BindingContext متصل کنید:

public partial class LoginView : ContentPage

{

    public LoginView()

    {

        InitializeComponent();

        BindingContext = new LoginViewModel();

    }

}

سپس باید StackLayout، ریشه هر گزینه را به شکل زیر تغییر دهید:

<StackLayout WidthRequest="300" HeightRequest="60" Orientation="Horizontal" BackgroundColor="#3b5998" HorizontalOptions="Center" Spacing="20">  

    <StackLayout.GestureRecognizers>  

        <TapGestureRecognizer CommandParameter="facebook"  

                                    Command="{Binding LoginCommand}"/>  

    </StackLayout.GestureRecognizers>  

    <controls:CustomLabel FontSize="Small"  

                            HorizontalOptions="CenterAndExpand"  

                            Text=""  

                            TextColor="White"  

                            VerticalOptions="CenterAndExpand" />  

    <Label FontAttributes="Bold"  

                FontSize="Small"  

                HorizontalOptions="StartAndExpand"  

                Text="Facebook"  

                TextColor="White"  

                VerticalOptions="CenterAndExpand" />  

</StackLayout>

 

برای سایر گزینه ها هم این پیاده سازی را باید انجام دهید.

هنگام اجرای برنامه باید متد DoLogin را فراخوانی کنید:

آموزش Xamarin

کنترل جابجایی (Navigation)

تا به اینجا شما هیچ احراز هویتی ندارید. اما می توانید جریان کاملی برای برنامه ایجاد کنید.برای این کار باید انتقال بین صفحات مختلف را تعیین کنید که هدف اصلی این مرحله است.

برای شروع یک NavMessage ایجاد کنید:

public class NavMessage

{

    public string Page

    {

        get;

        set;

    }

 

    public object Param

    {

        get;

        set;

    }

} 

 

سپس در کلاس App برای انتقال بین صفحات می توانید از  MessaginCenter استفاده کنید:

public App()   

{  

    InitializeComponent();  

    MainPage = new NavigationPage(new LoginView()) {  

        BarBackgroundColor = Color.White,  

        BarTextColor = Color.Black,  

        BackgroundColor = Color.White,  

    };  

       MessagingCenter.Subscribe < NavMessage > (this, "Navigation", navMessage = > {  

        switch (navMessage.Page) {  

            case "login":  

                MainPage = new LoginView();  

                break;  

            case "sessions":  

                MainPage = new NavigationPage(new SessionsView()) {  

                    BarBackgroundColor = Color.White,  

                    BarTextColor = Color.Black,  

                    BackgroundColor = Color.White,  

                };  

                break;  

            case "details":  

                MainPage.Navigation.PushAsync(new SessionDetailsView(navMessage.Param as Session), true);  

                break;  

        }  

    });  

}

راه های مختلفی برای کنترل navigation وجود دارد که می تواند براساس نیاز های برنامه تعیین شود.

در LoginViewModel باید متد DoLogin را به شکل زیر تغییر دهید:

private void DoLogin(object param)

{

    var option = param.ToString();

    switch (option)

    {

        case "facebook":

            //connect with facebook api  

            break;

        case "goolge":

            //connect with google api  

            break;

        case "microsoft":

            //connect with microsoft api  

            break;

    }

    MessagingCenter.Send(new NavMessage

    {

        Page = "sessions"

    }, "Navigation");

} 

تا این لحظه احراز هویت مهم نبود.اما در این مرحله به آن خواهیم پرداخت.

در SessionsViewModel متد SeeSessionDetails را به شکل زیر تغییر دهید:

private void SeeSessionDetails(object param)

{

    var session = param as Session;

    if (session != null)

    {

        MessagingCenter.Send(new NavMessage

        {

            Page = "details",

            Param = session

        }, "Navigation");

    }

} 

و navigation را از SessionsView، حذف کنید. نتیجه این کار به شکل زیر خواهد بود:

public SessionsView()  

{  

    InitializeComponent();  

}

اگر برنامه را اجرا کنید، برنامه باید با LoginView آغاز شود و پس از آن SessionsView و SessionDetailsView را مشاهده خواهید کرد.

1394/10/05 1504 1046
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...