Skip to content

Commit 44a9c04

Browse files
authored
Merge pull request #6826 from Youssef1313/issues/2171
fix: Apply pointer visual states of pivot items
2 parents d10bbaf + 341205f commit 44a9c04

File tree

1 file changed

+79
-18
lines changed
  • src/Uno.UI/UI/Xaml/Controls/Pivot

1 file changed

+79
-18
lines changed

src/Uno.UI/UI/Xaml/Controls/Pivot/Pivot.cs

Lines changed: 79 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,29 @@
11
using System;
2-
using System.Collections.Generic;
32
using System.Linq;
4-
using System.Runtime.InteropServices.WindowsRuntime;
53
using Uno.Extensions;
64
using Uno.Extensions.Specialized;
7-
using Windows.Foundation;
85
using Windows.Foundation.Collections;
9-
using Windows.UI.Xaml;
10-
using Windows.UI.Xaml.Controls;
116
using Windows.UI.Xaml.Controls.Primitives;
127
using Windows.UI.Xaml.Data;
13-
using Windows.UI.Xaml.Documents;
148
using Windows.UI.Xaml.Input;
159
using Windows.UI.Xaml.Media;
1610

1711
namespace Windows.UI.Xaml.Controls
1812
{
1913
public partial class Pivot : ItemsControl
2014
{
15+
private static class PivotHeaderItemSelectionStates
16+
{
17+
public const string Disabled = "Disabled";
18+
public const string Unselected = "Unselected";
19+
public const string UnselectedLocked = "UnselectedLocked"; // TODO: This is not currently in use.
20+
public const string Selected = "Selected";
21+
public const string UnselectedPointerOver = "UnselectedPointerOver";
22+
public const string SelectedPointerOver = "SelectedPointerOver";
23+
public const string UnselectedPressed = "UnselectedPressed";
24+
public const string SelectedPressed = "SelectedPressed";
25+
}
26+
2127
private ContentControl _titleContentControl;
2228
private PivotHeaderPanel _staticHeader;
2329
private PivotHeaderPanel _header;
@@ -76,6 +82,9 @@ private void UnregisterHeaderEvents()
7682
if (item is PivotHeaderItem pivotHeaderItem)
7783
{
7884
pivotHeaderItem.PointerPressed -= OnItemPointerPressed;
85+
pivotHeaderItem.PointerEntered -= OnItemPointerEntered;
86+
pivotHeaderItem.PointerExited -= OnItemPointerExited;
87+
pivotHeaderItem.IsEnabledChanged -= OnItemIsEnabledChanged;
7988
}
8089
}
8190
}
@@ -92,6 +101,9 @@ private void RegisterHeaderEvents()
92101
if (item is PivotHeaderItem pivotHeaderItem)
93102
{
94103
pivotHeaderItem.PointerPressed += OnItemPointerPressed;
104+
pivotHeaderItem.PointerEntered += OnItemPointerEntered;
105+
pivotHeaderItem.PointerExited += OnItemPointerExited;
106+
pivotHeaderItem.IsEnabledChanged += OnItemIsEnabledChanged;
95107
}
96108
}
97109
}
@@ -104,7 +116,7 @@ private void UpdateProperties()
104116
&& _isTemplateApplied
105117
)
106118
{
107-
if(_headerClipper != null)
119+
if (_headerClipper != null)
108120
{
109121
// Disable clipping until it gets properly supported.
110122
_headerClipper.Clip = null;
@@ -188,7 +200,7 @@ private void SynchronizeItems()
188200
}
189201
else
190202
{
191-
if(TemplatedRoot is NativePivotPresenter presenter)
203+
if (TemplatedRoot is NativePivotPresenter presenter)
192204
{
193205
presenter.Items.Clear();
194206
presenter.Items.AddRange(Items);
@@ -198,15 +210,64 @@ private void SynchronizeItems()
198210

199211
private void OnItemPointerPressed(object sender, PointerRoutedEventArgs e)
200212
{
201-
if (_isUWPTemplate)
213+
if (_isUWPTemplate && sender is PivotHeaderItem selectedHeaderItem)
202214
{
203-
if (sender is PivotHeaderItem selectedHeaderItem)
204-
{
205-
SelectedIndex = _staticHeader.Children.IndexOf(selectedHeaderItem);
206-
}
215+
UpdateVisualStates(selectedHeaderItem);
216+
SelectedIndex = _staticHeader.Children.IndexOf(selectedHeaderItem);
217+
}
218+
}
219+
220+
private void OnItemPointerEntered(object sender, PointerRoutedEventArgs e)
221+
{
222+
if (_isUWPTemplate && sender is PivotHeaderItem headerItem)
223+
{
224+
UpdateVisualStates(headerItem);
225+
}
226+
}
227+
228+
private void OnItemPointerExited(object sender, PointerRoutedEventArgs e)
229+
{
230+
if (_isUWPTemplate && sender is PivotHeaderItem headerItem)
231+
{
232+
UpdateVisualStates(headerItem);
233+
}
234+
}
235+
236+
private void OnItemIsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
237+
{
238+
if (_isUWPTemplate && sender is PivotHeaderItem headerItem)
239+
{
240+
UpdateVisualStates(headerItem);
207241
}
208242
}
209243

244+
private void UpdateVisualStates(PivotHeaderItem headerItem)
245+
{
246+
if (!_isUWPTemplate)
247+
{
248+
return;
249+
}
250+
251+
if (!headerItem.IsEnabled)
252+
{
253+
VisualStateManager.GoToState(headerItem, PivotHeaderItemSelectionStates.Disabled, true);
254+
return;
255+
}
256+
257+
var isSelected = SelectedIndex == _staticHeader.Children.IndexOf(headerItem);
258+
var state = (isSelected, headerItem.IsPointerOver, headerItem.IsPointerPressed) switch
259+
{
260+
(true, true, _) => PivotHeaderItemSelectionStates.SelectedPointerOver,
261+
(true, _, true) => PivotHeaderItemSelectionStates.SelectedPressed,
262+
(true, _, _) => PivotHeaderItemSelectionStates.SelectedPressed,
263+
(false, true, _) => PivotHeaderItemSelectionStates.UnselectedPointerOver,
264+
(false, _, true) => PivotHeaderItemSelectionStates.UnselectedPressed,
265+
(false, _, _) => PivotHeaderItemSelectionStates.Unselected,
266+
};
267+
268+
VisualStateManager.GoToState(headerItem, state, true);
269+
}
270+
210271
private void OnSelectedIndexChanged(int oldValue, int newValue)
211272
{
212273
if (_isUWPTemplate)
@@ -220,7 +281,7 @@ protected override void OnItemsSourceChanged(DependencyPropertyChangedEventArgs
220281
base.OnItemsSourceChanged(e);
221282

222283
SynchronizeItems();
223-
}
284+
}
224285

225286
private void SynchronizeSelectedItem()
226287
{
@@ -233,7 +294,7 @@ private void SynchronizeSelectedItem()
233294
var selectedPivotitem = items.ElementAt(selectedIndex);
234295

235296
SelectedItem = selectedPivotitem;
236-
297+
237298
for (int i = 0; i < NumberOfItems; i++)
238299
{
239300
if (ContainerFromIndex(i) is ContentControl itemContainer)
@@ -275,12 +336,12 @@ private static void OnTitlePropertyChanged(DependencyObject dependencyObject, De
275336

276337
private void OnSelectedItemPropertyChanged(object oldValue, object newValue)
277338
{
278-
var removedItems = oldValue == null ? new object[0] : new [] { oldValue };
279-
var addedItems = newValue == null ? new object[0] : new [] { newValue };
339+
var removedItems = oldValue == null ? new object[0] : new[] { oldValue };
340+
var addedItems = newValue == null ? new object[0] : new[] { newValue };
280341

281342
OnSelectedItemChangedPartial(oldValue, newValue);
282343

283-
InvokeSelectionChanged(removedItems, addedItems);
344+
InvokeSelectionChanged(removedItems, addedItems);
284345
}
285346

286347
partial void OnSelectedItemChangedPartial(object oldSelectedItem, object selectedItem);

0 commit comments

Comments
 (0)