আপনি কীভাবে জ্যামারিন.ফর্মগুলিতে পৃষ্ঠাগুলি স্যুইচ করবেন?


102

জামারিন ফর্মগুলিতে আপনি কীভাবে পৃষ্ঠাগুলির মধ্যে স্যুইচ করবেন?

আমার মূল পৃষ্ঠাটি একটি সামগ্রী পৃষ্ঠা এবং আমি কোনও ট্যাবড পৃষ্ঠার মতো কিছুতে যেতে চাই না।

আমি কনটেন্টপেজ না পাওয়া পর্যন্ত নতুন পৃষ্ঠাটি ট্রিগার করা উচিত এমন নিয়ন্ত্রণের পিতামাতাদের সন্ধান করে এটি সিউডো-ডু করতে সক্ষম হয়েছি এবং তারপরে একটি নতুন পৃষ্ঠার জন্য নিয়ন্ত্রণের সাথে সামগ্রীটি সরিয়ে আছি। তবে এটি সত্যই নিস্তেজ মনে হচ্ছে।


এমভিভিএম স্ট্রাকচারাল প্যাটার্নটি ব্যবহার করে এটি কীভাবে করা যায় তা দেখতে ইতিমধ্যে এই প্রশ্নের অনেকগুলি উত্তর ইতিমধ্যে পাওয়া গেছে, এই স্ট্যাকওভারফ্লো.com/a/37142513/ 9403963 দেখুন
আলিরাজা সাত্তারি

উত্তর:


68

Xamarin.Forms অন্তর্নির্মিত একাধিক নেভিগেশন হোস্ট সমর্থন করে:

  • NavigationPage, যেখানে পরবর্তী পৃষ্ঠায় স্লাইড হয়,
  • TabbedPage, আপনি পছন্দ করেন না
  • CarouselPage, এটি পরবর্তী / পূর্ববর্তী পৃষ্ঠাগুলিতে বাম এবং ডানে স্যুইচ করার অনুমতি দেয়।

এর শীর্ষে, সমস্ত পৃষ্ঠাগুলিও সমর্থন করে PushModalAsync()যা বিদ্যমান পৃষ্ঠাগুলির উপরে একটি নতুন পৃষ্ঠাকে কেবল চাপ দেয়।

একেবারে শেষে, আপনি যদি নিশ্চিত করতে চান যে ব্যবহারকারী আগের পৃষ্ঠায় ফিরে যেতে না পারে (অঙ্গভঙ্গি বা পিছনের হার্ডওয়্যার বোতামটি ব্যবহার করে), আপনি একই Pageপ্রদর্শিত রাখতে এবং এটি প্রতিস্থাপন করতে পারেন Content

মূল পৃষ্ঠাটি প্রতিস্থাপনের প্রস্তাবিত বিকল্পগুলি পাশাপাশি কাজ করে তবে প্রতিটি প্ল্যাটফর্মের জন্য আপনাকে এটি আলাদাভাবে পরিচালনা করতে হবে।


পুশমোডালএন্সিঙ্কটি নেভিগেশনের অংশ বলে মনে হচ্ছে, তাই না? নেভিগেশন বস্তু / শ্রেণিতে কীভাবে যাবেন তা আমি বুঝতে পারি না। আমি ধরে নিই যে আমার এমন কিছু অ্যাক্সেস করা দরকার যা নিষিদ্ধকরণ কার্যকর করে, তবে কী?
এরিক

যদি আপনার পৃষ্ঠাটি কোনও ন্যাভিগেশনপেজের অন্তর্ভুক্ত থাকে তবে আপনার পৃষ্ঠার মধ্যে থেকে নেভিগেশন সম্পত্তি অ্যাক্সেস করতে সক্ষম হওয়া উচিত
জেসন

4
একবার আমি নেভিগেশনপেজ ব্যবহার শুরু করি, সমস্ত কিছু জায়গায় পড়ে যায়। ধন্যবাদ
এরিক

4
@stephane যদি আমার প্রথম পৃষ্ঠার CarouselPage এবং আমার দ্বিতীয় পৃষ্ঠা masterDetailPage তারপর আমি কীভাবে পৃষ্ঠা সুইচ করতে পারেন দয়া করে বলুন stackoverflow.com/questions/31129845/...
অতুল Dhanuka

