आप Xamarin.Forms में पृष्ठ कैसे स्विच करते हैं?


99

आप ज़ामरीन फॉर्म में पृष्ठों के बीच कैसे स्विच करते हैं?

मेरा मुख्य पृष्ठ एक ContentPage है और मैं एक Tabbed पृष्ठ की तरह कुछ पर स्विच नहीं करना चाहता।

मैं छद्म करने में सक्षम हो गया हूं, नियंत्रण के माता-पिता को ढूंढने से जो कि नए पेज को तब तक ट्रिगर करना चाहिए जब तक मुझे ContentPage नहीं मिल जाता है और फिर सामग्री को एक नए पृष्ठ के लिए नियंत्रण के साथ स्वैप कर देता है। लेकिन यह वास्तव में मैला लगता है।


इस प्रश्न के पहले से ही बहुत सारे उत्तर हैं, यह देखने के लिए कि यह MVVM संरचनात्मक पैटर्न का उपयोग करके कैसे किया जा सकता है, इस stackoverflow.com/a/37142513/9403963 पर
Alireza Sattari

जवाबों:


67

Xamarin.Forms निर्मित कई नेविगेशन मेजबान का समर्थन करता है:

  • NavigationPage, जहां अगला पृष्ठ स्लाइड में है,
  • TabbedPage, जो आपको पसंद नहीं है
  • CarouselPage, जो अगले / प्रचलित पृष्ठों पर बाएँ और दाएँ स्विच करने की अनुमति देता है।

इसके शीर्ष पर, सभी पृष्ठ भी समर्थन करते हैं PushModalAsync()जो मौजूदा के शीर्ष पर एक नया पृष्ठ धक्का देते हैं।

बहुत अंत में, यदि आप यह सुनिश्चित करना चाहते हैं कि उपयोगकर्ता पिछले पृष्ठ पर वापस नहीं जा सकता है (इशारे या पीछे के हार्डवेयर बटन का उपयोग करके), आप उसी Pageडिस्प्ले को रख सकते हैं और उसकी जगह ले सकते हैं Content

रूट पेज को बदलने के सुझाए गए विकल्प भी काम करते हैं, लेकिन आपको प्रत्येक प्लेटफ़ॉर्म के लिए अलग तरीके से संभालना होगा।


PushModalAsync नेविगेशन का हिस्सा लगता है, है ना? मैं यह नहीं पता लगा सकता कि नेविगेशन ऑब्जेक्ट / क्लास में कैसे पहुंचा जाए। मुझे लगता है कि मुझे कुछ ऐसा करने की आवश्यकता है जो इनवॉइस लागू करता है, लेकिन क्या?
एरिक

यदि आपका पृष्ठ किसी नेविगेशनपेज के भीतर समाहित है, तो आपको अपने पृष्ठ के भीतर से नेविगेशन संपत्ति तक पहुंचने में सक्षम होना चाहिए
जेसन

1
एक बार जब मैंने नेवीगेशनपेज का उपयोग करना शुरू किया, तो सब कुछ ठीक हो गया। साभार
एरिक

1
@stephane कृपया बताएं कि क्या मेरा पहला पृष्ठ CarouselPage है और मेरा दूसरा पृष्ठ MasterDetailPage है तो मैं पृष्ठ stackoverflow.com/questions/31129845/ पर
अतुल धानुका

64

ऐप क्लास में आप मेनपेज को नेविगेशन पेज पर सेट कर सकते हैं और रूट पेज को अपने कंटेंटपेज पर सेट कर सकते हैं:

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

फिर अपने पहले ContentPage कॉल में:

Navigation.PushAsync (new SecondContentPage ());

मैंने ऐसा किया था लेकिन अभी भी मुख्य पृष्ठ डिफ़ॉल्ट पृष्ठ है जो खुलता है। मुख्य पृष्ठ पर मैंने जो भी पृष्ठ सेट किया है उसका कोई प्रभाव नहीं है। मैंने अभी पहला पेज ओपन किया है। समस्या क्या है?
बेहज़ाद

