--- /dev/null
+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
{
bool _isAnimating;
Brush _defaultBrush;
+ bool _dropDownWasOpened;
protected override void Dispose(bool disposing)
{
Control.DropDownClosed -= OnDropDownOpenStateChanged;
Control.OpenAnimationCompleted -= ControlOnOpenAnimationCompleted;
Control.Loaded -= ControlOnLoaded;
+ Control.GotFocus -= ControlOnGotFocus;
}
}
Control.OpenAnimationCompleted += ControlOnOpenAnimationCompleted;
Control.ClosedAnimationStarted += ControlOnClosedAnimationStarted;
Control.Loaded += ControlOnLoaded;
+ Control.GotFocus += ControlOnGotFocus;
}
Control.ItemsSource = ((LockableObservableListWrapper)Element.Items)._list;
}
}
+ 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)
_isAnimating = false;
// and force the final redraw
((IVisualElementController)Element)?.InvalidateMeasure(InvalidationTrigger.MeasureChanged);
+
+ // Related to ControlOnGotFocus, _dropDownWasOpened is set to true
+ _dropDownWasOpened = true;
}
}