64

অ্যাপ্লিকেশন শ্রেণিতে আপনি মেইনপেজটি একটি নেভিগেশন পৃষ্ঠায় সেট করতে এবং মূল পৃষ্ঠাটি আপনার সামগ্রীপৃষ্ঠায় সেট করতে পারেন:

public App ()
{
    // The root page of your application
    MainPage = new NavigationPage( new FirstContentPage() );
}

তারপরে আপনার প্রথম কন্টেন্টপেজ কলটিতে:

Navigation.PushAsync (new SecondContentPage ());

আমি এটি করেছি তবে এখনও মূল পৃষ্ঠাটি ডিফল্ট পৃষ্ঠা যা খোলা। আমি মুখ্য পৃষ্ঠাতে সেট করা যে কোনও পৃষ্ঠাটির কোনও প্রভাব নেই। আমি সবেমাত্র প্রথম পৃষ্ঠাটি খুললাম। সমস্যা কি?
বেহজাদ

ভিজ্যুয়াল স্টুডিও Android.Content.Resনেভিগেশনের জন্য আমদানি করার পরামর্শ দেয় । এটি ঠিক বলে মনে হচ্ছে না, কোথা থেকে আমাকে এটি আমদানি করতে হবে?
খ্রিস্টান

41

যদি আপনার প্রকল্পটি পিসিএল ফর্ম প্রকল্প হিসাবে সেট আপ করা হয়ে থাকে (এবং সম্ভবত ভাগ করে নেওয়া ফর্ম হিসাবেও তবে আমি এটি চেষ্টা করি নি) এমন একটি বর্গ অ্যাপ.সি রয়েছে যা দেখতে এরকম দেখাচ্ছে:

public class App
{
    public static Page GetMainPage ()
    {     
        AuditorDB.Model.Extensions.AutoTimestamp = true;
        return new NavigationPage (new LoginPage ());
    }
}

আপনি পরিবর্তন করতে পারেন GetMainPage প্রকল্পটিতে সংজ্ঞায়িত একটি নতুন ট্যাবপ্যাজড বা অন্য কোনও পৃষ্ঠা ফিরে পদ্ধতিটি

সেখান থেকে আপনি কোড সম্পাদন করতে এবং করার জন্য আদেশ বা ইভেন্ট হ্যান্ডলার যুক্ত করতে পারেন

// to show OtherPage and be able to go back
Navigation.PushAsync(new OtherPage());

// to show AnotherPage and not have a Back button
Navigation.PushModalAsync(new AnotherPage()); 

// to go back one step on the navigation stack
Navigation.PopAsync();

4
এটি পৃষ্ঠাগুলির মধ্যে স্যুইচ করে না। এটি কেবল পরিবর্তন করে যে কোনও পৃষ্ঠাটি প্রাথমিকভাবে লোড করা হয়েছে।
ডাকমোজো

আপনার প্রশ্নটি একটি প্রধান পৃষ্ঠার কথা বলছিল। নেভিগেশন উদাহরণগুলির জন্য আপডেট উত্তর দেখুন
স্টেন পেট্রোভ

হেক Navigationএই উদাহরণে কি? - এটি কি আপনি কোথাও তৈরি একটি বস্তু? - আমি এই কোড নমুনায় এটি দেখতে পাচ্ছি না।
BrainSlugs83

নেভিগেশন একটি পৃষ্ঠায় সম্পত্তি
স্টেন পেট্রোভ

ধন্যবাদ; এফটিআর PushAsync()আমার পক্ষে কাজ করে নি, যখন PushModalAsync()করেছিল
নক করে

23

স্ট্যাকের উপরে একটি নতুন পৃষ্ঠা চাপুন, তারপরে বর্তমান পৃষ্ঠাটি সরিয়ে দিন। এটি একটি স্যুইচ ফলাফল।

item.Tapped += async (sender, e) => {
    await Navigation.PushAsync (new SecondPage ());
    Navigation.RemovePage(this);
};

আপনাকে প্রথমে নেভিগেশন পৃষ্ঠায় থাকা দরকার:

MainPage = NavigationPage(new FirstPage());

