diff --git a/src/Uno.UI/UI/Xaml/Controls/ListViewBase/ListViewBase.cs b/src/Uno.UI/UI/Xaml/Controls/ListViewBase/ListViewBase.cs index fc7fae768e3e..7562036ef426 100644 --- a/src/Uno.UI/UI/Xaml/Controls/ListViewBase/ListViewBase.cs +++ b/src/Uno.UI/UI/Xaml/Controls/ListViewBase/ListViewBase.cs @@ -459,7 +459,7 @@ partial void OnSelectionModeChangedPartial(ListViewSelectionMode oldSelectionMod - internal override void OnItemClicked(int clickedIndex) + internal override void OnItemClicked(int clickedIndex, VirtualKeyModifiers modifiers) { // Note: don't call base.OnItemClicked(), because we override the default single-selection-only handling @@ -487,7 +487,16 @@ internal override void OnItemClicked(int clickedIndex) // The CollectionView may have intercepted the change clickedIndex = collectionView.CurrentPosition; } - SelectedIndex = clickedIndex; + + if ((modifiers & VirtualKeyModifiers.Control) != 0 && clickedIndex == SelectedIndex) + { + SelectedIndex = -1; + } + else + { + SelectedIndex = clickedIndex; + } + break; case ListViewSelectionMode.Multiple: case ListViewSelectionMode.Extended: diff --git a/src/Uno.UI/UI/Xaml/Controls/Primitives/Selector.cs b/src/Uno.UI/UI/Xaml/Controls/Primitives/Selector.cs index 5360c1db799f..e57511fab0ff 100644 --- a/src/Uno.UI/UI/Xaml/Controls/Primitives/Selector.cs +++ b/src/Uno.UI/UI/Xaml/Controls/Primitives/Selector.cs @@ -13,6 +13,7 @@ using Windows.UI.Xaml.Data; using Uno.UI.DataBinding; using Windows.Foundation.Collections; +using Windows.System; using Uno.UI.Xaml.Controls; using Windows.UI.Xaml.Input; @@ -555,9 +556,11 @@ internal override void OnItemsSourceGroupsChanged(object sender, NotifyCollectio } } - internal void OnItemClicked(SelectorItem selectorItem) => OnItemClicked(IndexFromContainer(selectorItem)); + internal void OnItemClicked(SelectorItem selectorItem, VirtualKeyModifiers modifiers) => OnItemClicked(IndexFromContainer(selectorItem), modifiers); - internal virtual void OnItemClicked(int clickedIndex) + internal virtual void OnItemClicked(int clickedIndex) => OnItemClicked(clickedIndex, VirtualKeyModifiers.None); + + internal virtual void OnItemClicked(int clickedIndex, VirtualKeyModifiers modifiers) { if (ItemsSource is ICollectionView collectionView) { diff --git a/src/Uno.UI/UI/Xaml/Controls/Primitives/SelectorItem.cs b/src/Uno.UI/UI/Xaml/Controls/Primitives/SelectorItem.cs index dd389c01cfe8..5c3f94ef811d 100644 --- a/src/Uno.UI/UI/Xaml/Controls/Primitives/SelectorItem.cs +++ b/src/Uno.UI/UI/Xaml/Controls/Primitives/SelectorItem.cs @@ -342,7 +342,7 @@ protected override void OnPointerReleased(PointerRoutedEventArgs args) _canRaiseClickOnPointerRelease = false; update = ManipulationUpdateKind.Clicked; - Selector?.OnItemClicked(this); + Selector?.OnItemClicked(this, args.KeyModifiers); // This should be automatically done by the pointers due to release, but if for any reason // the state is invalid, this makes sure to not keep invalid capture longer than needed.