2015-08-05 2 views
13

На моей странице Xaml у меня есть кадр.Обращение с навигацией Windows 10 (UWP)

Я пытаюсь иметь событие backButton, чтобы просто перемещаться внутри рамки.

поэтому я попытался использовать этот кусок кода

public MainPage(){ 
    this.InitializeComponent(); 
    if(Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.Phone.UI.Input.HardwareButtons")) { 
     Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtons_BackPressed; 
    } 
} 
private void HardwareButtons_BackPressed(object sender,BackPressedEventArgs e) { 
    if(insideFrame.CanGoBack())insideFrame.GoBack(); 
    else Application.Current.Exit(); 
} 

, но в телефоне после выполнения HardwareButtons_BackPressed события это закрыть приложение.

кажется, работает немного по умолчанию обратно поведение кнопки на MainPage ...

Как я могу это исправить? И в Windows10 они добавляют новые события для обработки назад навигации?


[Update]

Теперь я узнал, что лучше использовать SystemNavigationManager в Windows 10 вместо Input.HardwareButtons.BackPressed.

SystemNavigationManager currentView = SystemNavigationManager.GetForCurrentView(); 
+0

Использование 'SystemNavigationManager' можно найти в следующем блоге: http://www.wintellect.com/devcenter/jprosise/handling-the-back-button-in-windows-10-uwp-apps – NP3

+0

@Shahriar Будет ли это работать и для Windows 10 Mobile. Поскольку я проверил, кнопка «Назад» не отображается в Windows Mobile. –

ответ

7

Вам необходимо сообщить системе, что вы обработали нажатие на нижнюю часть экрана, установив для свойства BackpedesEventArgs значение Handled значение true.

private void OnHardwareButtonsBackPressed(object sender, BackPressedEventArgs e) 
    { 
     // This is the missing line! 
     e.Handled = true; 

     // Close the App if you are on the startpage 
     if (mMainFrame.CurrentSourcePageType == typeof(Startpage)) 
      App.Current.Exit(); 

     // Navigate back 
     if (mMainFrame.CanGoBack) 
     { 
      mMainFrame.GoBack(); 
     } 
    } 
-1

Я думаю, это связано с тем, что вместо этого вы добавляете HardwareButtons_BackPressed на свою страницу, а не в app.xaml.cs.

В App.xaml.cs:

public App() 
{ 
    this.InitializeComponent(); 
    this.Suspending += this.OnSuspending; 

    HardwareButtons.BackPressed += HardwareButtons_BackPressed; 
} 

void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e) 
{ 
    Frame rootFrame = Window.Current.Content as Frame; 

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

Теперь, назад кнопка телефона будет работать на любых страницах.

И затем, если вы хотите добавить определенную кнопку, делая назад любую страница:

В конкретных страницах (или каждую страницу, если вы хотите):

public void btn_return_Tapped(object sender, TappedRoutedEventArgs e) 
     { 
      Frame rootFrame = Window.Current.Content as Frame; 

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

Источник: http://windowsapptutorials.com/tips/general-tips/handling-the-back-button-in-a-windows-phone-8-1-app/

+0

внутри Frame нет в App.xaml.cs scope – Shahriar

+0

Спасибо за советы cosmo0. Отредактировал свой ответ, чтобы исправить это. – Clad07

0

выполните следующие действия:

  • Добавьте две глобальные переменные на свою страницу, как показано ниже.

    private NavigationHelper navigationHelper; 
    private RelayCommand _GoBackCommand; 
    
  • Затем добавьте ниже код в конструктор конкретной страницы.

    // below code is to override the back navigation 
        // hardware back button press event from navigationHelper 
        _GoBackCommand = new RelayCommand 
         (
          () => this.CheckGoBack(), 
          () => this.CanCheckGoBack() 
         ); 
    
        navigationHelper.GoBackCommand = _GoBackCommand; 
        // --------- 
    
  • Затем добавьте оба метода, которые мы только что объявили в конструкторе.

    private bool CanCheckGoBack() 
    { 
        // this should be always true to make sure the app handles back buton manually. 
        return true; 
    } 
    
    private void CheckGoBack() 
    { 
        // this will be execute when back button will be pressed 
    } 
    

пс. - для этого вам может понадобиться использовать BasicPage вместо BlankPage при добавлении новой страницы.

надеюсь, что это поможет ..!

+0

Где находится 'NavigationHelper'? Как вы знаете, в Windows10 нет такого окна телефона с телефоном 8.1, чтобы иметь 'NavigationHelper' внутри него ... Если вы знаете ... где я могу получить' NavigationHelper'? – Shahriar

+0

В Windows 10 нет «BasicPage» ... это просто «BlackPage» – Shahriar

+0

, вы можете получить файл из любого существующего проекта wp8.1 или может быть из другого шаблона проекта. –

0

Попробуйте это. Он будет работать для обратной связи кадра.

protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 

     HardwareButtons.BackPressed += HardwareButtons_BackPressed; 

    } 


    void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e) 
    { 

    Frame rootFrame = Window.Current.Content as Frame; 

     if (Frame.CanGoBack) 
     { 
      e.Handled = true; 
      Frame.GoBack(); 
     } 
    } 

} 
18

для Windows 10 (UWP) включают в Windows.UI.Core имен для навигации только цели SystemNavigationManager.

Поскольку SystemNavigationManager является частью Windows Universal Platform, он поддерживается всеми семействами устройств, работающих под управлением Windows 10, включая мобильные и ПК.

Для одной страницы


Если вы просто хотите, чтобы справиться с навигацией для одной страницы. Выполните следующие шаги:

Шаг 1. Использование пространства имен Windows.UI.Core

using Windows.UI.Core; 

Шаг 2. Регистрация назад запрос событие для текущего вида. Лучшим местом для этого является главный конструктор класса после InitializeComponent().

public MainPage() 
{ 
    this.InitializeComponent(); 
    //register back request event for current view 
    SystemNavigationManager.GetForCurrentView().BackRequested += MainPage_BackRequested; 
} 

Шаг 3. Handle BackRequested событие

private void Food_BackRequested(object sender, BackRequestedEventArgs e) 
{ 
    if (Frame.CanGoBack) 
    { 
     Frame.GoBack(); 
     e.Handled = true; 
    } 
} 

Для получения полной заявки на одном месте для одного rootFrame


Лучшее место для обработки всех BackButton для всех взглядов App.xaml.cs

Шаг 1. Использование пространства имен Windows.UI.Core

using Windows.UI.Core; 

Шаг 2. Регистрация назад запрос событие для текущего вида. Лучшее место для этого OnLaunched непосредственно перед Window.Current.Activate

protected override void OnLaunched(LaunchActivatedEventArgs e) 
{ 
    ... 
    SystemNavigationManager.GetForCurrentView().BackRequested += OnBackRequested; 
    Window.Current.Activate(); 
} 

Шаг 3. Handle BackRequested события

private void OnBackRequested(object sender, BackRequestedEventArgs e) 
{ 
    Frame rootFrame = Window.Current.Content as Frame; 
    if (rootFrame.CanGoBack) 
    { 
     rootFrame.GoBack(); 
     e.Handled = true; 
    } 
} 

References- Handle back button pressed in UWP

Надеется, что это полезно для кого-то!

Смежные вопросы