সামগ্রীতে স্যুইচিং আদর্শ নয় কারণ আপনার কেবলমাত্র একটি বড় পৃষ্ঠা এবং অন্যাপিয়ার ইক্য্টের মতো পৃষ্ঠা ইভেন্টগুলির একটি সেট রয়েছে।


Navigation.RemovePage();অ্যান্ড্রয়েডে সমর্থিত নয়।
রোহিত ভিপিন ম্যাথিউজ

4
নেভিগেশন.পাঠ (পৃষ্ঠা); অ্যান্ড্রয়েডে কাজ করে, প্রথমে একটি নেভিগেশন পৃষ্ঠার ভিতরে থাকা দরকার।
ড্যানিয়েল রবার্টস

আমি ফর্ম 1.4.2 এ আমার প্রকল্পে এটি ব্যাপকভাবে ব্যবহার করি। সম্ভবত তারা বাগটি ঠিক করেছে, অথবা আমি কেবল ভাগ্যবান হয়েছি এবং এটি এখনও আঘাত করি নি।
ড্যানিয়েল রবার্টস

আমি সর্বশেষতম সংস্করণে আছি এবং আমি এটি প্রতিলিপি করতে সক্ষম। সুতরাং আমি বিশ্বাস করি আপনি খুব ভাগ্যবান।
রোহিত ভিপিন ম্যাথিউজ

4
সহজ ইঙ্গিত - পৃষ্ঠা পরিবর্তন করার সময় স্থানান্তরগুলি সরাতে, দ্বিতীয় প্যারামিটার হিসাবে মিথ্যা যুক্ত করুন:await Navigation.PushAsync(new SecondPage(),false);
দামিয়ান গ্রীন

8

আপনি যদি পূর্ববর্তী পৃষ্ঠায় যেতে না চান অর্থাত অনুমোদনের পরে ব্যবহারকারীটিকে লগইন স্ক্রিনে ফিরে যেতে না দিন, তবে আপনি ব্যবহার করতে পারেন;

 App.Current.MainPage = new HomePage();

আপনি যদি পিছনে কার্যকারিতা সক্ষম করতে চান তবে কেবল ব্যবহার করুন

Navigation.PushModalAsync(new HomePage())

4

পুশএসিএনসি () পদ্ধতিটি ব্যবহার করে আপনি ধাক্কা দিতে পারেন এবং পপমোডালএেন্সেক () আপনি নেভিগেশন স্ট্যাক থেকে এবং পৃষ্ঠাগুলি পপ করতে পারেন। নীচের আমার কোড উদাহরণে আমার একটি নেভিগেশন পৃষ্ঠা রয়েছে (রুট পৃষ্ঠা) এবং এই পৃষ্ঠা থেকে আমি একটি লিখিত পৃষ্ঠাতে ধাক্কা দিই যা আমি লগইন পৃষ্ঠাতে সম্পূর্ণ হয়ে গেলে আমি মূল পৃষ্ঠায় ফিরে আসি pop

~~~ নেভিগেশনটিকে পেজ অবজেক্টগুলির একটি শেষ-ইন, প্রথম-আউট স্ট্যাক হিসাবে ভাবা যেতে পারে one পূর্ববর্তী পৃষ্ঠায় ফিরে যেতে অ্যাপ্লিকেশনটি স্ট্যাক থেকে বর্তমান পৃষ্ঠাটি পপ করবে। জ্যামারিন.ফর্মগুলির এই নেভিগেশনটি ইনভ্যাশন ইন্টারফেস দ্বারা পরিচালিত হয়

জ্যামারিন.ফর্মের একটি নেভিগেশনপেজ বর্গ রয়েছে যা এই ইন্টারফেসটি প্রয়োগ করে এবং পৃষ্ঠাগুলির স্ট্যাক পরিচালনা করবে। নেভিগেশনপেজ বর্গটি স্ক্রিনের শীর্ষে একটি নেভিগেশন বার যুক্ত করবে যা একটি শিরোনাম প্রদর্শন করে এবং একটি প্ল্যাটফর্মের উপযুক্ত ব্যাক বোতামও থাকবে যা পূর্ববর্তী পৃষ্ঠায় ফিরে আসবে। নিম্নলিখিত কোডটি দেখায় যে কোনও অ্যাপ্লিকেশনের প্রথম পৃষ্ঠার চারপাশে কীভাবে নেভিগেশনপেজটি মোড়ানো যায়:

