I am developing a windows phone 8 app. I want to control the back button of the phone for doing specific task. I want that when user press the back button in specific page it will not navigate to the previous page but to the page which I want. Is their any way to control the hardware back button present in phone?
In Silverlight apps (WP7, WP8, WP8.1) you do this:
protected override void OnBackKeyPress(CancelEventArgs e)
{
// put any code you like here
MessageBox.Show("You pressed the Back button");
e.Cancel = true;
}
That will work in all Windows Phone versions if you're using Silverlight.
If you're using WinRT for Windows Phone 8.1, it is a bit different:
Open NavigationHelper.cs and make this modification:
private void HardwareButtons_BackPressed(object sender, Windows.Phone.UI.Input.BackPressedEventArgs e)
{
if (this.GoBackCommand.CanExecute(null) && !e.Handled)
{
e.Handled = true;
this.GoBackCommand.Execute(null);
}
}
Now in your app page (the page that will be open when the back button is pressed), add the following namespace:
using Windows.Phone.UI.Input;
Add this handler to the constructor method of your page:
HardwareButtons.BackPressed += OnBackPressed;
Then add this method:
private async void OnBackPressed(object sender, Windows.Phone.UI.Input.BackPressedEventArgs e)
{
e.Handled = true;
// add your own code here to run when Back is pressed
}
Note: in both cases, the 'e.Handled = true' line tells the OS that the back button press has been handled, and therefore the OS will not action the default behaviour. If you remove that line your own code will run, and the OS will also do its own backwards navigation.
Be mindful of Rowland's comment about overriding the Back button - if you're not navigating intuitively you will confuse the user and risk your game being rejected (if you just need to control a pause screen or menu it will be fine, but if you implement something gimmicky like using the Back button as a game control you'll be in trouble).
My blog has the same answer with a bit more detail if you need it:
http://grogansoft.com/blog/?p=572
Whilst it possible to cancel the navigation event, and permissable in a game to present a pause screen or similar, generally it is not allowed to use the back button for anything other than backward navigation in an app; Per requirement 5.2.4 of the Technical certification requirements for Windows Phone
To maintain a consistent user experience, the Back button must only be used for backwards navigation in the app.
If you are creating a XAML app where it is permissible to cancel a "back" operation, such as per 5.2.4.4 of the Technical certification requirements for Windows Phone
:
For games, when the Back button is pressed during gameplay, the game can choose to present a pause context menu or dialog, or it can navigate the user to the prior menu screen.
Then you can implement this by overriding the OnNavigatingFrom method on your page, and set the Cancel property of the NavigatingCancelEventArgs, so something like this example from Frame, page, and navigation features for Windows Phone 8:
protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
base.OnNavigatingFrom(e);
// If the navigation can be cancelled, ask the user if they want to cancel
if (e.IsCancelable)
{
MessageBoxResult result = MessageBox.Show("Do you want to stay here?", "Confirm Navigation from Page", MessageBoxButton.OKCancel);
if (result == MessageBoxResult.OK)
{
// User wants to stay here
e.Cancel = true;
return;
}
}
}
Of course, you may choose to implement the prompt differently, but that should illustrate how it is possible.
Related
I have UWP app that implements the below code to wire up the system back button. My understanding is that this event is provided to capture hardware back buttons on Windows Phones, the back button in the title bar on Windows 10 and the back button on the task bar in Windows 10 tablet mode.
The hardware and title bar back buttons are working in my app, but when in tablet mode, pressing the back button on the task bar moves my app to the background and navigates to the Start Menu regardless of where I am in the app backstack. The BackRequested event IS firing in this case and my app is navigating back one page.
protected override async void OnLaunched(LaunchActivatedEventArgs args)
{
Windows.UI.Core.SystemNavigationManager.GetForCurrentView().BackRequested +=
App_BackRequested;
}
private void App_BackRequested(object sender, BackRequestedEventArgs e)
{
NavService.GoBack();
}
Any thoughts on why the tablet mode back button would behave this way? I'm seeing this behavior across many Windows 10 PCs, Surfaces, etc.
The default behavior of the Tablet mode back button is indeed to navigate out of the app. To prevent this you have to make sure that when you can navigate back in the app, you also mark the back navigation as handled.
private void App_BackRequested(object sender, BackRequestedEventArgs e)
{
if ( NavService.CanGoBack() )
{
NavService.GoBack();
e.Handled = true;
}
}
You will have to add a CanGoBack() method that will check the app Frame's CanGoBack property.
I have simply application written in c#, with sqlite database. I realized that it's not working fast on my phone. I'm pretty sure that problem is linked with functionality of pressed bulit-in back button. When I repeat several time this process:
Open new page -> return to previous page by back button, the application starting slows down.
When I added my own back button only to test, everything works fine.
I base mostly on this article:
http://www.wintellect.com/devcenter/jprosise/handling-the-back-button-in-windows-10-uwp-apps
Open new page -> return to previous page by back button, the application starting slows down.
After looking into your project, I found out the problem: You are registering SystemNavigationManager.GetForCurrentView().BackRequested +=OnBackRequested on every page. SystemNavigationManager.GetForCurrentView().BackRequested is an application scope event. It won't dispose the eventhandler when you are navigating between pages. You only need to register it once in your whole application.
So, to fix the problem, you can comment out all the BackRequested event registration of your pages's code-behind and keep only the one in your App.xaml.cs.
For example: in ProductsPage.xaml.cs comment out or delete following lines:
//SystemNavigationManager.GetForCurrentView().BackRequested += (s, e) =>
//{
// // TODO: Go back to the previous page
// Frame.Navigate(typeof(main1));
//};
If your back is Phone hard key you may handle the event.
The link is say the pc and add the back button and you should
SystemNavigationManager.GetForCurrentView().BackRequested +=OnBackRequested;
private void OnBackRequested(object sender, BackRequestedEventArgs e)
{
Frame rootFrame = Window.Current.Content as Frame;
if (rootFrame?.CanGoBack==true)
{
e.Handled = true;
rootFrame.GoBack();
}
else
{
Application.Current.Exit();
}
}
}
http://edi.wang/post/2016/2/1/windows-10-uwp-back-button-tricks
http://blog.csdn.net/lindexi_gd/article/details/50618029
I've just installed Windows Phone 8.1 SDK, and had an application in mind. But I cant even navigate back and forth! Back button the phone exit the application by default, and since all the pages now inherits "Page" the override for the back button isnt exposed.
Read http://msdn.microsoft.com/en-us/library/windows/apps/xaml/dn639128.aspx but I don't understand it, how can I implement it?
Take a look at any of the WP Projects that are included with Visual Studio (eg: The Hub App project). Or add a new "BasicPage" to your application. You will notice that they are using a NAvigationHelper to subscribe to the BackPressed event for you already. The post you linked to explains it pretty well.
The most important thing to know about the BackPressed event that is raised when the user presses the back button is that if your app does not handle the event, by setting BackPressedEventArgs.Handled property to true, the operating system will suspend your app and return the user to the previous experience
The example is given in that post
private void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
Frame frame = Window.Current.Content as Frame;
if (frame == null)
{
return;
}
if (frame.CanGoBack)
{
frame.GoBack();
e.Handled = true;
}
}
Notice it sets e.Handled = true; to indicate that the app should not "close". You are saying "Hey, I've got this handled already". In the example, it will navigate to the previous page.
I'm writing a windows phone app, and I want to know how to alert and make sure the that user really wants to exit the app on the back key press. Pretty simple.
Thanks.
I assume your navigation is set up such that the user can only exit from the first page. If so, in that page, you can override the OnBackKeyPress event and cancel the button press. I haven't tested this code, but seems like it should work:
protected override void OnBackKeyPress(CancelEventArgs e)
{
if(MessageBox.Show("Are you sure you want to exit?","Exit?",
MessageBoxButton.OKCancel) != MessageBoxResult.OK)
{
e.Cancel = true;
}
}
Edit - I'll leave this here as an example of overriding the back button, but the correct answer in this context is to not implement the feature.
While the previous answer about cancelling OnBackKeyPress may technically work, it could cause your app to fail certification requirements. See the following link:
http://msdn.microsoft.com/en-us/library/hh184840(v=VS.92).aspx
5.2.4.2 – Back Button: First Screen
Pressing the Back button from the first screen of an application must close the application.
I would recommend not implementing this functionality.
I am developing an xbap application and have run into a problem with users refreshing the application using F5, which results in an immediate application crash. The workaround is to use the browsers refresh button. This reloads the application as expected.
What exactly happens when the user presses F5 in an xbap? Is there any way to override this behavior, or at least make it work as if the user pressed the button in the browser?
I did a simple override to ignore the refresh, and tell the users to use the browsers button instead.
Application.Current.Navigating += new NavigatingCancelEventHandler(Current_Navigating);
..
void Current_Navigating(object sender, NavigatingCancelEventArgs e)
{
if (e.NavigationMode == NavigationMode.Refresh)
{
e.Cancel = true;
}
}