1
- using System . Threading . Tasks ;
2
- #if WINAPPSDK
1
+ using System ;
2
+ using System . Collections . Generic ;
3
+ using System . Linq ;
4
+ using System . Threading . Tasks ;
5
+ using Microsoft . UI . Xaml ;
6
+ using Microsoft . UI . Xaml . Controls ;
7
+ using Microsoft . UI . Xaml . Media ;
8
+ using Windows . UI ;
9
+ using Uno . Extensions ;
10
+ using Uno . Extensions . Specialized ;
3
11
using Uno . UI . Extensions ;
4
- #elif __IOS__
12
+ using Uno . UI . RuntimeTests . Helpers ;
13
+
14
+ using static Private . Infrastructure . TestServices ;
15
+ using MUXC = Microsoft /* UWP don't rename */ . UI . Xaml . Controls ;
16
+
17
+ #if __IOS__
5
18
using UIKit ;
6
19
#elif __MACOS__
7
20
using AppKit ;
8
- #else
9
21
#endif
10
- using Microsoft . UI . Xaml ;
11
- using Microsoft . UI . Xaml . Controls ;
12
- using static Private . Infrastructure . TestServices ;
13
- using Windows . UI ;
14
- using Microsoft . UI . Xaml . Media ;
15
- using Uno . UI . RuntimeTests . Helpers ;
16
22
17
23
namespace Uno . UI . RuntimeTests . Tests . Microsoft_UI_Xaml_Controls
18
24
{
@@ -27,16 +33,16 @@ public partial class Given_NavigationView
27
33
#endif
28
34
public async Task When_SelectedItem_Set_Before_Load_And_Theme_Changed ( )
29
35
{
30
- var navView = new Microsoft /* UWP don't rename */ . UI . Xaml . Controls . NavigationView ( )
36
+ var navView = new MUXC . NavigationView ( )
31
37
{
32
38
MenuItems =
33
39
{
34
- new Microsoft /* UWP don't rename */ . UI . Xaml . Controls . NavigationViewItem { Content = "Item 1" } ,
35
- new Microsoft /* UWP don't rename */ . UI . Xaml . Controls . NavigationViewItem { Content = "Item 2" } ,
36
- new Microsoft /* UWP don't rename */ . UI . Xaml . Controls . NavigationViewItem { Content = "Item 3" } ,
40
+ new MUXC . NavigationViewItem { Content = "Item 1" } ,
41
+ new MUXC . NavigationViewItem { Content = "Item 2" } ,
42
+ new MUXC . NavigationViewItem { Content = "Item 3" } ,
37
43
} ,
38
- PaneDisplayMode = Microsoft /* UWP don't rename */ . UI . Xaml . Controls . NavigationViewPaneDisplayMode . LeftMinimal ,
39
- IsBackButtonVisible = Microsoft /* UWP don't rename */ . UI . Xaml . Controls . NavigationViewBackButtonVisible . Collapsed ,
44
+ PaneDisplayMode = MUXC . NavigationViewPaneDisplayMode . LeftMinimal ,
45
+ IsBackButtonVisible = MUXC . NavigationViewBackButtonVisible . Collapsed ,
40
46
} ;
41
47
navView . SelectedItem = navView . MenuItems [ 1 ] ;
42
48
var hostGrid = new Grid ( ) { MinWidth = 20 , MinHeight = 20 } ;
@@ -53,9 +59,9 @@ public async Task When_SelectedItem_Set_Before_Load_And_Theme_Changed()
53
59
54
60
await WindowHelper . WaitForIdle ( ) ;
55
61
56
- var togglePaneButton = navView . FindFirstChild < Button > ( b => b . Name == "TogglePaneButton" ) ;
57
- var icon = togglePaneButton ? . FindFirstChild < FrameworkElement > ( f => f . Name == "Icon" ) ;
58
- var iconTextBlock = icon ? . FindFirstChild < TextBlock > ( includeCurrent : true ) ;
62
+ var togglePaneButton = navView . FindFirstDescendant < Button > ( b => b . Name == "TogglePaneButton" ) ;
63
+ var icon = togglePaneButton ? . FindFirstDescendant < FrameworkElement > ( f => f . Name == "Icon" ) ;
64
+ var iconTextBlock = icon as TextBlock ?? icon ? . FindFirstDescendant < TextBlock > ( ) ;
59
65
60
66
Assert . IsNotNull ( iconTextBlock ) ;
61
67
@@ -73,5 +79,103 @@ public async Task When_SelectedItem_Set_Before_Load_And_Theme_Changed()
73
79
#endif
74
80
}
75
81
}
82
+
83
+ [ TestMethod ]
84
+ public async Task When_IsBackButtonVisible_Toggled ( )
85
+ {
86
+ // unoplatform/uno#19516
87
+ // droid-specific: There is a bug where setting IsBackButtonVisible would "lock" the size of all NVIs
88
+ // preventing resizing on items expansion/collapse.
89
+
90
+ var sut = new MUXC . NavigationView ( )
91
+ {
92
+ Height = 500 ,
93
+ IsBackButtonVisible = MUXC . NavigationViewBackButtonVisible . Collapsed ,
94
+ IsPaneToggleButtonVisible = false ,
95
+ PaneDisplayMode = MUXC . NavigationViewPaneDisplayMode . Left ,
96
+ CompactModeThresholdWidth = 10 ,
97
+ ExpandedModeThresholdWidth = 50 ,
98
+ } ;
99
+ sut . ItemInvoked += ( s , e ) =>
100
+ {
101
+ // manual trigger for deepest/inner-most items
102
+ if ( e . InvokedItemContainer is MUXC . NavigationViewItem nvi &&
103
+ nvi . MenuItems . Count == 0 )
104
+ {
105
+ sut . IsBackButtonVisible = MUXC . NavigationViewBackButtonVisible . Visible ;
106
+ }
107
+ } ;
108
+
109
+ var nvis = new Dictionary < string , MUXC . NavigationViewItem > ( ) ;
110
+ //AddItems(sut.MenuItems, "", count: 4, depth: 1, maxDepth: 2);
111
+ AddItems ( sut . MenuItems , "" , count : 3 , depth : 1 , maxDepth : 3 ) ;
112
+ void AddItems ( IList < object > target , string prefix , int count , int depth , int maxDepth )
113
+ {
114
+ for ( int i = 0 ; i < count ; i ++ )
115
+ {
116
+ var header = prefix + ( char ) ( 'A' + i ) ;
117
+ var item = new MUXC . NavigationViewItem ( ) { Content = header } ;
118
+
119
+ if ( depth < maxDepth ) AddItems ( item . MenuItems , header , count , depth + 1 , maxDepth ) ;
120
+
121
+ target . Add ( item ) ;
122
+ nvis . Add ( header , item ) ;
123
+ }
124
+ }
125
+
126
+ // for debugging
127
+ var panel = new StackPanel ( ) ;
128
+ void AddTestButton ( string label , Action action )
129
+ {
130
+ var button = new Button ( ) { Content = label } ;
131
+ button . Click += ( s , e ) => action ( ) ;
132
+ panel . Children . Add ( button ) ;
133
+ }
134
+ AddTestButton ( "InvalidateMeasure" , ( ) =>
135
+ {
136
+ foreach ( var ir in sut . EnumerateDescendants ( ) . OfType < MUXC . ItemsRepeater > ( ) )
137
+ {
138
+ ir . InvalidateMeasure ( ) ;
139
+ }
140
+ } ) ;
141
+ AddTestButton ( "IsBackButtonVisible toggle" , ( ) =>
142
+ sut . IsBackButtonVisible = sut . IsBackButtonVisible == MUXC . NavigationViewBackButtonVisible . Collapsed
143
+ ? MUXC . NavigationViewBackButtonVisible . Visible
144
+ : MUXC . NavigationViewBackButtonVisible . Collapsed ) ;
145
+ panel . Children . Add ( sut ) ;
146
+
147
+ await UITestHelper . Load ( panel , x => x . IsLoaded ) ;
148
+
149
+ var initialHeight = nvis [ "B" ] . ActualHeight ;
150
+
151
+ nvis [ "B" ] . IsExpanded = true ;
152
+ await UITestHelper . WaitForIdle ( ) ;
153
+ var partiallyExpandedHeight = nvis [ "B" ] . ActualHeight ;
154
+
155
+ nvis [ "BB" ] . IsExpanded = true ;
156
+ await UITestHelper . WaitForIdle ( ) ;
157
+ var fullyExpandedHeight = nvis [ "B" ] . ActualHeight ;
158
+
159
+ // trigger the bug
160
+ await Task . Delay ( 2000 ) ; // necessary
161
+ sut . IsBackButtonVisible = MUXC . NavigationViewBackButtonVisible . Visible ;
162
+ await UITestHelper . WaitForIdle ( ) ;
163
+
164
+ nvis [ "BB" ] . IsExpanded = false ;
165
+ await UITestHelper . WaitForIdle ( ) ;
166
+ var partiallyCollapsedHeight = nvis [ "B" ] . ActualHeight ;
167
+
168
+ nvis [ "B" ] . IsExpanded = false ;
169
+ await UITestHelper . WaitForIdle ( ) ;
170
+ var fullyCollapsedHeight = nvis [ "B" ] . ActualHeight ;
171
+
172
+ // sanity check
173
+ Assert . IsTrue ( initialHeight < partiallyExpandedHeight , $ "Expanding 'B' should increase item 'B' height: { initialHeight } -> { partiallyExpandedHeight } ") ;
174
+ Assert . IsTrue ( partiallyExpandedHeight < fullyExpandedHeight , $ "Expanding 'BB' should increase item 'B' height: { partiallyExpandedHeight } -> { fullyExpandedHeight } ") ;
175
+
176
+ // verifying fix
177
+ Assert . IsTrue ( fullyExpandedHeight > partiallyCollapsedHeight , $ "Collapsing 'BB' should reduce item 'B' height: { fullyExpandedHeight } -> { partiallyCollapsedHeight } ") ;
178
+ Assert . IsTrue ( partiallyCollapsedHeight > fullyCollapsedHeight , $ "Collapsing 'B' should reduce item 'B' height: { partiallyCollapsedHeight } -> { fullyCollapsedHeight } ") ;
179
+ }
76
180
}
77
181
}
0 commit comments