[UWP] Use ItemClick to re-enable use of enter key for selection on ListView (#1133)

This commit is contained in:
Paul DiPietro 2017-09-12 07:54:22 -04:00 коммит произвёл Samantha Houts
Родитель 7c50652923
Коммит d1bf93be20
3 изменённых файлов: 68 добавлений и 38 удалений

Просмотреть файл

@ -0,0 +1,57 @@
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");
}
}
}

Просмотреть файл

@ -216,6 +216,7 @@
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla57758.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla57910.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla58406.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla59248.cs" />
<Compile Include="$(MSBuildThisFileDirectory)ButtonBackgroundColorTest.cs" />
<Compile Include="$(MSBuildThisFileDirectory)CarouselAsync.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla34561.cs" />

Просмотреть файл

@ -72,10 +72,8 @@ namespace Xamarin.Forms.Platform.WinRT
GroupStyleSelector = (GroupStyleSelector)WApp.Current.Resources["ListViewGroupSelector"]
};
// 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.IsItemClickEnabled = true;
List.ItemClick += OnListItemClicked;
List.SelectionChanged += OnControlSelectionChanged;
@ -137,8 +135,7 @@ namespace Xamarin.Forms.Platform.WinRT
{
if (List != null)
{
List.Tapped -= ListOnTapped;
List.ItemClick -= OnListItemClicked;
List.SelectionChanged -= OnControlSelectionChanged;
List.DataContext = null;
@ -437,32 +434,6 @@ 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
@ -504,6 +475,12 @@ 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();
@ -533,13 +510,8 @@ 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)
OnListItemClicked(List.SelectedIndex);
((IElementController)Element).SetValueFromRenderer(ListView.SelectedItemProperty, List.SelectedItem);
}
FrameworkElement FindElement(object cell)