উপরে তালিকাভুক্ত বিষয়বস্তুর উল্লেখ এবং জামারিন ফর্ম সম্পর্কিত আরও তথ্যের জন্য আপনার একটি লিঙ্ক পর্যালোচনা করা উচিত, নেভিগেশন বিভাগটি দেখুন:

http://developer.xamarin.com/guides/cross-platform/xamarin-forms/intr پيداوار-to-xamarin-forms/

~~~

public class MainActivity : AndroidActivity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        Xamarin.Forms.Forms.Init(this, bundle);
        // Set our view from the "main" layout resource
        SetPage(BuildView());
    }

    static Page BuildView()
    {
        var mainNav = new NavigationPage(new RootPage());
        return mainNav;
    }
}


public class RootPage : ContentPage
{
    async void ShowLoginDialog()
    {
        var page = new LoginPage();

        await Navigation.PushModalAsync(page);
    }
}

// সরলতার জন্য সরানো কোড কেবল পপ প্রদর্শিত হবে

private async void AuthenticationResult(bool isValid)
{
    await navigation.PopModalAsync();
}

4

এই থ্রেডটি খুব জনপ্রিয় বলে মনে হচ্ছে এবং এখানে বিকল্প উপায় আছে তা উল্লেখ না করে দুঃখ হবে - ViewModel First Navigation । বেশিরভাগ এমভিভিএম ফ্রেমওয়ার্কগুলি এটি ব্যবহার করে বাইরে চলে যায়, তবে আপনি যদি এটি সম্পর্কে কী বুঝতে চান তবে পড়া চালিয়ে যান।

সমস্ত সরকারী Xamarin. forms ডকুমেন্টেশন একটি সাধারণ, এখনও সামান্য এমভিভিএম খাঁটি সমাধান প্রদর্শন করে না। কারণ Page(দেখুন) এর ViewModelবিপরীতে এবং কিছুই সম্পর্কে কিছু জানা উচিত নয় । এই লঙ্ঘনের একটি দুর্দান্ত উদাহরণ এখানে:

// C# version
public partial class MyPage : ContentPage
{
    public MyPage()
    {
        InitializeComponent();
        // Violation
        this.BindingContext = new MyViewModel();
    }
}

// XAML version
<?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:viewmodels="clr-namespace:MyApp.ViewModel"
    x:Class="MyApp.Views.MyPage">
    <ContentPage.BindingContext>
        <!-- Violation -->
        <viewmodels:MyViewModel />
    </ContentPage.BindingContext>
</ContentPage>

আপনার যদি 2 পৃষ্ঠার অ্যাপ্লিকেশন থাকে তবে এই পদ্ধতিটি আপনার পক্ষে ভাল। তবে আপনি যদি একটি বড় উদ্যোগ সমাধানে কাজ করে থাকেন তবে আপনি আরও ভালভাবে একটি ViewModel First Navigationপদ্ধতির সাথে যেতে পারেন । এটি কিছুটা জটিল তবে অনেক ক্লিনার অ্যাপ্রোচ যা আপনাকে (দর্শন) এর ViewModelsমধ্যে নেভিগেশনের পরিবর্তে নেভিগেট করতে দেয় Pages। উদ্বেগের স্পষ্ট বিচ্ছিন্নতার পাশাপাশি একটি সুবিধা হ'ল আপনি সহজেই পরবর্তীগুলিতে পরামিতিগুলি পাস করতে পারেনViewModel বা নেভিগেশনের ঠিক পরে একটি অ্যাসিঙ্ক সূচনা কোডটি কার্যকর । এখন বিস্তারিত।

(আমি যতটা সম্ভব কোডের সমস্ত উদাহরণকে সহজ করার চেষ্টা করব)।

