From 783ecfcde057f4d8920058410bcba3d1d353808e Mon Sep 17 00:00:00 2001 From: Samantha Houts Date: Tue, 26 Sep 2017 10:34:35 -0700 Subject: [PATCH] Revert "[UWP] Use ItemClick to re-enable use of enter key for selection on ListView (#1133)" This reverts commit d1bf93be200b3d3c48d0d292bf455f444485d8f9. --- .../Bugzilla59248.cs | 57 ------------------- ...rin.Forms.Controls.Issues.Shared.projitems | 1 - .../ListViewRenderer.cs | 48 ++++++++++++---- 3 files changed, 38 insertions(+), 68 deletions(-) delete mode 100644 Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla59248.cs diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla59248.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla59248.cs deleted file mode 100644 index 96a802967..000000000 --- a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla59248.cs +++ /dev/null @@ -1,57 +0,0 @@ -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, 59248, "[UWP] ItemTapped event is not fired when keyboard Enter Pressed on ListView", PlatformAffected.UWP)] - public class Bugzilla59248 : TestContentPage - { - protected override void Init() - { - var selectedItem = new Label { Text = "SelectedItem" }; - var list = new ListView - { - ItemsSource = new string[] { "A", "B", "C" }, - ItemTemplate = new DataTemplate(() => - { - var view = new ViewCell(); - view.View = new StackLayout - { - Children = - { - new Label { Text = "Label" }, - new Button { Text = "Click for alert", Command = new Command(() => DisplayAlert("Clicked the button in the listview item", "Ok", "Cancel"))} - } - }; - return view; - }) - }; - list.ItemTapped += List_ItemTapped; - list.ItemSelected += (s, e) => - { - selectedItem.Text = list.SelectedItem == null ? "None" : list.SelectedItem.ToString(); - }; - - Content = new StackLayout - { - Children = - { - list, - selectedItem - } - }; - } - - private void List_ItemTapped(object sender, ItemTappedEventArgs e) - { - if (e.Item != null) - DisplayAlert("Tapped: " + e.Item, "Ok", "Cancel"); - } - } -} \ No newline at end of file diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems index 4412acae5..5055f9587 100644 --- a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems @@ -218,7 +218,6 @@ - diff --git a/Xamarin.Forms.Platform.WinRT/ListViewRenderer.cs b/Xamarin.Forms.Platform.WinRT/ListViewRenderer.cs index 33525bc1f..0fb5af80f 100644 --- a/Xamarin.Forms.Platform.WinRT/ListViewRenderer.cs +++ b/Xamarin.Forms.Platform.WinRT/ListViewRenderer.cs @@ -72,8 +72,10 @@ namespace Xamarin.Forms.Platform.WinRT GroupStyleSelector = (GroupStyleSelector)WApp.Current.Resources["ListViewGroupSelector"] }; - List.IsItemClickEnabled = true; - List.ItemClick += OnListItemClicked; + // In order to support tapping on elements within a list item, we handle + // ListView.Tapped (which can be handled by child elements in the list items + // and prevented from bubbling up) rather than ListView.ItemClick + List.Tapped += ListOnTapped; List.SelectionChanged += OnControlSelectionChanged; @@ -135,7 +137,8 @@ namespace Xamarin.Forms.Platform.WinRT { if (List != null) { - List.ItemClick -= OnListItemClicked; + List.Tapped -= ListOnTapped; + List.SelectionChanged -= OnControlSelectionChanged; List.DataContext = null; @@ -434,6 +437,32 @@ namespace Xamarin.Forms.Platform.WinRT List.SelectedIndex = index; } + void ListOnTapped(object sender, TappedRoutedEventArgs args) + { + var orig = args.OriginalSource as DependencyObject; + int index = -1; + + // Work our way up the tree until we find the actual list item + // the user tapped on + while (orig != null && orig != List) + { + var lv = orig as ListViewItem; + + if (lv != null) + { + index = TemplatedItemsView.TemplatedItems.GetGlobalIndexOfItem(lv.Content); + break; + } + + orig = VisualTreeHelper.GetParent(orig); + } + + if (index > -1) + { + OnListItemClicked(index); + } + } + void OnListItemClicked(int index) { #if !WINDOWS_UWP @@ -475,12 +504,6 @@ namespace Xamarin.Forms.Platform.WinRT #endif } - void OnListItemClicked(object sender, ItemClickEventArgs e) - { - if (e.ClickedItem != null) - OnListItemClicked(((WListView)e.OriginalSource).Items.IndexOf(e.ClickedItem)); - } - void OnControlSelectionChanged(object sender, SelectionChangedEventArgs e) { RestorePreviousSelectedVisual(); @@ -510,8 +533,13 @@ namespace Xamarin.Forms.Platform.WinRT } } #endif + + // A11y: Tapped event will not be routed when Narrator is active, so we need to handle it here. + // Also handles keyboard selection. + // Default UWP behavior is that items are selected when you navigate to them via the arrow keys + // and deselected with the space bar, so this will remain the same. if (Element.SelectedItem != List.SelectedItem) - ((IElementController)Element).SetValueFromRenderer(ListView.SelectedItemProperty, List.SelectedItem); + OnListItemClicked(List.SelectedIndex); } FrameworkElement FindElement(object cell)