navigation यूडब्ल्यूपी में नेविगेशन अंक




uwp windows-10 (2)

tl; डॉ

मेरे पास 3 पेज BlankPage1.xaml , BlankPage2.xaml BlankPage1.xaml , BlankPage2.xaml और BlankPage1 पर Button साथ BlankPage1 जो कि BlankPage1 पृष्ठ 1 और BlankPage1 पृष्ठ 2 पर नेविगेट करता है। मैंने सिस्टम बैक बटन को सक्षम किया है ताकि मैं पिछले पृष्ठ पर वापस जा सकूँ।

BlankPage1 पर Button टैप BlankPage1 पर नेविगेट करता है और BlankPage2 पर Button टैप करें BlankPage1 पर नेविगेट BlankPage2 । यह ठीक काम करता है

समस्या: जब मैं BlankPage2 पर Back Button को टैप करता BlankPage2 यह BlankPage2 पर वापस जाता है। अब जब मैं BlankPage1 पर Button को टैप करता BlankPage1 यह BlankPage1 पर जाता है, लेकिन जब मैं Back Button टैप करता हूं, BlankPage1 पर जाने के बजाय सीधे BlankPage1 नेविगेट करता है।

नीचे मेरा कोड है

MainPage.xaml

<Page
    x:Class="App2.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App2"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Button Content="GoTo Page 1" HorizontalAlignment="Center" VerticalAlignment="Center" Tapped="Button_Tapped"/>
    </Grid>
</Page>

MainPage.xaml.cs

using Windows.UI.Xaml.Controls;

namespace App2
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        private void Button_Tapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e)
        {
            Frame.Navigate(typeof(BlankPage1));
        }
    }
}

BlankPage1.xaml

<Page
    x:Class="App2.BlankPage1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App2"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Button Content="GoTo Page 2" HorizontalAlignment="Center" VerticalAlignment="Center" Tapped="Button_Tapped"/>
    </Grid>
</Page>

BlankPage1.xaml.cs

using Windows.UI.Core;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

namespace App2
{
    public sealed partial class BlankPage1 : Page
    {
        public BlankPage1()
        {
            this.InitializeComponent();
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            if (Frame.CanGoBack)
            {
                SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = AppViewBackButtonVisibility.Visible;
                SystemNavigationManager.GetForCurrentView().BackRequested += (s, a) =>
                {
                    if (Frame.Content.GetType() == typeof(BlankPage1))
                    {
                        if (Frame.CanGoBack)
                        {
                            Frame.GoBack();
                            a.Handled = true;
                        }
                    }
                };
            }
            else
            {
                SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = AppViewBackButtonVisibility.Collapsed;
            }
        }

        private void Button_Tapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e)
        {
            Frame.Navigate(typeof(BlankPage2));
        }
    }
}

BlankPage2.xaml

<Page
    x:Class="App2.BlankPage2"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App2"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <TextBlock Text="Final Page" HorizontalAlignment="Center" VerticalAlignment="Center" />
    </Grid>
</Page>

BlankPage2.xaml.cs

using Windows.UI.Core;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

namespace App2
{
    public sealed partial class BlankPage2 : Page
    {
        public BlankPage2()
        {
            this.InitializeComponent();
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            if (Frame.CanGoBack)
            {
                SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = AppViewBackButtonVisibility.Visible;
                SystemNavigationManager.GetForCurrentView().BackRequested += (s, a) =>
                {
                    if (Frame.Content.GetType() == typeof(BlankPage2))
                    {
                        if (Frame.CanGoBack)
                        {
                            Frame.GoBack();
                            a.Handled = true;
                        }
                    }
                };
            }
            else
            {
                SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = AppViewBackButtonVisibility.Collapsed;
            }
        }
    }
}

हर बार जब आप किसी पृष्ठ पर नेविगेट करते हैं, तो OnNavigatedTo विधि को बुलाया जा रहा है और आप BackRequested ईवेंट के लिए एक नया हेन्डलर पंजीकृत कर रहे हैं, जिसका अर्थ है कि जब आप बैक बटन दबाते हैं तो यह कई बार निष्पादित करेगा। आपको अपने OnNavigatedFrom में उस ईवेंट की सदस्यता समाप्त करना चाहिए प्रत्येक पृष्ठ की विधि से

Handled = true सेट करना इसका अर्थ यह नहीं है कि उस घटना के लिए अन्य सदस्यता निष्पादित नहीं की जाएंगी, इसका मतलब है:

यदि आप इस ईवेंट को संभाला नहीं रखते हैं, तो सिस्टम यह निर्णय लेता है कि ऐप (मोबाइल डिवाइस परिवार पर) से दूर नेविगेट करें या ईवेंट को अनदेखा करें (डेस्कटॉप डिवाइस परिवार पर)।


@ डेकडा मून से जवाब पर बिल्डिंग, मैं सुझाव देता हूं कि आप आसानी से प्रबंधन योग्यता और क्लीनर Page कोड-पीछे के लिए App कक्षा में तर्क को केंद्रीकृत कर सकते हैं।

App.OnLaunched विधि में निम्न पंक्ति जोड़ें:

SystemNavigationManager.GetForCurrentView().BackRequested += App_BackRequested;

और हेन्डलर को इस तरह लागू करें:

private void App_BackRequested(object sender, BackRequestedEventArgs e)
{
    var frame = ( Frame )Window.Current.Content;
    if ( frame.CanGoBack )
    {
        frame.GoBack();
        e.Handled = true;
    }
}

हम वर्तमान विंडो के फ्रेम को पकड़ लेते हैं और जांचते हैं कि हम वापस नेविगेट कर सकते हैं। यदि यह संभव है, तो हम घटना को संभालते हैं और नेविगेट करते हैं। इसका लाभ यह है कि अब आप सभी पृष्ठों पर सभी BackRequested संबंधित कार्रवाइयां निकाल सकते हैं।

आप AppViewBackButtonVisibility लिए भी ऐसा ही कर सकते हैं: AppViewBackButtonVisibility के अंत में निम्न जोड़ें:

rootFrame.Navigated += RootFrame_Navigated;

और अब हेन्डलर को इस प्रकार लागू करें:

private void RootFrame_Navigated(object sender, NavigationEventArgs e)
{
    var frame = (Frame)Window.Current.Content;
    SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility =
        frame.CanGoBack ? AppViewBackButtonVisibility.Visible :
                          AppViewBackButtonVisibility.Collapsed;            
}

जब भी फ्रेम नेविगेट किया जाता है, बैक बटन की दृश्यता स्वचालित रूप से अपडेट हो जाएगी।