১. সবার আগে আমাদের এমন একটি জায়গা প্রয়োজন যেখানে আমরা আমাদের সমস্ত বস্তুর নিবন্ধন করতে পারি এবং lifetimeচ্ছিকভাবে তাদের জীবনকালকে সংজ্ঞায়িত করতে পারি। এই বিষয়ে আমরা একটি আইওসি ধারক ব্যবহার করতে পারি, আপনি নিজেই এটি চয়ন করতে পারেন। এই উদাহরণে আমি অটোফ্যাক ব্যবহার করব (এটি দ্রুত উপলব্ধগুলির মধ্যে একটি)। আমরা এটিতে একটি রেফারেন্স রাখতে পারি Appযাতে এটি বিশ্বব্যাপী উপলব্ধ হবে (একটি ভাল ধারণা নয়, তবে সরলকরণের জন্য প্রয়োজনীয়):

public class DependencyResolver
{
    static IContainer container;

    public DependencyResolver(params Module[] modules)
    {
        var builder = new ContainerBuilder();

        if (modules != null)
            foreach (var module in modules)
                builder.RegisterModule(module);

        container = builder.Build();
    }

    public T Resolve<T>() => container.Resolve<T>();
    public object Resolve(Type type) => container.Resolve(type);
}

public partial class App : Application
{
    public DependencyResolver DependencyResolver { get; }

    // Pass here platform specific dependencies
    public App(Module platformIocModule)
    {
        InitializeComponent();
        DependencyResolver = new DependencyResolver(platformIocModule, new IocModule());
        MainPage = new WelcomeView();
    }

    /* The rest of the code ... */
}

২. আমাদের Pageনির্দিষ্ট ViewModelএবং তদ্বিপরীত জন্য একটি (দেখুন) পুনরুদ্ধার করার জন্য আমাদের দায়ী কোনও জিনিসের প্রয়োজন হবে । অ্যাপ্লিকেশনটির মূল / প্রধান পৃষ্ঠা সেট করার ক্ষেত্রে দ্বিতীয় কেসটি কার্যকর হতে পারে। তার জন্য আমাদের একটি সাধারণ সম্মেলনে একমত হওয়া উচিত যে সমস্ত ডিরেক্টরিতে ViewModelsথাকতে হবে ViewModelsএবং Pages(ভিউ) Viewsডিরেক্টরিতে থাকা উচিত । অন্য কথায় নাম স্পেসে এবং নেমস্পেসে (ভিউ) ViewModelsথাকা উচিত । এটি ছাড়াও আমাদের একমত হওয়া উচিত যে (পৃষ্ঠা) এর একটি এবং ইত্যাদি হওয়া উচিত এখানে ম্যাপারের কোড উদাহরণ রয়েছে:[MyApp].ViewModelsPages[MyApp].ViewsWelcomeViewWelcomeViewModel

public class TypeMapperService
{
    public Type MapViewModelToView(Type viewModelType)
    {
        var viewName = viewModelType.FullName.Replace("Model", string.Empty);
        var viewAssemblyName = GetTypeAssemblyName(viewModelType);
        var viewTypeName = GenerateTypeName("{0}, {1}", viewName, viewAssemblyName);
        return Type.GetType(viewTypeName);
    }

    public Type MapViewToViewModel(Type viewType)
    {
        var viewModelName = viewType.FullName.Replace(".Views.", ".ViewModels.");
        var viewModelAssemblyName = GetTypeAssemblyName(viewType);
        var viewTypeModelName = GenerateTypeName("{0}Model, {1}", viewModelName, viewModelAssemblyName);
        return Type.GetType(viewTypeModelName);
    }

    string GetTypeAssemblyName(Type type) => type.GetTypeInfo().Assembly.FullName;
    string GenerateTypeName(string format, string typeName, string assemblyName) =>
        string.Format(CultureInfo.InvariantCulture, format, typeName, assemblyName);
}

৩. মূল পৃষ্ঠা নির্ধারণের ক্ষেত্রে আমাদের এর প্রয়োজন হবে যা স্বয়ংক্রিয়ভাবে ViewModelLocatorসেট হয়ে BindingContextযাবে:

public static class ViewModelLocator
{
    public static readonly BindableProperty AutoWireViewModelProperty =
        BindableProperty.CreateAttached("AutoWireViewModel", typeof(bool), typeof(ViewModelLocator), default(bool), propertyChanged: OnAutoWireViewModelChanged);

    public static bool GetAutoWireViewModel(BindableObject bindable) =>
        (bool)bindable.GetValue(AutoWireViewModelProperty);