दृश्य स्टूडियो Android.Content.Resनेविगेशन के लिए आयात करने का सुझाव देता है । यह सही प्रतीत नहीं होता है, मुझे इसे कहाँ से आयात करना है?
क्रिश्चियन

41

यदि आपका प्रोजेक्ट PCL फॉर्म प्रोजेक्ट के रूप में स्थापित किया गया है (और साथ ही साथ साझा किए गए फ़ॉर्म के रूप में बहुत संभावना है, लेकिन मैंने कोशिश नहीं की है) एक वर्ग है App.cs जो इस तरह दिखता है:

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();

3
यह पृष्ठों के बीच स्विच नहीं करता है। यह केवल वही परिवर्तन करता है जो प्रारंभ में पेज लोड होता है।
डकामोजो

आपका प्रश्न एक मुख्य पृष्ठ के बारे में बात कर रहा था। नेविगेशन उदाहरणों के लिए अद्यतन उत्तर देखें
Sten Petrov

Navigationइस उदाहरण में बिल्ली क्या है ? - क्या वह वस्तु आपने कहीं बनाई है? - मैं इसे इस कोड नमूने में नहीं देख रहा हूं।
BrainSlugs83

नेविगेशन पृष्ठ पर संपत्ति है
स्टेन पेट्रोव

धन्यवाद; FTR PushAsync()ने मेरे लिए काम नहीं किया, जबकि PushModalAsync()किया
knocte

23

स्टैक पर एक नया पृष्ठ पुश करें, फिर वर्तमान पृष्ठ हटा दें। यह एक स्विच में परिणाम है।

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

आपको पहले एक नेविगेशन पृष्ठ में होना चाहिए:

MainPage = NavigationPage(new FirstPage());

सामग्री स्विच करना आदर्श नहीं है क्योंकि आपके पास सिर्फ एक बड़ा पृष्ठ है और पृष्ठ घटनाओं का एक सेट जैसे OnAppearing ect।


Navigation.RemovePage();Android पर समर्थित नहीं है।
रोहित विपिन मैथ्यूज

1
Navigation.RemovePage (पेज); एंड्रॉइड में काम करता है, पहले एक नेविगेशन पेज के अंदर होना चाहिए।
डैनियल रॉबर्ट्स

मैं अपनी परियोजना में बड़े पैमाने पर इसका उपयोग प्रपत्र 1.4.2 पर करता हूं। शायद उन्होंने बग को ठीक कर दिया है, या मैं अभी भाग्यशाली रहा हूं और अभी तक नहीं मारा।
डैनियल रॉबर्ट्स

मैं नवीनतम संस्करण पर हूं और इसे दोहराने में सक्षम हूं। इसलिए मेरा मानना ​​है कि आप बहुत भाग्यशाली हैं।
रोहित विपिन मैथ्यूज

2
काम संकेत - पृष्ठ को बदलने पर संक्रमण को हटाने के लिए, दूसरे पैरामीटर के रूप में गलत जोड़ें:await Navigation.PushAsync(new SecondPage(),false);
डेमियन ग्रीन

8

यदि आप पिछले पृष्ठ पर नहीं जाना चाहते हैं अर्थात प्राधिकरण के हो जाने के बाद उपयोगकर्ता को लॉगिन स्क्रीन पर वापस नहीं जाने देंगे, तो आप इसका उपयोग कर सकते हैं;

 App.Current.MainPage = new HomePage();

यदि आप वापस कार्यक्षमता सक्षम करना चाहते हैं, तो बस उपयोग करें

Navigation.PushModalAsync(new HomePage())

4

