Как использовать функцию возврата в приложениях UWP, чтобы изменить видимость сетки?

Я хотел бы использовать функцию возврата в UWP в файле App.xaml.cs, чтобы изменить свойство видимости сетки (grid1) в файле MainPage.xaml.

//Go Back
        public void App_BackRequested(object sender, Windows.UI.Core.BackRequestedEventArgs e)
        {
            if(MainPage.MyGlobals.pageLocation == 0)
            {
                //Do Nothing
            }

            else if(MainPage.MyGlobals.pageLocation == 1)
            {
                MainPage.grid1.Visibility = Visibility.Collapsed;

                MainPage.MyGlobals.pageLocation = 0;
            }
        }

Я знаю, что изменение свойств элементов xaml с другой страницы не является типичной практикой, но мне бы очень хотелось изменить принцип работы обратной функции в этом приложении. Я считаю, что мне нужно сделать сетку общедоступной, но даже когда я (думал, что я) нашел способ сделать это, я все еще не мог изменить свойства сетки так, как я написал это в моем коде.


person scoots    schedule 15.05.2016    source источник


Ответы (2)


Как вы упомянули, изменение свойств элементов XAML с другой страницы не является хорошей практикой. Мы можем просто использовать событие SystemNavigationManager.BackRequested в MainPage, как показано ниже, чтобы изменить видимость сетки.

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    SystemNavigationManager.GetForCurrentView().BackRequested += Page_BackRequested;
}

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
    SystemNavigationManager.GetForCurrentView().BackRequested -= Page_BackRequested;
}

private void Page_BackRequested(object sender, BackRequestedEventArgs e)
{
    if (MyGrid.Visibility == Visibility.Visible)
    {
        MyGrid.Visibility = Visibility.Collapsed;
        e.Handled = true;
    }
    else
    {
        if (this.Frame.CanGoBack)
        {
            this.Frame.GoBack();
            e.Handled = true;
        }
    }
}

И если вы хотите воспользоваться функцией возврата в App.xaml.cs и использовать другую функцию в MainPage, вы можете добавить событие в App, которое обертывает SystemNavigationManager.BackRequested, чтобы другие страницы могли переопределить поведение по умолчанию, подписавшись на это событие, например следующий:

public event EventHandler<BackRequestedEventArgs> BackRequested;

private void App_BackRequested(object sender, BackRequestedEventArgs e)
{
    BackRequested?.Invoke(sender, e);

    Frame rootFrame = Window.Current.Content as Frame;

    if (!e.Handled && rootFrame != null && rootFrame.CanGoBack)
    {
        rootFrame.GoBack();
        e.Handled = true;
    }
}

Затем в MainPage подпишитесь и откажитесь от подписки на это событие, например:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    (Application.Current as App).BackRequested += Page_BackRequested;
}

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
    (Application.Current as App).BackRequested -= Page_BackRequested;
}
person Jay Zuo    schedule 17.05.2016

Это не работает, потому что вы пытаетесь получить доступ к Grid, как если бы это было статическим свойством MainPage. Вам нужна ссылка на экземпляр MainPage для управления сеткой, но в целом это действительно плохая практика. Вам следует взглянуть на события навигации UWP / WP 8.1.

person WPMed    schedule 15.05.2016