From 1a71304e2e722c19e6d9efaa67662f1c65f1fbe4 Mon Sep 17 00:00:00 2001 From: Thomas Ibel Date: Thu, 5 Jun 2014 06:48:42 +0200 Subject: [PATCH] allow to handle HadwareButtons.BackPressed in WPA81 --- nuget/Caliburn.Light.nuspec | 2 +- .../Services/FrameAdapter.cs | 67 ++++++++++--------- .../Services/INavigationService.cs | 10 +++ .../Services/FrameAdapter.cs | 20 ++---- src/GlobalAssemblyInfo.cs | 2 +- 5 files changed, 53 insertions(+), 48 deletions(-) diff --git a/nuget/Caliburn.Light.nuspec b/nuget/Caliburn.Light.nuspec index a811515..7fa93cb 100644 --- a/nuget/Caliburn.Light.nuspec +++ b/nuget/Caliburn.Light.nuspec @@ -3,7 +3,7 @@ Caliburn.Light Caliburn.Light - 1.2.2 + 1.2.3 Thomas Ibel The magic-free Caliburn.Micro, a powerful framework designed for building applications across all XAML platforms. en-US diff --git a/src/Caliburn.Xaml.Universal/Services/FrameAdapter.cs b/src/Caliburn.Xaml.Universal/Services/FrameAdapter.cs index 4613241..5af6adb 100644 --- a/src/Caliburn.Xaml.Universal/Services/FrameAdapter.cs +++ b/src/Caliburn.Xaml.Universal/Services/FrameAdapter.cs @@ -6,6 +6,9 @@ using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Navigation; +#if WINDOWS_PHONE_APP +using Windows.Phone.UI.Input; +#endif namespace Caliburn.Light { @@ -19,7 +22,6 @@ public class FrameAdapter : INavigationService private const string ParameterKey = "ParameterKey"; private readonly Frame _frame; - private event NavigatingCancelEventHandler ExternalNavigatingHandler = delegate { }; private object _currentParameter; /// @@ -34,8 +36,8 @@ public FrameAdapter(Frame frame) _frame.Navigated += OnNavigated; #if WINDOWS_PHONE_APP - _frame.Loaded += (sender, args) => { Windows.Phone.UI.Input.HardwareButtons.BackPressed += OnHardwareBackPressed; }; - _frame.Unloaded += (sender, args) => { Windows.Phone.UI.Input.HardwareButtons.BackPressed -= OnHardwareBackPressed; }; + _frame.Loaded += (sender, args) => { HardwareButtons.BackPressed += OnHardwareBackPressed; }; + _frame.Unloaded += (sender, args) => { HardwareButtons.BackPressed -= OnHardwareBackPressed; }; #endif } @@ -46,7 +48,9 @@ public FrameAdapter(Frame frame) /// The event args. protected virtual void OnNavigating(object sender, NavigatingCancelEventArgs e) { - ExternalNavigatingHandler(sender, e); + var handler = Navigating; + if (handler != null) + handler(sender, e); if (e.Cancel) return; @@ -85,7 +89,6 @@ protected virtual void OnNavigating(object sender, NavigatingCancelEventArgs e) /// The event args. protected virtual void OnNavigated(object sender, NavigationEventArgs e) { - if (e.Content == null) return; @@ -139,32 +142,25 @@ protected virtual void TryInjectParameters(object viewModel, object parameter) { var uri = new Uri((string) parameter); - if (!String.IsNullOrEmpty(uri.Query)) + if (!string.IsNullOrEmpty(uri.Query)) { var decorder = new WwwFormUrlDecoder(uri.Query); foreach (var pair in decorder) { var property = viewModelType.GetRuntimeProperty(pair.Name); - - if (property == null) - { - continue; - } + if (property == null) continue; property.SetValue(viewModel, - ParameterBinder.CoerceValue(property.PropertyType, pair.Value, null)); + ParameterBinder.CoerceValue(property.PropertyType, pair.Value)); } } } else { var property = viewModelType.GetRuntimeProperty("Parameter"); - - if (property == null) - return; - - property.SetValue(viewModel, ParameterBinder.CoerceValue(property.PropertyType, parameter, null)); + if (property == null) return; + property.SetValue(viewModel, ParameterBinder.CoerceValue(property.PropertyType, parameter)); } } @@ -190,11 +186,7 @@ public event NavigatedEventHandler Navigated /// /// Raised prior to navigation. /// - public event NavigatingCancelEventHandler Navigating - { - add { ExternalNavigatingHandler += value; } - remove { ExternalNavigatingHandler -= value; } - } + public event NavigatingCancelEventHandler Navigating; /// /// Raised when navigation fails. @@ -332,16 +324,13 @@ public bool ResumeState() ? container.Values[ParameterKey] : null; - if (String.IsNullOrEmpty(frameState)) + if (string.IsNullOrEmpty(frameState)) return false; _frame.SetNavigationState(frameState); var view = _frame.Content as Page; - if (view == null) - { - return false; - } + if (view == null) return false; BindViewModel(view); @@ -349,13 +338,31 @@ public bool ResumeState() Window.Current.Content = _frame; Window.Current.Activate(); - return true; } #if WINDOWS_PHONE_APP - private void OnHardwareBackPressed(object sender, Windows.Phone.UI.Input.BackPressedEventArgs e) + /// + /// Occurs when the user presses the hardware Back button. + /// + public event EventHandler BackPressed; + + /// + /// Occurs when the user presses the hardware Back button. Allows the handlers to cancel the default behavior. + /// + /// The event arguments + protected virtual void OnBackPressed(BackPressedEventArgs e) { + var handler = BackPressed; + if (handler != null) + handler(this, e); + } + + private void OnHardwareBackPressed(object sender, BackPressedEventArgs e) + { + OnBackPressed(e); + if (e.Handled) return; + if (CanGoBack) { e.Handled = true; @@ -370,4 +377,4 @@ private static ApplicationDataContainer GetSettingsContainer() ApplicationDataCreateDisposition.Always); } } -} \ No newline at end of file +} diff --git a/src/Caliburn.Xaml.Universal/Services/INavigationService.cs b/src/Caliburn.Xaml.Universal/Services/INavigationService.cs index dca6c52..e234787 100644 --- a/src/Caliburn.Xaml.Universal/Services/INavigationService.cs +++ b/src/Caliburn.Xaml.Universal/Services/INavigationService.cs @@ -1,6 +1,9 @@ using System; using System.Collections.Generic; using Windows.UI.Xaml.Navigation; +#if WINDOWS_PHONE_APP +using Windows.Phone.UI.Input; +#endif namespace Caliburn.Light { @@ -77,6 +80,13 @@ public interface INavigationService /// IList ForwardStack { get; } +#if WINDOWS_PHONE_APP + /// + /// Occurs when the user presses the hardware Back button. + /// + event EventHandler BackPressed; +#endif + /// /// Stores the frame navigation state in local settings if it can. /// diff --git a/src/Caliburn.Xaml.WP8/Services/FrameAdapter.cs b/src/Caliburn.Xaml.WP8/Services/FrameAdapter.cs index 990a185..cae69ca 100644 --- a/src/Caliburn.Xaml.WP8/Services/FrameAdapter.cs +++ b/src/Caliburn.Xaml.WP8/Services/FrameAdapter.cs @@ -13,7 +13,6 @@ namespace Caliburn.Light public class FrameAdapter : INavigationService { private readonly Frame _frame; - private NavigatingCancelEventHandler _externalNavigatingHandler; /// /// Creates an instance of @@ -33,7 +32,7 @@ public FrameAdapter(Frame frame) /// The event args. protected virtual void OnNavigating(object sender, NavigatingCancelEventArgs e) { - var handler = _externalNavigatingHandler; + var handler = Navigating; if (handler != null) handler(sender, e); @@ -82,18 +81,11 @@ protected virtual bool CanCloseOnNavigating(object sender, NavigatingCancelEvent /// The event args. protected virtual void OnNavigated(object sender, NavigationEventArgs e) { - if (e.Uri.IsAbsoluteUri || e.Content == null) - { - return; - } + if (e.Uri.IsAbsoluteUri || e.Content == null) return; ViewLocator.InitializeComponent(e.Content); - var viewModel = ViewModelLocator.LocateForView(e.Content); - if (viewModel == null) - { - return; - } + if (viewModel == null) return; var page = e.Content as PhoneApplicationPage; if (page == null) @@ -241,11 +233,7 @@ public event NavigatedEventHandler Navigated /// /// Raised prior to navigation. /// - public event NavigatingCancelEventHandler Navigating - { - add { _externalNavigatingHandler += value; } - remove { _externalNavigatingHandler -= value; } - } + public event NavigatingCancelEventHandler Navigating; /// /// Raised when navigation fails. diff --git a/src/GlobalAssemblyInfo.cs b/src/GlobalAssemblyInfo.cs index 27d4a26..501a6dc 100644 --- a/src/GlobalAssemblyInfo.cs +++ b/src/GlobalAssemblyInfo.cs @@ -15,4 +15,4 @@ #endif [assembly: AssemblyVersion("1.2.0.0")] -[assembly: AssemblyFileVersion("1.2.2.0")] +[assembly: AssemblyFileVersion("1.2.3.0")]