ऐसा लगता है कि यह धागा बहुत लोकप्रिय है और यहां यह उल्लेख नहीं करना दुखद होगा कि एक वैकल्पिक तरीका है - ViewModel First Navigation। एमवीवीएम ढांचे के अधिकांश लोग इसका उपयोग कर रहे हैं, हालांकि यदि आप यह समझना चाहते हैं कि इसके बारे में क्या है, तो पढ़ना जारी रखें।

सभी आधिकारिक Xamarin.Forms प्रलेखन एक सरल, अभी तक थोड़ा नहीं MVVM शुद्ध समाधान का प्रदर्शन कर रहा है। ऐसा इसलिए है क्योंकि 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या नेविगेशन के ठीक बाद एक async आरंभीकरण कोड निष्पादित कर सकते हैं । अब विवरण के लिए।

(मैं सभी कोड उदाहरणों को यथासंभव सरल बनाने की कोशिश करूंगा)।

1. सबसे पहले हमें एक ऐसी जगह की आवश्यकता है जहाँ हम अपनी सभी वस्तुओं को पंजीकृत कर सकें और वैकल्पिक रूप से अपने जीवनकाल को परिभाषित कर सकें। इस मामले के लिए हम एक IOC कंटेनर का उपयोग कर सकते हैं, आप स्वयं चुन सकते हैं। इस उदाहरण में मैं Autofac का उपयोग करूँगा (यह सबसे तेज़ उपलब्ध में से एक है)। हम इसका संदर्भ रख सकते हैं 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 ... */
}

2. हमें Pageएक विशिष्ट ViewModelऔर इसके विपरीत के लिए (देखें) प्राप्त करने के लिए जिम्मेदार एक वस्तु की आवश्यकता होगी । ऐप के रूट / मुख्य पृष्ठ को सेट करने के मामले में दूसरा मामला उपयोगी हो सकता है। उसके लिए हमें एक साधारण सम्मेलन पर सहमत होना चाहिए जो सभीViewModelsViewModels निर्देशिका में होना चाहिए और Pages(दृश्य) Viewsनिर्देशिका में होना चाहिए । दूसरे शब्दों ViewModelsमें [MyApp].ViewModelsनामस्थान में और Pages(दृश्य) नामस्थान में रहना चाहिए [MyApp].Views। इसके अलावा हमें इस बात से सहमत होना चाहिए कि WelcomeView(पेज) में एक होना चाहिए WelcomeViewModelऔर आदि यहाँ एक मैपर का एक कोड उदाहरण है:

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);
}

3. एक मूल पृष्ठ सेट करने के मामले में हमें 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>());
    }
}

जैसा कि आप समझते हैं कि यह दृष्टिकोण अधिक जटिल है, डीबग करना कठिन है और भ्रामक हो सकता है। हालाँकि, कई फायदे हैं और आपको वास्तव में इसे स्वयं लागू करने की आवश्यकता नहीं है क्योंकि अधिकांश MVVM फ्रेमवर्क इसे बॉक्स से बाहर का समर्थन करते हैं। यहाँ दिखाया गया कोड उदाहरण जीथब पर उपलब्ध है । दृष्टिकोण के

बारे में बहुत सारे अच्छे लेख हैं ViewModel First Navigationऔर एक स्वतंत्र है Xamarin.Forms eBook का उपयोग करते हुए एंटरप्राइज एप्लीकेशन पैटर्न है जो इसे और कई अन्य रोचक विषयों के बारे में विस्तार से बता रहा है।


3

PushAsync () विधि का उपयोग करके आप पुश कर सकते हैं और PopModalAsync () आप नेविगेशन स्टैक से और उसके लिए पृष्ठों को पॉप कर सकते हैं। नीचे मेरे कोड उदाहरण में मेरे पास एक नेविगेशन पृष्ठ (रूट पेज) है और इस पृष्ठ से मैं एक सामग्री पृष्ठ को धक्का देता हूं जो एक लॉगिन पृष्ठ है जब मैं अपने लॉगिन पृष्ठ के साथ पूरा हो जाता हूं तो मैं मूल पृष्ठ पर वापस आ जाता हूं

