1
1
using System ;
2
- using System . Collections . Generic ;
3
2
using System . Linq ;
4
- using System . Runtime . InteropServices . WindowsRuntime ;
5
3
using Uno . Extensions ;
6
4
using Uno . Extensions . Specialized ;
7
- using Windows . Foundation ;
8
5
using Windows . Foundation . Collections ;
9
- using Windows . UI . Xaml ;
10
- using Windows . UI . Xaml . Controls ;
11
6
using Windows . UI . Xaml . Controls . Primitives ;
12
7
using Windows . UI . Xaml . Data ;
13
- using Windows . UI . Xaml . Documents ;
14
8
using Windows . UI . Xaml . Input ;
15
9
using Windows . UI . Xaml . Media ;
16
10
17
11
namespace Windows . UI . Xaml . Controls
18
12
{
19
13
public partial class Pivot : ItemsControl
20
14
{
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
+
21
27
private ContentControl _titleContentControl ;
22
28
private PivotHeaderPanel _staticHeader ;
23
29
private PivotHeaderPanel _header ;
@@ -76,6 +82,9 @@ private void UnregisterHeaderEvents()
76
82
if ( item is PivotHeaderItem pivotHeaderItem )
77
83
{
78
84
pivotHeaderItem . PointerPressed -= OnItemPointerPressed ;
85
+ pivotHeaderItem . PointerEntered -= OnItemPointerEntered ;
86
+ pivotHeaderItem . PointerExited -= OnItemPointerExited ;
87
+ pivotHeaderItem . IsEnabledChanged -= OnItemIsEnabledChanged ;
79
88
}
80
89
}
81
90
}
@@ -92,6 +101,9 @@ private void RegisterHeaderEvents()
92
101
if ( item is PivotHeaderItem pivotHeaderItem )
93
102
{
94
103
pivotHeaderItem . PointerPressed += OnItemPointerPressed ;
104
+ pivotHeaderItem . PointerEntered += OnItemPointerEntered ;
105
+ pivotHeaderItem . PointerExited += OnItemPointerExited ;
106
+ pivotHeaderItem . IsEnabledChanged += OnItemIsEnabledChanged ;
95
107
}
96
108
}
97
109
}
@@ -104,7 +116,7 @@ private void UpdateProperties()
104
116
&& _isTemplateApplied
105
117
)
106
118
{
107
- if ( _headerClipper != null )
119
+ if ( _headerClipper != null )
108
120
{
109
121
// Disable clipping until it gets properly supported.
110
122
_headerClipper . Clip = null ;
@@ -188,7 +200,7 @@ private void SynchronizeItems()
188
200
}
189
201
else
190
202
{
191
- if ( TemplatedRoot is NativePivotPresenter presenter )
203
+ if ( TemplatedRoot is NativePivotPresenter presenter )
192
204
{
193
205
presenter . Items . Clear ( ) ;
194
206
presenter . Items . AddRange ( Items ) ;
@@ -198,15 +210,64 @@ private void SynchronizeItems()
198
210
199
211
private void OnItemPointerPressed ( object sender , PointerRoutedEventArgs e )
200
212
{
201
- if ( _isUWPTemplate )
213
+ if ( _isUWPTemplate && sender is PivotHeaderItem selectedHeaderItem )
202
214
{
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 ) ;
207
241
}
208
242
}
209
243
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
+
210
271
private void OnSelectedIndexChanged ( int oldValue , int newValue )
211
272
{
212
273
if ( _isUWPTemplate )
@@ -220,7 +281,7 @@ protected override void OnItemsSourceChanged(DependencyPropertyChangedEventArgs
220
281
base . OnItemsSourceChanged ( e ) ;
221
282
222
283
SynchronizeItems ( ) ;
223
- }
284
+ }
224
285
225
286
private void SynchronizeSelectedItem ( )
226
287
{
@@ -233,7 +294,7 @@ private void SynchronizeSelectedItem()
233
294
var selectedPivotitem = items . ElementAt ( selectedIndex ) ;
234
295
235
296
SelectedItem = selectedPivotitem ;
236
-
297
+
237
298
for ( int i = 0 ; i < NumberOfItems ; i ++ )
238
299
{
239
300
if ( ContainerFromIndex ( i ) is ContentControl itemContainer )
@@ -275,12 +336,12 @@ private static void OnTitlePropertyChanged(DependencyObject dependencyObject, De
275
336
276
337
private void OnSelectedItemPropertyChanged ( object oldValue , object newValue )
277
338
{
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 } ;
280
341
281
342
OnSelectedItemChangedPartial ( oldValue , newValue ) ;
282
343
283
- InvokeSelectionChanged ( removedItems , addedItems ) ;
344
+ InvokeSelectionChanged ( removedItems , addedItems ) ;
284
345
}
285
346
286
347
partial void OnSelectedItemChangedPartial ( object oldSelectedItem , object selectedItem ) ;
0 commit comments