    public static void SetAutoWireViewModel(BindableObject bindable, bool value) =>
        bindable.SetValue(AutoWireViewModelProperty, value);

    static ITypeMapperService mapper = (Application.Current as App).DependencyResolver.Resolve<ITypeMapperService>();

    static void OnAutoWireViewModelChanged(BindableObject bindable, object oldValue, object newValue)
    {
        var view = bindable as Element;
        var viewType = view.GetType();
        var viewModelType = mapper.MapViewToViewModel(viewType);
        var viewModel =  (Application.Current as App).DependencyResolver.Resolve(viewModelType);
        view.BindingContext = viewModel;
    }
}

// Usage example
<?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:viewmodels="clr-namespace:MyApp.ViewModel"
    viewmodels:ViewModelLocator.AutoWireViewModel="true"
    x:Class="MyApp.Views.MyPage">
</ContentPage>

4. শেষ পর্যন্ত আমাদের এমন একটি প্রয়োজন হবে যা পদ্ধতির NavigationServiceসমর্থন করবে ViewModel First Navigation:

public class NavigationService
{
    TypeMapperService mapperService { get; }

    public NavigationService(TypeMapperService mapperService)
    {
        this.mapperService = mapperService;
    }

    protected Page CreatePage(Type viewModelType)
    {
        Type pageType = mapperService.MapViewModelToView(viewModelType);
        if (pageType == null)
        {
            throw new Exception($"Cannot locate page type for {viewModelType}");
        }

        return Activator.CreateInstance(pageType) as Page;
    }

    protected Page GetCurrentPage()
    {
        var mainPage = Application.Current.MainPage;

        if (mainPage is MasterDetailPage)
        {
            return ((MasterDetailPage)mainPage).Detail;
        }

        // TabbedPage : MultiPage<Page>
        // CarouselPage : MultiPage<ContentPage>
        if (mainPage is TabbedPage || mainPage is CarouselPage)
        {
            return ((MultiPage<Page>)mainPage).CurrentPage;
        }

        return mainPage;
    }

    public Task PushAsync(Page page, bool animated = true)
    {
        var navigationPage = Application.Current.MainPage as NavigationPage;
        return navigationPage.PushAsync(page, animated);
    }

    public Task PopAsync(bool animated = true)
    {
        var mainPage = Application.Current.MainPage as NavigationPage;
        return mainPage.Navigation.PopAsync(animated);
    }

    public Task PushModalAsync<TViewModel>(object parameter = null, bool animated = true) where TViewModel : BaseViewModel =>
        InternalPushModalAsync(typeof(TViewModel), animated, parameter);

    public Task PopModalAsync(bool animated = true)
    {
        var mainPage = GetCurrentPage();
        if (mainPage != null)
            return mainPage.Navigation.PopModalAsync(animated);

        throw new Exception("Current page is null.");
    }

    async Task InternalPushModalAsync(Type viewModelType, bool animated, object parameter)
    {
        var page = CreatePage(viewModelType);
        var currentNavigationPage = GetCurrentPage();

        if (currentNavigationPage != null)
        {
            await currentNavigationPage.Navigation.PushModalAsync(page, animated);
        }
        else
        {
            throw new Exception("Current page is null.");
        }

        await (page.BindingContext as BaseViewModel).InitializeAsync(parameter);
    }
}

আপনি দেখতে পাচ্ছেন যে সমস্ত BaseViewModel- ViewModelsসেখানে আপনি যেমন পদ্ধতি নির্ধারণ করতে পারেন তার জন্য অ্যাবস্ট্রাক্ট বেস ক্লাসটি InitializeAsyncনেভিগেশনের ঠিক পরে কার্যকর হবে। এবং এখানে নেভিগেশন উদাহরণ:

public class WelcomeViewModel : BaseViewModel
{
    public ICommand NewGameCmd { get; }
    public ICommand TopScoreCmd { get; }
    public ICommand AboutCmd { get; }

    public WelcomeViewModel(INavigationService navigation) : base(navigation)
    {
        NewGameCmd = new Command(async () => await Navigation.PushModalAsync<GameViewModel>());
        TopScoreCmd = new Command(async () => await navigation.PushModalAsync<TopScoreViewModel>());
        AboutCmd = new Command(async () => await navigation.PushModalAsync<AboutViewModel>());
    }
}