~~~ नेविगेशन को पेज ऑब्जेक्ट्स के अंतिम-इन, पहले-आउट स्टैक के रूप में माना जा सकता है। एक पेज से दूसरे पेज पर जाने से एक एप्लिकेशन इस स्टैक पर एक नया पेज पुश करेगा। पिछले पृष्ठ पर वापस लौटने के लिए एप्लिकेशन वर्तमान पृष्ठ को स्टैक से पॉप करेगा। Xamarin.Forms में इस नेविगेशन को इंविगेशन इंटरफ़ेस द्वारा नियंत्रित किया जाता है

Xamarin.Forms में एक नेविगेशनपेज क्लास है जो इस इंटरफ़ेस को लागू करता है और पेजों के स्टैक का प्रबंधन करेगा। नेविगेशनपेज क्लास स्क्रीन के शीर्ष पर एक नेविगेशन बार भी जोड़ेगी जो एक शीर्षक प्रदर्शित करता है और इसमें एक मंच उपयुक्त बैक बटन भी होगा जो पिछले पृष्ठ पर वापस आ जाएगा। निम्न कोड दिखाता है कि किसी अनुप्रयोग में पहले पृष्ठ के चारों ओर एक नेविगेशनपेज कैसे लपेटें:

ऊपर सूचीबद्ध सामग्री का संदर्भ और एक लिंक जिसे आपको ज़ामरीन फॉर्म के बारे में अधिक जानकारी के लिए समीक्षा करनी चाहिए, नेविगेशन अनुभाग देखें:

http://developer.xamarin.com/guides/cross-platform/xamarin-forms/introduction-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();
}

2

नमूना कोड के नीचे नेविगेशन संपत्ति का उपयोग करके Xamarin.forms में एक और पेज नेविगेशन के लिए एक पृष्ठ

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());
        }

कोड Xamrian.forms के नीचे सेल में एक पृष्ठ को दूसरे पृष्ठ पर नेविगेट करने के लिए

 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());

जब आप अपने अगले पेज पर YourPage से नेविगेट करना चाहते हैं:

await Navigation.PushAsync(new YourSecondPage());

आप यहाँ Xamarin Forms नेविगेशन के बारे में अधिक पढ़ सकते हैं: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/navigation/hierarchical

Microsoft के पास इस पर काफी अच्छे डॉक्स हैं।

की नई अवधारणा भी है Shell । यह आपके एप्लिकेशन को संरचित करने के एक नए तरीके की अनुमति देता है और कुछ मामलों में नेविगेशन को सरल करता है।

इंट्रो: https://devblogs.microsoft.com/xamarin/shell-xamarin-forms-4-0-getting-tarted/

शैल की मूल बातें पर वीडियो: https://www.youtube.com/watch?v=0y1bUAcOjZY&t=3112s

डॉक्स: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/shell/


0

XAML पेज इसे जोड़ें

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

</ContentPage.ToolbarItems>   

CS पृष्ठ पर

 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

Xamarin में हमारे पास नेवीगेशन पेज नाम का पेज है। यह ContentPages का ढेर रखता है। नैविगेशनपेज में पुशएस्क्यू () और पोपसिक्सस () जैसी विधि है। स्टैक के शीर्ष पर एक पृष्ठ जोड़ते हैं, उस समय वह पृष्ठ पृष्ठ वर्तमान में सक्रिय पृष्ठ बन जाएगा। PopAsync () विधि स्टैक के शीर्ष से पृष्ठ को हटा दें।

App.Xaml.Cs में हम पसंद कर सकते हैं।

मेनपेज = नया नेविगेशनपेज (नया आपका पेजेज ());

नेविगेशन का इंतजार करें। PushAsync (नया newPage ()); यह विधि स्टैक के शीर्ष पर newPage जोड़ेगी । इस समय nePage वर्तमान में सक्रिय पृष्ठ होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.