[UWP] Escape key returns ActionSheet result (#208)
authorPaul DiPietro <pauldipietro@users.noreply.github.com>
Thu, 16 Jun 2016 16:17:18 +0000 (12:17 -0400)
committerRui Marinho <me@ruimarinho.net>
Thu, 16 Jun 2016 16:17:18 +0000 (17:17 +0100)
When awaiting a DisplayActionSheet in UWP, pressing the escape key with
the ActionSheet open would dismiss the dialog but not return a result.

Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla40998.cs [new file with mode: 0644]
Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems
Xamarin.Forms.Platform.WinRT/Platform.cs

diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla40998.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla40998.cs
new file mode 100644 (file)
index 0000000..28288a4
--- /dev/null
@@ -0,0 +1,41 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+using Xamarin.Forms.Internals;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls.Issues
+{
+       [Preserve(AllMembers = true)]
+       [Issue(IssueTracker.Bugzilla, 40998, "[UWP] Pressing escape with an awaited DisplayActionSheet doesn't return a result", PlatformAffected.WinRT)]
+       public class Bugzilla40998 : TestContentPage
+       {
+               protected override void Init()
+               {
+                       var resultLabel = new Label
+                       {
+                               Text = "ActionSheet Result - use the ActionSheet to show the result"
+                       };
+                       Content = new StackLayout
+                       {
+                               Children =
+                               {
+                                       resultLabel,
+                                       new Button
+                                       {
+                                               Text = "Click to display ActionSheet",
+                                               Command = new Command(async () =>
+                                               {
+                                                       var result = await DisplayActionSheet("Test ActionSheet", "Cancel", "Destroy", new string[] { "Test Button" });
+                                                       resultLabel.Text = result;
+                                               })
+                                       }
+                               }
+                       };
+               }
+       }
+}
index 00fad87..8d7f9a7 100644 (file)
     <Compile Include="$(MSBuildThisFileDirectory)Bugzilla40333.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Bugzilla31806.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Bugzilla41078.cs" />
+    <Compile Include="$(MSBuildThisFileDirectory)Bugzilla40998.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)CarouselAsync.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Bugzilla34561.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Bugzilla34727.cs" />
index 6c158a0..311186b 100644 (file)
@@ -13,7 +13,9 @@ using Windows.UI.Xaml.Media;
 using Windows.UI.Xaml.Media.Animation;
 
 #if WINDOWS_UWP
+using Windows.Foundation;
 using Windows.Foundation.Metadata;
+using Windows.UI.Core;
 using Windows.UI.ViewManagement;
 #endif
 
@@ -591,6 +593,17 @@ namespace Xamarin.Forms.Platform.WinRT
                                options.SetResult((string)e.ClickedItem);
                        };
 
+                       TypedEventHandler<CoreWindow, CharacterReceivedEventArgs> onEscapeButtonPressed = delegate(CoreWindow window, CharacterReceivedEventArgs args)
+                       {
+                               if (args.KeyCode == 27)
+                               {
+                                       dialog.Hide();
+                                       options.SetResult(ContentDialogResult.None.ToString());
+                               }
+                       };
+
+                       Window.Current.CoreWindow.CharacterReceived += onEscapeButtonPressed;
+
                        _actionSheetOptions = options;
 
                        if (options.Cancel != null)
@@ -604,6 +617,8 @@ namespace Xamarin.Forms.Platform.WinRT
                                options.SetResult(options.Cancel);
                        else if (result == ContentDialogResult.Primary)
                                options.SetResult(options.Destruction);
+
+                       Window.Current.CoreWindow.CharacterReceived -= onEscapeButtonPressed;
                }
 #else
                void OnPageActionSheet(Page sender, ActionSheetArguments options)