আপনি যেমন বুঝতে পেরেছেন এই পদ্ধতিটি আরও জটিল, ততই ডিবাগ করা শক্ত এবং বিভ্রান্তিকর হতে পারে। তবে অনেকগুলি সুবিধাসমূহ রয়েছে প্লাস আপনাকে নিজেরাই এটি বাস্তবায়ন করতে হবে না কারণ বেশিরভাগ এমভিভিএম ফ্রেমওয়ার্কগুলি বক্সের বাইরে এটি সমর্থন করে। এখানে প্রদর্শিত কোড উদাহরণটি গিথুবে উপলভ্য । অ্যাপ্রোচ

সম্পর্কে প্রচুর ভাল নিবন্ধ ViewModel First Navigationরয়েছে এবং এখানে একটি বিনামূল্যে এন্টারপ্রাইজ অ্যাপ্লিকেশন প্যাটার্ন রয়েছে যা জামারিন.ফর্মস ইবুক ব্যবহার করে যা এই এবং আরও অনেক আকর্ষণীয় বিষয় বিস্তারিতভাবে ব্যাখ্যা করছে।


2

নমুনা কোডের নীচে নেভিগেশন সম্পত্তি ব্যবহার করে জ্যামারিন.ফোর্মে অন্য পৃষ্ঠায় নেভিগেশনের এক পৃষ্ঠা

void addClicked(object sender, EventArgs e)
        {
            //var createEmp = (Employee)BindingContext;
            Employee emp = new Employee();
            emp.Address = AddressEntry.Text;   
            App.Database.SaveItem(emp);
            this.Navigation.PushAsync(new EmployeeDetails());
  this.Navigation.PushModalAsync(new EmployeeDetails());
        }

কোড জ্যাম্রিয়ান.ফর্মের নীচে দেখুন ঘরে একটি পৃষ্ঠাতে অন্য পৃষ্ঠায় নেভিগেট করতে

 private async void BtnEdit_Clicked1(object sender, EventArgs e)
        {
            App.Database.GetItem(empid);
            await App.Current.MainPage.Navigation.PushModalAsync(new EmployeeRegistration(empid));
        }

নীচের মত উদাহরণ

public class OptionsViewCell : ViewCell
    {
        int empid;
        Button btnEdit;
        public OptionsViewCell()
        {
        }
        protected override void OnBindingContextChanged()
        {
            base.OnBindingContextChanged();

            if (this.BindingContext == null)
                return;

            dynamic obj = BindingContext;
            empid = Convert.ToInt32(obj.Eid);
            var lblname = new Label
            {
                BackgroundColor = Color.Lime,
                Text = obj.Ename,
            };

            var lblAddress = new Label
            {
                BackgroundColor = Color.Yellow,
                Text = obj.Address,
            };

            var lblphonenumber = new Label
            {
                BackgroundColor = Color.Pink,
                Text = obj.phonenumber,
            };

            var lblemail = new Label
            {
                BackgroundColor = Color.Purple,
                Text = obj.email,
            };

            var lbleid = new Label
            {
                BackgroundColor = Color.Silver,
                Text = (empid).ToString(),
            };

             //var lbleid = new Label
            //{
            //    BackgroundColor = Color.Silver,
            //    // HorizontalOptions = LayoutOptions.CenterAndExpand
            //};
            //lbleid.SetBinding(Label.TextProperty, "Eid");
            Button btnDelete = new Button
            {
                BackgroundColor = Color.Gray,

                Text = "Delete",
                //WidthRequest = 15,
                //HeightRequest = 20,
                TextColor = Color.Red,
                HorizontalOptions = LayoutOptions.EndAndExpand,
            };
            btnDelete.Clicked += BtnDelete_Clicked;
            //btnDelete.PropertyChanged += BtnDelete_PropertyChanged;  

            btnEdit = new Button
            {
                BackgroundColor = Color.Gray,
                Text = "Edit",
                TextColor = Color.Green,
            };
            // lbleid.SetBinding(Label.TextProperty, "Eid");
            btnEdit.Clicked += BtnEdit_Clicked1; ;
            //btnEdit.Clicked += async (s, e) =>{
            //    await App.Current.MainPage.Navigation.PushModalAsync(new EmployeeRegistration());
            //};

            View = new StackLayout()
            {
                Orientation = StackOrientation.Horizontal,
                BackgroundColor = Color.White,
                Children = { lbleid, lblname, lblAddress, lblemail, lblphonenumber, btnDelete, btnEdit },
            };

        }

        private async void BtnEdit_Clicked1(object sender, EventArgs e)
        {
            App.Database.GetItem(empid);
            await App.Current.MainPage.Navigation.PushModalAsync(new EmployeeRegistration(empid));
        }



        private void BtnDelete_Clicked(object sender, EventArgs e)
        {
            // var eid = Convert.ToInt32(empid);
            // var item = (Xamarin.Forms.Button)sender;
            int eid = empid;
            App.Database.DeleteItem(empid);
        }

    }

