[WinRT/UWP] Open Picker dropdown when calling Focus (#762)
authorPaul DiPietro <pauldipietro@users.noreply.github.com>
Mon, 20 Mar 2017 15:48:28 +0000 (10:48 -0500)
committerJason Smith <jason.smith@xamarin.com>
Mon, 20 Mar 2017 15:48:28 +0000 (08:48 -0700)
Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla52266.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/PickerRenderer.cs

diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla52266.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla52266.cs
new file mode 100644 (file)
index 0000000..ab95f98
--- /dev/null
@@ -0,0 +1,38 @@
+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, 52266, "[WinRT/UWP] Picker.Focus() does not open the dropdown", PlatformAffected.WinRT)]
+       public class Bugzilla52266 : TestContentPage
+       {
+               protected override void Init()
+               {
+                       var picker = new Picker
+                       {
+                               ItemsSource = new string[] { "A", "B", "C" }
+                       };
+                       Content = new StackLayout
+                       {
+                               Children =
+                               {
+                                       picker,
+                                       new Button
+                                       {
+                                               Text = "Click to focus the picker",
+                                               Command = new Command(() =>
+                                               {
+                                                       picker.Focus();
+                                               })
+                                       }
+                               }
+                       };
+               }
+       }
+}
\ No newline at end of file
index 841b44a..23fc538 100644 (file)
       <DependentUpon>Bugzilla51642.xaml</DependentUpon>
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="$(MSBuildThisFileDirectory)Bugzilla52266.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)CarouselAsync.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Bugzilla34561.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Bugzilla34727.cs" />
index a7aa16f..d4ee918 100644 (file)
@@ -19,6 +19,7 @@ namespace Xamarin.Forms.Platform.WinRT
        {
                bool _isAnimating;
                Brush _defaultBrush;
+               bool _dropDownWasOpened;
 
                protected override void Dispose(bool disposing)
                {
@@ -32,6 +33,7 @@ namespace Xamarin.Forms.Platform.WinRT
                                        Control.DropDownClosed -= OnDropDownOpenStateChanged;
                                        Control.OpenAnimationCompleted -= ControlOnOpenAnimationCompleted;
                                        Control.Loaded -= ControlOnLoaded;
+                                       Control.GotFocus -= ControlOnGotFocus;
                                }
                        }
 
@@ -51,6 +53,7 @@ namespace Xamarin.Forms.Platform.WinRT
                                        Control.OpenAnimationCompleted += ControlOnOpenAnimationCompleted;
                                        Control.ClosedAnimationStarted += ControlOnClosedAnimationStarted;
                                        Control.Loaded += ControlOnLoaded;
+                                       Control.GotFocus += ControlOnGotFocus;
                                }
 
                                Control.ItemsSource = ((LockableObservableListWrapper)Element.Items)._list;
@@ -102,6 +105,19 @@ namespace Xamarin.Forms.Platform.WinRT
                        }
                }
 
+               void ControlOnGotFocus(object sender, RoutedEventArgs routedEventArgs)
+               {
+                       // The FormsComboBox is separate from the Popup/dropdown that it uses to select an item,
+                       // and the behavior here is changed to be similar to the other platforms where focusing the
+                       // Picker opens the dropdown (with the exception where if focus was given via keyboard, such
+                       // as tabbing through controls). The _dropDownWasOpened flag is reset to false in the case that
+                       // the FormsComboBox regained focus after the dropdown closed.
+                       if (!_dropDownWasOpened && Control.FocusState != FocusState.Keyboard)
+                               Control.IsDropDownOpen = true;
+                       else
+                               _dropDownWasOpened = false;
+               }
+
                void OnControlSelectionChanged(object sender, SelectionChangedEventArgs e)
                {
                        if (Element != null)
@@ -129,6 +145,9 @@ namespace Xamarin.Forms.Platform.WinRT
                                _isAnimating = false;
                                // and force the final redraw
                                ((IVisualElementController)Element)?.InvalidateMeasure(InvalidationTrigger.MeasureChanged);
+
+                               // Related to ControlOnGotFocus, _dropDownWasOpened is set to true
+                               _dropDownWasOpened = true;
                        }
                }