2

কল করুন:

((App)App.Current).ChangeScreen(new Map());

App.xaml.cs এর মধ্যে এই পদ্ধতিটি তৈরি করুন:

public void ChangeScreen(Page page)
{
     MainPage = page;
}

2
In App.Xaml.Cs:

MainPage = new NavigationPage( new YourPage());

আপনি যখন আপনার পেজ থেকে পরবর্তী পৃষ্ঠায় নেভিগেট করতে চান:

await Navigation.PushAsync(new YourSecondPage());

আপনি এখানে জামারিন ফর্ম নেভিগেশন সম্পর্কে আরও পড়তে পারেন: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/navication/hierarchical

মাইক্রোসফ্ট এ সম্পর্কে বেশ ভাল ডক্স আছে।

এছাড়াও এর নতুন ধারণা আছে Shell। এটি আপনার অ্যাপ্লিকেশনটিকে কাঠামোগত করার জন্য একটি নতুন উপায়ে অনুমতি দেয় এবং কিছু ক্ষেত্রে নেভিগেশনকে সহজতর করে।

পরিচয়: https://devblogs.microsoft.com/xamarin/shell-xamarin-forms-4-0-getting-st সূত্র /

শেলের মূল বিষয়ে ভিডিও: https://www.youtube.com/watch?v=0y1bUAcOjZY&t=3112s

দস্তাবেজ: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/shell/


0

এক্সএএমএল পৃষ্ঠা এটি যুক্ত করুন

<ContentPage.ToolbarItems>
            <ToolbarItem Text="Next" Order="Primary"
            Activated="Handle_Activated"/>

</ContentPage.ToolbarItems>   

সিএস পৃষ্ঠায়

 async void Handle_Activated(object sender, System.EventArgs e)
        {
            await App.Navigator.PushAsync(new PAGE());
        }

0

PushAsyncব্যবহারের পরে PopAsync(সহ this) বর্তমান পৃষ্ঠাটি সরাতে।

await Navigation.PushAsync(new YourSecondPage());
this.Navigation.PopAsync(this);

0

জামারিনে আমাদের পেইজ নামে ন্যাভিগেশনপেজ রয়েছে। এটিতে কন্টেন্টপেজের স্ট্যাক রয়েছে। নেভিগেশনপেজের মধ্যে পুশএন্সিঙ্ক () এবং পপঅ্যাসেন্স () এর মতো পদ্ধতি রয়েছে। পুশসায়েন্স স্ট্যাকের শীর্ষে একটি পৃষ্ঠা যুক্ত করুন, সেই পৃষ্ঠা পৃষ্ঠাটি বর্তমানে সক্রিয় পৃষ্ঠাতে পরিণত হবে। পপএন্সিঙ্ক () পদ্ধতিটি স্ট্যাকের শীর্ষ থেকে পৃষ্ঠাটি সরিয়ে দেয়।

App.Xaml.Cs এ আমরা পছন্দ করতে পারি।

মেইনপেজ = নতুন নেভিগেশনপেজ (নতুন আপনার পেজ ());

নেভিগেশনটির জন্য অপেক্ষা করুন ush এই পদ্ধতিটি স্ট্যাকের শীর্ষে নতুন পৃষ্ঠা যুক্ত করবে । এই সময়ে নেপেজ বর্তমানে সক্রিয় পৃষ্ঠাতে থাকবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.