summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Controls.Issues
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.Controls.Issues')
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/AddingMultipleItemsListView.cs443
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/AppBarIconColors.cs52
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla21368.cs90
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla21501.cs47
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla21780.cs19
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla22229.xaml11
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla22229.xaml.cs51
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla22401.cs114
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla24574.cs50
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla24769.cs80
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla25662.cs35
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla25979.cs133
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26032.xaml51
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26032.xaml.cs75
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26171.cs98
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26233.cs56
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26501.cs150
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26868.cs105
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26993.cs105
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27085.cs36
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27318.xaml23
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27318.xaml.cs22
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27350.cs151
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27378.cs33
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27581.cs29
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27642.cs178
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27698.cs53
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27779.cs83
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28001.cs60
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28240.cs38
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28498.cs78
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28570.cs118
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28575.cs53
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28709.cs94
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28796.cs35
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28939.cs21
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29017.cs82
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29107.xaml249
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29107.xaml.cs22
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29128.cs36
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29158.cs24
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29229.cs29
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29247.cs67
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29257.cs100
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29363.cs48
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29453.cs72
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla30317.cs260
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla30324.cs97
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla30353.cs113
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla30651.cs101
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla30835.cs207
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla30935.cs44
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31029.cs126
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31114.cs421
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31145.cs67
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31255.cs88
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31330.cs163
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31333.cs256
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31366.cs85
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31395.cs54
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31602.cs130
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31964.cs116
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31967.xaml18
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31967.xaml.cs47
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32034.cs31
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32040.cs59
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32148.cs240
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32230.cs59
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32447.xaml160
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32447.xaml.cs28
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32462.cs57
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32487.cs50
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32615.cs70
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32691.cs60
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32776.cs20
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32801.cs92
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32842.xaml42
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32842.xaml.cs46
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32847.cs119
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32898.cs74
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32902.cs131
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33268.cs143
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33450.cs47
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33578.cs99
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33612.cs159
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33714.cs86
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33870.cs71
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33890.cs38
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34007.cs91
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34061.cs76
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34072.cs54
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34561.cs89
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34632.cs79
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34720.cs352
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34727.cs30
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34912.cs106
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35078.cs34
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35127.cs22
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35157.cs58
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35294.cs45
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35472.cs88
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35477.cs49
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35490.cs39
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35733.cs58
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35738.cs41
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36009.cs56
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36014.cs16
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36171.cs107
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36393.cs43
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36479.cs43
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36559.cs54
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36649.cs29
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36681.cs88
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36788.cs122
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla37462.cs88
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla37601.cs50
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla37625.cs36
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla37841.cs153
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla37863.cs26
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38105.cs59
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38112.cs98
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38416.xaml27
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38416.xaml.cs48
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38658.cs74
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38827.xaml24
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38827.xaml.cs20
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38978.cs90
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39331.cs71
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39395.cs30
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39461.cs36
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39463.xaml18
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39463.xaml.cs33
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39483.xaml24
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39483.xaml.cs50
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39499.cs134
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39530.cs85
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39624.cs40
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39668.cs51
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/CarouselAsync.cs114
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/ComplexListView.cs111
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/DataTemplateGridImageTest.cs55
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/DefaultColorToggleTest.cs146
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/DisposedSharedPages.cs70
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/InputTransparentIssue.cs37
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/IsPasswordToggleTest.cs38
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/IsShowingUserIssue.cs35
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1025.cs24
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1026.cs91
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1028.cs31
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1075.cs85
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1097.cs60
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1146.cs48
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1219.cs19
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1228.cs67
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1236.cs26
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1259.cs112
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1267.cs65
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1305.cs50
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1329.cs46
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1384.cs40
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1400.cs153
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1461.cs286
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1497.xaml27
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1497.xaml.cs20
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1538.cs28
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1545.xaml16
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1545.xaml.cs129
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1546.cs21
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1549.xaml34
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1549.xaml.cs74
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1554.xaml20
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1554.xaml.cs25
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1557.cs34
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1566.cs91
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1567.cs37
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1568.xaml53
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1568.xaml.cs22
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1583.cs20
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1590.cs123
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1593.cs169
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1598.cs80
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1613.cs64
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1618.cs37
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1641.xaml17
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1641.xaml.cs17
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1644.cs74
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1653.xaml22
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1653.xaml.cs25
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1653v2.xaml20
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1653v2.xaml.cs23
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1664.cs46
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1680.cs106
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1682.cs30
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1685.cs77
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1691.cs77
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1698.cs29
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1700.cs30
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1703.cs63
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1705.cs38
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1712.xaml6
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1712.xaml.cs20
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1722.cs26
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1723.cs53
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1741.xaml6
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1741.xaml.cs27
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1742.cs55
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1747.xaml9
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1747.xaml.cs65
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1755.cs36
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1758.cs68
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1762.cs273
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1763.cs104
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1766.xaml22
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1766.xaml.cs65
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1769.cs81
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1777.cs66
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue181.cs41
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1851.cs92
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1875.cs105
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1888.cs36
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1891.cs81
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1895.cs80
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1898.xaml20
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1898.xaml.cs47
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1905.cs31
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1914.cs27
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue194.cs72
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue198.cs78
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue206.cs143
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue214.cs36
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2143.cs55
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2191.cs51
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2222.cs49
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue22246_BZ.cs49
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2241.cs58
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2248.cs74
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2259.cs156
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2266.cs162
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2270.cs77
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2272.cs54
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2282.xaml32
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2282.xaml.cs42
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2288.xaml10
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2288.xaml.cs40
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2289.xaml36
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2289.xaml.cs119
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue229.cs29
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2291.cs36
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2292.cs39
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2294.cs60
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2333.cs39
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2339.cs66
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2354.cs116
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2357.xaml21
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2357.xaml.cs418
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2411.cs276
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2414.cs97
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2470.xaml29
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2470.xaml.cs155
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2563.cs41
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2594.cs33
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2597.cs61
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue260.cs41
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2615.cs80
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2628.cs31
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2634.cs333
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue264.cs75
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2659.xaml34
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2659.xaml.cs64
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2775.cs116
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2777.xaml23
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2777.xaml.cs132
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2783.cs36
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2794.cs48
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2809.cs50
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2883.cs125
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2923.cs83
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2927.cs105
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2948.cs232
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2951.xaml48
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2951.xaml.cs140
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2953.cs89
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2954.cs58
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2961.cs290
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2963.cs53
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2964.cs101
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2965.cs152
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2976.cs441
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2981.cs37
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2983.cs30
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2987.cs39
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue3086.xaml28
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue3086.xaml.cs31
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue3276.cs91
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue3292.cs83
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue3319.xaml42
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue3319.xaml.cs264
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue342.cs85
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue416.cs41
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue417.cs110
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue465.cs61
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue488.cs45
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue530.cs66
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue764.cs55
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue773.cs174
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue774.cs77
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue852.cs154
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue886.cs71
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue889.cs140
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue892.cs224
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue935.cs83
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue968.cs52
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue973.cs164
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/ListViewViewCellBinding.cs168
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/ModalActivityIndicatorTest.cs150
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/ModelContentPage.cs24
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/NavPage.cs25
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/NavigationStackTests.cs84
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/ScrollViewOutOfBounds.cs59
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/StackLayoutIssue.cs132
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/SwipeBackNavCrash.cs88
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/TabbedPageTests.cs64
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/TabbedPageWithList.cs71
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/TestPages/TestPages.cs223
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems485
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.shproj12
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/_Template.cs35
327 files changed, 26132 insertions, 0 deletions
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/AddingMultipleItemsListView.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/AddingMultipleItemsListView.cs
new file mode 100644
index 00000000..1dbd3ada
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/AddingMultipleItemsListView.cs
@@ -0,0 +1,443 @@
+using System;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Collections.Generic;
+using System.Runtime.CompilerServices;
+using System.Diagnostics;
+using System.Windows.Input;
+
+using Xamarin.Forms;
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using NUnit.Framework;
+using Xamarin.UITest;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+
+ public class PropertyChangedBase : INotifyPropertyChanged
+ {
+ Dictionary<string, object> _properties = new Dictionary<string, object>();
+
+ protected T GetProperty<T>([CallerMemberName] string name = null)
+ {
+ object value = null;
+ if (_properties.TryGetValue(name, out value)) {
+ return value == null ? default(T) : (T)value;
+ }
+ return default(T);
+ }
+
+ protected void SetProperty<T>(T value, [CallerMemberName] string name = null)
+ {
+ if (Equals(value, GetProperty<T>(name))) {
+ return;
+ }
+ _properties[name] = value;
+ OnPropertyChanged(name);
+ }
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
+ {
+ PropertyChangedEventHandler handler = PropertyChanged;
+ if (handler != null) {
+ handler(this, new PropertyChangedEventArgs(propertyName));
+ }
+ }
+ }
+
+ public class ViewModelError
+ {
+ public ViewModelError(string text)
+ {
+ Text = text;
+ }
+
+ public string Text { get; set; }
+
+ public override bool Equals(object obj)
+ {
+ var error = obj as ViewModelError;
+ if (error == null) {
+ return false;
+ }
+ return Text.Equals(error.Text);
+ }
+
+ public override int GetHashCode()
+ {
+ return Text.GetHashCode();
+ }
+
+ public override string ToString()
+ {
+ return string.Format("ViewModelError: {0}", Text);
+ }
+ }
+
+ public class ViewModelBase : PropertyChangedBase
+ {
+ public ViewModelBase()
+ {
+ _errors = new List<ViewModelError>();
+ Validate();
+ }
+
+ readonly List<ViewModelError> _errors;
+
+ public virtual bool IsValid
+ {
+ get { return _errors.Count <= 0; }
+ }
+
+ protected IEnumerable<ViewModelError> Errors
+ {
+ get { return _errors; }
+ }
+
+ public event EventHandler IsValidChanged;
+
+ public event EventHandler IsBusyChanged;
+
+ protected virtual void Validate()
+ {
+ OnPropertyChanged("IsValid");
+ OnPropertyChanged("Errors");
+
+ var callback = IsValidChanged;
+ if (callback != null) {
+ callback(this, EventArgs.Empty);
+ }
+
+ // Spit out errors for easier debugging.
+ if (_errors != null && _errors.Count > 0) {
+ Debug.WriteLine("Errors:");
+ foreach (var error in _errors) {
+ Debug.WriteLine(error);
+ }
+ }
+ }
+
+ protected virtual void ValidateProperty(Func<bool> validate, ViewModelError error)
+ {
+ if (validate()) {
+ _errors.Remove(error);
+ } else if (!_errors.Contains(error)) {
+ _errors.Add(error);
+ }
+ }
+
+ public virtual bool IsBusy
+ {
+ get { return _isBusy; }
+ set
+ {
+ if (_isBusy != value) {
+ _isBusy = value;
+ OnPropertyChanged("IsBusy");
+ OnIsBusyChanged();
+ }
+ }
+ }
+
+ bool _isBusy = false;
+
+ protected virtual void OnIsBusyChanged()
+ {
+ // Some models might want to have a validation thet depends on the busy state.
+ Validate();
+ var method = IsBusyChanged;
+ if (method != null)
+ IsBusyChanged(this, EventArgs.Empty);
+ }
+ }
+
+ public class DelegateCommand : ICommand
+ {
+ readonly Predicate<object> _canExecute;
+ readonly Action<object> _execute;
+
+ public event EventHandler CanExecuteChanged;
+
+ public DelegateCommand(Action<object> execute)
+ : this(execute, null)
+ {
+ }
+
+ public DelegateCommand(Action<object> execute, Predicate<object> canExecute)
+ {
+ _execute = execute;
+ _canExecute = canExecute;
+ }
+
+ public bool CanExecute(object parameter)
+ {
+ if (_canExecute == null) {
+ return true;
+ }
+
+ return _canExecute(parameter);
+ }
+
+ public void Execute(object parameter)
+ {
+ _execute(parameter);
+ }
+
+ public void RaiseCanExecuteChanged()
+ {
+ var handler = CanExecuteChanged;
+ if (handler != null) {
+ handler(this, EventArgs.Empty);
+ }
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class ExampleViewModel : ViewModelBase
+ {
+ [Preserve (AllMembers = true)]
+ public class Job : ViewModelBase
+ {
+
+ public string JobId
+ {
+ get { return GetProperty<string>(); }
+ set { SetProperty(value); }
+ }
+
+ public string JobName
+ {
+ get { return GetProperty<string>(); }
+ set { SetProperty(value); }
+ }
+
+ public double? Hours
+ {
+ get { return GetProperty<double?>(); }
+ set { SetProperty(value); }
+ }
+
+ public bool Locked
+ {
+ get { return GetProperty<bool>(); }
+ set { SetProperty(value); }
+ }
+ }
+
+ public ExampleViewModel()
+ {
+
+ Jobs = new ObservableCollection<Job>()
+ {
+ new Job() { JobId = "3672", JobName = "Big Job", Hours = 2},
+ new Job() { JobId = "6289", JobName = "Smaller Job", Hours = 2},
+ new Job() { JobId = "3672-41", JobName = "Add On Job", Hours = 23},
+ };
+ }
+
+ public ObservableCollection<Job> Jobs { get; set; }
+
+
+ public ICommand AddOneCommand
+ {
+ get
+ {
+ if (_addOneCommand == null) {
+ _addOneCommand = new DelegateCommand(obj => {
+ Jobs.Add(new Job(){JobId = "1234", JobName = "add one", Hours = 12});
+ }, obj => !IsBusy);
+ }
+ return _addOneCommand;
+ }
+ }
+
+ ICommand _addOneCommand;
+
+ public ICommand AddTwoCommand
+ {
+ get
+ {
+ if (_addTwoCommand == null) {
+ _addTwoCommand = new DelegateCommand(obj => {
+ Jobs.Add(new Job() { JobId = "9999", JobName = "add two", Hours = 12 });
+ Jobs.Add(new Job() { JobId = "8888", JobName = "add two", Hours = 12 });
+ }, obj => !IsBusy);
+ }
+ return _addTwoCommand;
+ }
+ }
+
+ ICommand _addTwoCommand;
+
+ public void GetHours()
+ {
+
+ var results = new ObservableCollection<Job>()
+ {
+ new Job() { JobId = "3672", JobName = "RADO", Hours = 2},
+ new Job() { JobId = "6289", JobName = "MGA Life Cycle Flexible Test System", Hours = 2},
+
+ };
+
+ foreach (var x in results)
+ Jobs.Add(x);
+
+ }
+ }
+
+ public class DoubleStringConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
+ {
+ if (null == value || "0" == value.ToString())
+ return string.Empty;
+ return value.ToString();
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
+ {
+ double? returnValue = null;
+ double convertResult;
+ var strvalue = value as string;
+ if (double.TryParse(strvalue, out convertResult))
+ {
+ returnValue = convertResult;
+ }
+ return returnValue;
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.None, 0, "Adding Multiple Items to a ListView", PlatformAffected.All)]
+ public class AddingMultipleItemsListView : TestContentPage
+ {
+ protected override void Init ()
+ {
+ Title = "Hours";
+ var exampleViewModel = new ExampleViewModel();
+ BindingContext = exampleViewModel;
+
+ var listView = new ListView
+ {
+ ItemTemplate = new DataTemplate(typeof(CustomViewCell)),
+ HeightRequest = 400,
+ VerticalOptions = LayoutOptions.Start
+ };
+
+ listView.SetBinding(ListView.ItemsSourceProperty, new Binding("Jobs", BindingMode.TwoWay));
+
+ var addOneJobButton = new Button
+ {
+ Text = "Add One"
+ };
+ addOneJobButton.SetBinding(Button.CommandProperty, new Binding("AddOneCommand"));
+
+ var addTwoJobsButton = new Button
+ {
+ Text = "Add Two"
+ };
+ addTwoJobsButton.SetBinding(Button.CommandProperty, new Binding("AddTwoCommand"));
+
+ var layout = new StackLayout
+ {
+ Orientation = StackOrientation.Vertical,
+ VerticalOptions = LayoutOptions.StartAndExpand,
+ Spacing = 15,
+ Children = {
+ listView,
+ addOneJobButton,
+ addTwoJobsButton
+ }
+ };
+ Content = layout;
+ }
+
+ [Preserve (AllMembers = true)]
+ public class CustomViewCell : ViewCell
+ {
+ public CustomViewCell ()
+ {
+ var jobId = new Label {
+ Font = Font.SystemFontOfSize(20),
+ WidthRequest = 105,
+ VerticalOptions = LayoutOptions.Center,
+
+ HorizontalOptions = LayoutOptions.StartAndExpand
+ };
+ jobId.SetBinding(Label.TextProperty, "JobId");
+
+ var jobName = new Label {
+ VerticalOptions = LayoutOptions.Center,
+ WidthRequest = 175,
+ HorizontalOptions = LayoutOptions.CenterAndExpand,
+ };
+ jobName.SetBinding(Label.TextProperty, "JobName");
+
+ var hours = new Label {
+ WidthRequest = 45,
+ VerticalOptions = LayoutOptions.Center,
+ XAlign = TextAlignment.End,
+ HorizontalOptions = LayoutOptions.EndAndExpand,
+
+ };
+ hours.SetBinding(Label.TextProperty, new Binding("Hours", BindingMode.OneWay, new DoubleStringConverter()));
+
+ var hlayout = new StackLayout {
+ Children = {
+ jobId,
+ jobName,
+ hours
+ },
+ Orientation = StackOrientation.Horizontal,
+ };
+
+ View = hlayout;
+ }
+ }
+
+#if UITEST
+ [Test]
+ public void AddingMultipleListViewTests1AllElementsPresent ()
+ {
+ RunningApp.WaitForElement (q => q.Marked ("Big Job"));
+ RunningApp.WaitForElement (q => q.Marked ("Smaller Job"));
+ RunningApp.WaitForElement (q => q.Marked ("Add On Job"));
+ RunningApp.WaitForElement (q => q.Marked ("Add One"));
+ RunningApp.WaitForElement (q => q.Marked ("Add Two"));
+ RunningApp.WaitForElement (q => q.Marked ("3672"));
+ RunningApp.WaitForElement (q => q.Marked ("6289"));
+ RunningApp.WaitForElement (q => q.Marked ("3672-41"));
+ RunningApp.WaitForElement (q => q.Marked ("2"));
+ RunningApp.WaitForElement (q => q.Marked ("2"));
+ RunningApp.WaitForElement (q => q.Marked ("23"));
+
+ RunningApp.Screenshot ("All elements are present");
+ }
+
+ [Test]
+ public void AddingMultipleListViewTests2AddOneElementToList ()
+ {
+ RunningApp.Tap (q => q.Marked ("Add One"));
+
+ RunningApp.WaitForElement (q => q.Marked ("1234"), timeout: TimeSpan.FromSeconds (2));
+ RunningApp.Screenshot ("One more element exists");
+ }
+
+ [Test]
+ public void AddingMultipleListViewTests3AddTwoElementToList ()
+ {
+ RunningApp.Screenshot ("Click 'Add Two'");
+ RunningApp.Tap (q => q.Marked ("Add Two"));
+
+ RunningApp.WaitForElement (q => q.Marked ("9999"), timeout: TimeSpan.FromSeconds (2));
+ RunningApp.WaitForElement (q => q.Marked ("8888"), timeout: TimeSpan.FromSeconds (2));
+ RunningApp.Screenshot ("Two more element exist");
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/AppBarIconColors.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/AppBarIconColors.cs
new file mode 100644
index 00000000..fffe5ecf
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/AppBarIconColors.cs
@@ -0,0 +1,52 @@
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve(AllMembers = true)]
+ [Issue(IssueTracker.None, 0, "[UWP] Modal NavigationPage ignores BarTextColor settings for icons", PlatformAffected.WinRT)]
+ public class AppBarIconColors : TestNavigationPage
+ {
+ protected override void Init()
+ {
+ var firstPage = new ContentPage() { Title = "Page One" };
+
+ var button = new Button { Text = "Push Modal Page" };
+
+ firstPage.Content = new StackLayout { Children = { new Label { Text = "Click the 'push modal page' button" }, button } };
+
+ var otherButton = new Button() { Text = "back" };
+ otherButton.Clicked += (sender, args) => Navigation.PopModalAsync();
+
+ var page = new ContentPage {
+ Title = "Page Two",
+ Content =
+ new StackLayout {
+ Children = {
+ new Label {
+ Text =
+ "This is a modal page. The 'X' icon, the 'Done' label below it, and the '...' in the toolbar should all be white on UWP. If any of them are not white, this test has failed."
+ },
+ otherButton
+ }
+ }
+ };
+ page.ToolbarItems.Add(new ToolbarItem("Done", "toolbar_close.png", () => { Navigation.PopModalAsync(); }));
+
+ button.Clicked += (sender, args) => Navigation.PushModalAsync(new NavigationPageWithAppBarColors(page));
+
+ PushAsync(new NavigationPageWithAppBarColors(firstPage));
+ }
+ }
+
+ [Preserve(AllMembers = true)]
+ public class NavigationPageWithAppBarColors : NavigationPage
+ {
+ public NavigationPageWithAppBarColors(Page root) : base(root)
+ {
+ BarBackgroundColor = Color.Purple;
+ BarTextColor = Color.White;
+ Title = root.Title;
+ Icon = root.Icon;
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla21368.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla21368.cs
new file mode 100644
index 00000000..88d9d2ac
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla21368.cs
@@ -0,0 +1,90 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls.TestCasesPages
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Bugzilla, 21368, "Button text alignment breaks if the buttons are in a stack layout inside another layout and the button is clicked", PlatformAffected.Android)]
+ public class Bugzilla21368 : ContentPage
+ {
+ ScrollView _scrollView;
+ StackLayout _buttonsStack;
+ Grid _buttonsGrid;
+
+ public Bugzilla21368 ()
+ {
+ _scrollView = new ScrollView {
+ Orientation = ScrollOrientation.Horizontal,
+ Content = new StackLayout {
+ Orientation = StackOrientation.Horizontal
+ },
+ HeightRequest = 100
+ };
+
+ _buttonsGrid = new Grid {
+ RowSpacing = 10
+ };
+
+ _buttonsGrid.Children.Add (_scrollView, 0, 0);
+ _buttonsGrid.Children.Add (new Button {
+ Text = "Add Control",
+ Command = new Command (OnAddControl),
+ WidthRequest=400
+ }, 0, 1);
+ _buttonsGrid.Children.Add (new Button {
+ Text = "Insert Control",
+ Command = new Command (OnInsertControl)
+ }, 0, 2);
+ _buttonsGrid.Children.Add (new Button {
+ Text = "Remove Control",
+ Command = new Command (OnRemoveControl)
+ }, 0, 3);
+ _buttonsStack = new StackLayout { Children = { _buttonsGrid } };
+
+ Content = new StackLayout {
+ Orientation = StackOrientation.Vertical,
+ Children =
+ {
+ _buttonsStack
+ }
+ };
+ }
+
+ StackLayout ScrollStackLayout
+ {
+ get { return (StackLayout) _scrollView.Content; }
+ }
+
+ void OnAddControl ()
+ {
+ ScrollStackLayout.Children.Add (new Button { Text = "hello" });
+ ForceRelayout ();
+ }
+
+ void OnInsertControl ()
+ {
+ ScrollStackLayout.Children.Insert (0, new Button {
+ Text = "hello"
+ });
+ ForceRelayout ();
+ }
+
+ void OnRemoveControl ()
+ {
+ if (ScrollStackLayout.Children.Count > 0) {
+ ScrollStackLayout.Children.RemoveAt (0);
+ ForceRelayout ();
+ }
+ }
+
+ void ForceRelayout ()
+ {
+ ScrollStackLayout.ForceLayout ();
+ _scrollView.ForceLayout ();
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla21501.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla21501.cs
new file mode 100644
index 00000000..a9b896a5
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla21501.cs
@@ -0,0 +1,47 @@
+using System;
+using Xamarin.Forms.CustomAttributes;
+using System.Collections.Generic;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Bugzilla, 21501, "ListView: Button in ItemTemplate breaks SelectedItem",PlatformAffected.Android)]
+ public class Bugzilla21501 : ContentPage
+ {
+ public Bugzilla21501 ()
+ {
+ var stringList = new List<string> () { "abc", "xyz", "todo" };
+
+ var resultLabel = new Label () { Text = "A" };
+
+ var listView = new ListView ();
+ listView.ItemsSource = stringList;
+ listView.ItemTemplate = new DataTemplate (() => {
+ var label = new Label ();
+ label.SetBinding (Label.TextProperty, ".");
+
+ var button = new Button () { Text = "Test" };
+
+ return new ViewCell {
+ View = new StackLayout {
+ Padding = new Thickness (0, 5),
+ Orientation = StackOrientation.Horizontal,
+ Children = { label, button }
+ }
+ };
+ });
+
+ listView.ItemSelected += (sender, args) => {
+ resultLabel.Text = resultLabel.Text + "!";
+ };
+
+ var layout = new StackLayout () {
+ Orientation = StackOrientation.Vertical,
+ Children = { listView, resultLabel }
+ };
+
+ Content = layout;
+ }
+ }
+}
+
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla21780.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla21780.cs
new file mode 100644
index 00000000..70283c45
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla21780.cs
@@ -0,0 +1,19 @@
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Bugzilla, 21780, "Windows Phone Editor control has black background with black text, background turns to white when editing", PlatformAffected.WinPhone)]
+ public class Bugzilla21780 : ContentPage
+ {
+ public Bugzilla21780 ()
+ {
+ var label = new Label () { Text = "If text is visible in the editor below, this test has passed." };
+ var editor = new Editor () { Text = "This text should be visible even if the editor does not have focus" };
+
+ Content = new StackLayout() {
+ Children = { label, editor }
+ };
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla22229.xaml b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla22229.xaml
new file mode 100644
index 00000000..1f4c96d4
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla22229.xaml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+ x:Class="Xamarin.Forms.Controls.Bugzilla22229" CurrentPageChanged="OnCurrentPageChanged" Title="Test Page">
+ <TabbedPage.Children>
+ <ContentPage Title="Tab 1"/>
+ <ContentPage Title="Tab 2"/>
+ <ContentPage Title="Tab 3"/>
+ <ContentPage Title="Tab 4"/>
+ <ContentPage Title="Tab 5"/>
+ </TabbedPage.Children>
+</TabbedPage> \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla22229.xaml.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla22229.xaml.cs
new file mode 100644
index 00000000..10b6e8ad
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla22229.xaml.cs
@@ -0,0 +1,51 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+#if APP
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 22229, "ToolbarItems not clearing", PlatformAffected.iOS | PlatformAffected.WinPhone, NavigationBehavior.PushAsync)]
+ public partial class Bugzilla22229 : TabbedPage
+ {
+ string _prefix;
+
+ public Bugzilla22229()
+ {
+ InitializeComponent();
+ _prefix = Device.OnPlatform(
+ iOS: "Images/",
+ Android: "",
+ WinPhone: "Assets/"
+ );
+ InitializeActionBar();
+ }
+
+
+ public void OnCurrentPageChanged(object sender, EventArgs e)
+ {
+ InitializeActionBar();
+ }
+
+ void InitializeActionBar()
+ {
+ ToolbarItems.Clear();
+ if (CurrentPage == Children[0])
+ {
+ ToolbarItems.Add(new ToolbarItem("Action 1", null, () => { }, ToolbarItemOrder.Primary, 1));
+ ToolbarItems.Add(new ToolbarItem("Action 2", null, () => { }, ToolbarItemOrder.Primary, 2));
+
+ ToolbarItems.Add(new ToolbarItem("Action 3", null, () => { }, ToolbarItemOrder.Secondary, 3));
+ ToolbarItems.Add(new ToolbarItem("Action 4", null, () => { }, ToolbarItemOrder.Secondary, 4));
+ ToolbarItems.Add(new ToolbarItem("Action 5", null, () => { }, ToolbarItemOrder.Secondary, 5));
+ }
+
+ }
+ }
+#endif
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla22401.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla22401.cs
new file mode 100644
index 00000000..c19b3c92
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla22401.cs
@@ -0,0 +1,114 @@
+using System.Collections.Generic;
+using System.Linq;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls.TestCasesPages
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Bugzilla, 22401, "MasterDetailPage detail width broken when landscape", PlatformAffected.iOS, NavigationBehavior.PushAsync)]
+ public class Bugzilla22401 : MasterDetailPage
+ {
+ public Bugzilla22401()
+ {
+ List<Person> people = GetDemoData ();
+
+ // Create the ListView.
+ var listView = new ListView {
+ // Source of data items.
+ ItemsSource = people,
+
+ // Define template for displaying each item.
+ // (Argument of DataTemplate constructor is called for
+ // each item; it must return a Cell derivative.)
+ ItemTemplate = new DataTemplate (() => {
+ // Create views with bindings for displaying each property.
+ Label nameLabel = new Label();
+ nameLabel.SetBinding (Label.TextProperty, "Name");
+
+ // Return an assembled ViewCell.
+ return new ViewCell {
+ View = new StackLayout {
+ Padding = new Thickness(0, 5),
+ Orientation = StackOrientation.Horizontal,
+ Children = {
+ new StackLayout {
+ VerticalOptions = LayoutOptions.Center,
+ Spacing = 0,
+ Children = {
+ nameLabel
+ }
+ }
+ }
+ }
+ };
+ })
+ };
+
+ Master = new ContentPage { Title = "master", Icon = "menuIcon.png", Content = listView };
+
+ listView.ItemSelected += (sender, e) => {
+ Detail = CreateDetailPage (string.Format("Page {0}", (e.SelectedItem as Person).Name));
+ IsPresented = false;
+ };
+ listView.SelectedItem = people.First ();
+ }
+
+ static List<Person> GetDemoData()
+ {
+ List<Person> people = new List<Person> {
+ new Person("Abigail"),
+ new Person("Bob"),
+ new Person("Cathy"),
+ new Person("David"),
+ new Person("Eugenie"),
+ new Person("Freddie"),
+ new Person("Greta"),
+ new Person("Harold"),
+ new Person("Irene"),
+ new Person("Jonathan"),
+ new Person("Kathy"),
+ new Person("Larry"),
+ new Person("Monica"),
+ new Person("Nick"),
+ new Person("Olive"),
+ new Person("Pendletonlow"),
+ new Person("Queenie"),
+ new Person("Rob"),
+ new Person("Sally"),
+ new Person("Timothy"),
+ new Person("Uma"),
+ new Person("Victor"),
+ new Person("Wendy"),
+ new Person("Xavier"),
+ new Person("Yvonne"),
+ new Person("Zachary"),
+ };
+ return people;
+ }
+
+ static Page CreateDetailPage(string text)
+ {
+ var page = new ContentPage {
+ Title = text,
+ Content = new StackLayout {
+ Children = {
+ new Label {
+ Text = text,
+ VerticalOptions = LayoutOptions.CenterAndExpand,
+ HorizontalOptions = LayoutOptions.CenterAndExpand,
+ }
+ }
+ }
+ };
+
+ var tbiBank = new ToolbarItem { Command = new Command (() => { }), Icon = "bank.png" };
+ var tbiCalc = new ToolbarItem { Command = new Command (() => { }), Icon = "calculator.png" };
+
+ page.ToolbarItems.Add (tbiBank);
+ page.ToolbarItems.Add (tbiCalc);
+
+ return new NavigationPage (page);
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla24574.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla24574.cs
new file mode 100644
index 00000000..b6d3c508
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla24574.cs
@@ -0,0 +1,50 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 24574, "Tap Double Tap")]
+ public class Issue24574 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ protected override void Init ()
+ {
+ var label = new Label {
+ AutomationId = "TapLabel",
+ Text = "123"
+ };
+
+ var rec = new TapGestureRecognizer () { NumberOfTapsRequired = 1 };
+ rec.Tapped += (s, e) => { label.Text = "Single"; };
+ label.GestureRecognizers.Add (rec);
+
+ rec = new TapGestureRecognizer () { NumberOfTapsRequired = 2 };
+ rec.Tapped += (s, e) => { label.Text = "Double"; };
+ label.GestureRecognizers.Add (rec);
+
+ Content = label;
+ }
+
+#if UITEST
+ [Test]
+ public void Issue1Test ()
+ {
+ RunningApp.Screenshot ("I am at Issue 24574");
+
+ RunningApp.WaitForElement (q => q.Marked ("TapLabel"));
+
+ RunningApp.Tap (q => q.Marked ("TapLabel"));
+ RunningApp.WaitForElement (q => q.Marked ("Single"));
+
+ RunningApp.DoubleTap (q => q.Marked ("TapLabel"));
+ RunningApp.WaitForElement (q => q.Marked ("Double"));
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla24769.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla24769.cs
new file mode 100644
index 00000000..699887bf
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla24769.cs
@@ -0,0 +1,80 @@
+using System.Collections.Generic;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 24769, "Layout cycle when Progress Bar is in a ListView", PlatformAffected.WinPhone | PlatformAffected.WinRT)]
+ public class Bugzilla24769 : TestContentPage
+ {
+ protected override void Init ()
+ {
+ var instructions = new Label () {
+ Text = @"Click the button labeled 'Progress++' three times. Each time, all four ProgressBar controls should increment. If they do not increment, the test has failed."
+ };
+
+ var items = new List<ListItem> {
+ new ListItem { Name = "Item1" },
+ new ListItem { Name = "Item2" },
+ new ListItem { Name = "Item3" }
+ };
+
+ var btn = new Button {
+ Text = "Progress++"
+ };
+
+ var progressBar = new ProgressBar { Progress = 0.1 };
+
+ btn.Clicked += (sender, arg) => {
+ MessagingCenter.Send (this, "set_progress");
+ progressBar.Progress += 0.1;
+ };
+
+ var list = new ListView {
+ ItemsSource = items,
+ ItemTemplate = new DataTemplate (typeof(ListCell))
+ };
+
+ BackgroundColor = Color.Maroon;
+
+ Content = new StackLayout {
+ VerticalOptions = LayoutOptions.Fill,
+ HorizontalOptions = LayoutOptions.Fill,
+ Children = {
+ instructions,
+ btn,
+ progressBar,
+ list
+ }
+ };
+ }
+ }
+
+ internal class ListCell : ViewCell
+ {
+ public ListCell ()
+ {
+ var label = new Label ();
+ label.SetBinding (Label.TextProperty, "Name");
+
+ var progress = new ProgressBar { Progress = 0.1 };
+
+ MessagingCenter.Subscribe<Bugzilla24769> (this, "set_progress", sender => { progress.Progress += 0.1; });
+
+ View =
+ new StackLayout {
+ HorizontalOptions = LayoutOptions.Fill,
+ BackgroundColor = Color.Gray,
+ Children = {
+ label,
+ progress
+ }
+ };
+ }
+ }
+
+ internal class ListItem
+ {
+ public string Name { get; set; }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla25662.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla25662.cs
new file mode 100644
index 00000000..6a34cdf7
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla25662.cs
@@ -0,0 +1,35 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls.Issues
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 25662, "Setting IsEnabled does not disable SwitchCell")]
+ public class Bugzilla25662 : ContentPage
+ {
+ class MySwitch : SwitchCell
+ {
+ public MySwitch ()
+ {
+ IsEnabled = false;
+ }
+ }
+
+
+ public Bugzilla25662 ()
+ {
+ var list = new ListView {
+ ItemsSource = new[] {
+ "One", "Two", "Three"
+ },
+ ItemTemplate = new DataTemplate (typeof (MySwitch))
+ };
+
+ Content = list;
+ Title = "My page";
+
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla25979.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla25979.cs
new file mode 100644
index 00000000..277ac684
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla25979.cs
@@ -0,0 +1,133 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 25979, "https://bugzilla.xamarin.com/show_bug.cgi?id=25979")]
+ public class Bugzilla25979 : TestNavigationPage // or TestMasterDetailPage, etc ...
+ {
+ [Preserve (AllMembers = true)]
+ internal sealed class MyPage : ContentPage
+ {
+ public MyPage()
+ {
+ Title = "Page 1";
+ AutomationId = "PageOneId";
+
+ var b = new Button {
+ AutomationId = "PageOneButtonId",
+ Text = "Next"
+ };
+ b.Clicked += async (sender, e) => {
+ await Navigation.PushAsync (new MyPage2());
+ };
+
+ Content = new StackLayout {
+ BackgroundColor = Color.Red,
+ Children = {
+ new Label { Text = "Page 1", FontSize=Device.GetNamedSize(NamedSize.Large, typeof(Label)) },
+ b
+ }
+ };
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ internal sealed class MyPage2 : ContentPage
+ {
+ public MyPage2()
+ {
+ Title = "Page 2";
+ AutomationId = "PageTwoId";
+
+ var b = new Button {
+ AutomationId = "PageTwoButtonId",
+ Text = "Next"
+ };
+ b.Clicked += async (sender, e) => {
+ await Navigation.PushAsync (new MyPage3());
+ Navigation.NavigationStack[0].BindingContext = null;
+ Navigation.RemovePage(Navigation.NavigationStack[0]);
+ };
+
+ Content = new StackLayout {
+ BackgroundColor = Color.Red,
+ Children = {
+ new Label { Text = "Page 2", FontSize=Device.GetNamedSize(NamedSize.Large, typeof(Label)) },
+ b
+ }
+ };
+ }
+
+ protected override void OnAppearing ()
+ {
+ base.OnAppearing();
+ Navigation.NavigationStack[0].BindingContext = null;
+ Navigation.RemovePage(Navigation.NavigationStack[0]);
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ internal sealed class MyPage3 : ContentPage
+ {
+ public MyPage3 ()
+ {
+ AutomationId = "PageThreeId";
+ Title = "PageThreeId";
+
+ var label = new Label { Text = "Page 3" };
+
+ Content = new StackLayout {
+ Children = {
+ label,
+ new Button {
+ AutomationId = "PopButton",
+ Text = "Try to Pop",
+ Command = new Command(
+ async() => {
+ await Navigation.PopAsync();
+ label.Text = "PopAttempted";
+ }
+ )}
+ }
+ };
+ }
+ }
+
+ protected override void Init ()
+ {
+ // Initialize ui here instead of ctor
+ Navigation.PushAsync (new MyPage () { Title="Navigation Stack" });
+ }
+
+#if UITEST
+ [Test]
+ public void Bugzilla25979Test ()
+ {
+ RunningApp.WaitForElement (q => q.Marked ("PageOneId"));
+ RunningApp.Screenshot ("At page one");
+ RunningApp.WaitForElement (q => q.Marked ("PageOneButtonId"));
+ RunningApp.Tap (q => q.Marked ("PageOneButtonId"));
+
+ RunningApp.WaitForElement (q => q.Marked ("PageTwoId"));
+ RunningApp.Screenshot ("At page two - I didn't crash");
+ RunningApp.WaitForElement (q => q.Marked ("PageTwoButtonId"));
+ RunningApp.Tap (q => q.Marked ("PageTwoButtonId"));
+
+ RunningApp.WaitForElement (q => q.Marked ("PageThreeId"));
+ RunningApp.Screenshot ("At page three - I didn't crash");
+
+ RunningApp.WaitForElement (q => q.Marked ("PopButton"));
+ RunningApp.Tap (q => q.Marked ("PopButton"));
+ RunningApp.WaitForElement (q => q.Marked ("PopAttempted"));
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26032.xaml b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26032.xaml
new file mode 100644
index 00000000..748942a5
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26032.xaml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<local:TestContentPage xmlns="http://xamarin.com/schemas/2014/forms"
+ xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+ xmlns:local="clr-namespace:Xamarin.Forms.Controls"
+ x:Class="Xamarin.Forms.Controls.Bugzilla26032">
+ <RelativeLayout>
+ <ListView x:Name="List1"
+ RelativeLayout.XConstraint="{ConstraintExpression Type=Constant, Constant=0}"
+ RelativeLayout.YConstraint="{ConstraintExpression Type=Constant, Constant=0}"
+ RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToParent, Property=Width, Factor=0.5}"
+ RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativeToParent, Property=Height, Factor=0.7}"
+
+ ItemTapped="OnItemTapped"
+ ItemSelected="OnItemSelected"
+ >
+ <ListView.ItemTemplate>
+ <DataTemplate>
+ <TextCell Text="{Binding}" />
+ </DataTemplate>
+ </ListView.ItemTemplate>
+ </ListView>
+
+ <ListView x:Name="List2"
+ RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToParent, Property=Width, Factor=0.5}"
+ RelativeLayout.YConstraint="{ConstraintExpression Type=Constant, Constant=0}"
+ RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToParent, Property=Width, Factor=0.5}"
+ RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativeToParent, Property=Height, Factor=0.7}"
+
+ ItemTapped="OnItemTapped"
+ ItemSelected="OnItemSelected"
+ >
+ <ListView.ItemTemplate>
+ <DataTemplate>
+ <TextCell Text="{Binding}">
+ <TextCell.ContextActions>
+ <MenuItem Text="Delete" IsDestructive="True" />
+ </TextCell.ContextActions>
+ </TextCell>
+ </DataTemplate>
+ </ListView.ItemTemplate>
+ </ListView>
+
+ <ScrollView
+ RelativeLayout.XConstraint="{ConstraintExpression Type=Constant, Constant=0}"
+ RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToParent, Property=Height, Factor=0.7}"
+ RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToParent, Property=Width}"
+ RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativeToParent, Property=Height, Factor=0.3}">
+ <Label x:Name="Log" />
+ </ScrollView>
+ </RelativeLayout>
+</local:TestContentPage> \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26032.xaml.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26032.xaml.cs
new file mode 100644
index 00000000..e45e6bb3
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26032.xaml.cs
@@ -0,0 +1,75 @@
+using System;
+using System.Collections.Generic;
+
+using Xamarin.Forms;
+using Xamarin.Forms.CustomAttributes;
+
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 26032, " ListView ItemTapped doesn't get called for the selected item ", PlatformAffected.iOS)]
+ public partial class Bugzilla26032 : TestContentPage
+ {
+ #if APP
+ public Bugzilla26032 ()
+ {
+
+ InitializeComponent ();
+ var data = new[] { "1", "2", "3", "4", "5" };
+ var dataContext = new[] { "1 Context", "2 Context", "3 Context", "4 Context", "5 Context" };
+ List1.ItemsSource = data;
+ List2.ItemsSource = dataContext;
+ }
+
+
+ public void OnItemTapped(object sender, ItemTappedEventArgs e)
+ {
+ Log.Text = string.Format("Item '{0}' tapped\n{1}", e.Item, Log.Text);
+ }
+
+ public void OnItemSelected(object sender, SelectedItemChangedEventArgs e)
+ {
+ Log.Text = string.Format("Item '{0}' selected\n{1}", e.SelectedItem, Log.Text);
+ }
+
+ #endif
+
+ protected override void Init ()
+ {
+ }
+
+
+ #if UITEST
+ [Test]
+ public void SelectedItemTap ()
+ {
+ var id = "1";
+ var idContext = "1 Context";
+ var initalLog = "Item '{0}' tapped\nItem '{0}' selected\n";
+
+ var forId1 = string.Format (initalLog, id);
+ RunningApp.WaitForElement (q => q.Marked (id));
+ RunningApp.Tap (q => q.Marked (id));
+ RunningApp.WaitForElement (q => q.Text (forId1));
+ RunningApp.Tap (q => q.Marked (id));
+ forId1 = string.Format ( "Item '{0}' tapped\n" + initalLog, id);
+ RunningApp.WaitForElement (q => q.Text (forId1));
+
+ var forIdContext = string.Format (initalLog, idContext);
+ RunningApp.WaitForElement (q => q.Marked (idContext));
+ RunningApp.Tap (q => q.Marked (idContext));
+ RunningApp.WaitForElement (q => q.Text (forIdContext + forId1));
+ RunningApp.Tap (q => q.Marked (idContext));
+ forIdContext = string.Format ( "Item '{0}' tapped\n" + initalLog, idContext);
+ RunningApp.WaitForElement (q => q.Text (forIdContext + forId1));
+ }
+ #endif
+ }
+}
+
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26171.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26171.cs
new file mode 100644
index 00000000..6ad49179
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26171.cs
@@ -0,0 +1,98 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+using Xamarin.Forms.Maps;
+using System.Threading.Tasks;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 26171, "Xamarin.Forms.Maps is not updating VisibleRegion property when layout is changed")]
+ public class Bugzilla26171 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ protected override void Init ()
+ {
+ var map = MakeMap ();
+
+ var label = new Label { AutomationId = "lblValue" };
+
+ var buttonLayout = new Button { Text = "Change layout" };
+ buttonLayout.Clicked += async (a, e) => {
+ map.VerticalOptions = LayoutOptions.Start;
+ await Print (map,label);
+ };
+
+ var stack = new StackLayout {
+ Spacing = 0,
+ Padding = new Thickness (30, 0)
+ };
+
+ stack.Children.Add (label);
+ stack.Children.Add (map);
+ stack.Children.Add (buttonLayout);
+
+ Content = new ScrollView { Content = stack };
+
+ Appearing += async (sender, e) => await Print (map, label);
+
+ }
+
+ static async Task Print (Map map, Label label)
+ {
+ await Task.Delay(500);
+ if (map.VisibleRegion != null) {
+ label.Text = map.VisibleRegion.Radius.Kilometers.ToString ();
+ }
+ }
+
+ public static Map MakeMap ()
+ {
+ Pin colosseum = null;
+ Pin pantheon = null;
+ Pin chapel = null;
+
+ var map = new Map {
+ IsShowingUser = false,
+ VerticalOptions = LayoutOptions.FillAndExpand,
+ HeightRequest = 100,
+ Pins = {
+ (colosseum = new Pin {
+ Type = PinType.Place,
+ Position = new Position (41.890202, 12.492049),
+ Label = "Colosseum",
+ Address = "Piazza del Colosseo, 00184 Rome, Province of Rome, Italy"
+ }),
+ (pantheon = new Pin {
+ Type = PinType.Place,
+ Position = new Position (41.898652, 12.476831),
+ Label = "Pantheon",
+ Address = "Piazza della Rotunda, 00186 Rome, Province of Rome, Italy"
+ }),
+ (chapel = new Pin {
+ Type = PinType.Place,
+ Position = new Position (41.903209, 12.454545),
+ Label = "Sistine Chapel",
+ Address = "Piazza della Rotunda, 00186 Rome, Province of Rome, Italy"
+ })
+ }
+ };
+
+ return map;
+ }
+
+#if UITEST
+ [Test]
+ public void Bugzilla26171Test ()
+ {
+ RunningApp.WaitForElement (q => q.Marked ("lblValue"));
+ var value = RunningApp.Query (q => q.Marked ("lblValue")) [0].Text;
+ RunningApp.Screenshot ("I see the Label");
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26233.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26233.cs
new file mode 100644
index 00000000..0a9f3fdc
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26233.cs
@@ -0,0 +1,56 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 26233, "Windows phone crashing when going back to page containing listview with Frame inside ViewCell")]
+ public class Bugzilla26233 : TestContentPage
+ {
+ protected override void Init ()
+ {
+ var listview = new ListView ();
+ listview.ItemTemplate = new DataTemplate (typeof (ItemTemplate));
+ listview.ItemsSource = new string[] { "item", "item", "item", "item", "item" };
+ var btnBack = new Button { Text = "back", Command = new Command (() => Navigation.PopAsync ()) };
+ listview.ItemSelected += (s, e) => Navigation.PushAsync (new ContentPage { Content = btnBack });
+ var btnPush = new Button {
+ Text = "Next",
+ AutomationId = "btnPush",
+ Command = new Command (() => Navigation.PushAsync (new ContentPage { Content = btnBack }))
+ };
+
+ Content = new StackLayout { Children = { btnPush, listview } };
+ }
+
+ [Preserve (AllMembers = true)]
+ internal class ItemTemplate : ViewCell
+ {
+ public ItemTemplate ()
+ {
+ var frame = new Frame ();
+ frame.Content = new StackLayout { Children = { new Label { Text = "hello 1" } } };
+ View = frame;
+ }
+ }
+
+#if UITEST
+ [Test]
+ public void DoesntCrashOnNavigatingBackToThePage ()
+ {
+ RunningApp.WaitForElement (q => q.Marked ("btnPush"));
+ RunningApp.Tap (q => q.Marked ("btnPush"));
+ RunningApp.WaitForElement (q => q.Marked ("back"));
+ RunningApp.Screenshot ("I see the back button");
+ RunningApp.Tap (q => q.Marked ("back"));
+ RunningApp.WaitForElement (q => q.Marked ("btnPush"));
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26501.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26501.cs
new file mode 100644
index 00000000..2ab31f0a
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26501.cs
@@ -0,0 +1,150 @@
+using System;
+using System.Collections.Generic;
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using NUnit.Framework;
+using Xamarin.UITest;
+#endif
+
+namespace Xamarin.Forms.Controls.TestCasesPages
+{
+ [Preserve (AllMembers = true)]
+ public class FamilyViewModel
+ {
+ public Guid ProfileId { get; set; }
+ public string DisplayName { get; set; }
+ public string ImageFilename { get; set; }
+ public string BonusBalance { get; set; }
+ public string MemberNo { get; set; }
+
+ public FamilyViewModel ()
+ {
+ ProfileId = Guid.Empty;
+ DisplayName = "";
+ BonusBalance = "";
+ MemberNo = "";
+ ImageFilename = "";
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class FamilyCell : ViewCell
+ {
+ public Label FamilyLabel;
+
+ public FamilyCell ()
+ {
+ FamilyLabel = new Label ();
+
+ var l1 = new RelativeLayout ();
+
+ l1.Children.Add (FamilyLabel,
+ Constraint.Constant (50),
+ Constraint.Constant (4),
+ Constraint.RelativeToParent (p => p.Width - 10 - 50 - 85)
+ );
+
+
+ View = l1;
+
+ FamilyLabel.SetBinding (Label.TextProperty, "DisplayName");
+
+ // COMMENT LINE BELOW OUT TO MAKE IT WORK!
+ AddContextActions ();
+ }
+
+ void AddContextActions ()
+ {
+ ContextActions.Add (new MenuItem () {
+ Text = "Delete",
+ IsDestructive = true,
+ Command = new Command (Delete)
+ });
+
+ ContextActions.Add (new MenuItem () {
+ Text = "More",
+ IsDestructive = false,
+ Command = new Command (More)
+ });
+ }
+
+ void Delete ()
+ {
+ }
+
+ void More ()
+ {
+ }
+ }
+
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Bugzilla, 26501, "BindingSource / Context action issue", PlatformAffected.iOS)]
+ public class Bugzilla26501 : TestContentPage
+ {
+ protected override void Init ()
+ {
+ //TODO: Multilanguage
+ Title = "Context Action Bug";
+
+ _familyListView = new ListView () {
+ RowHeight = 50,
+ ItemTemplate = new DataTemplate (typeof (FamilyCell)),
+ HasUnevenRows = true
+ };
+
+ //TODO: Multilanguage
+ ToolbarItems.Add (new ToolbarItem ("Refresh", "", () => {
+ _familyListView.ItemsSource = _demoDataSource2;
+ }));
+
+
+ _familyListView.ItemSelected += (sender, e) => _familyListView.SelectedItem = null;
+
+ Content = _familyListView;
+
+ UpdateData ();
+ }
+
+ readonly FamilyViewModel[] _demoDataSource = new FamilyViewModel[] {
+ new FamilyViewModel {DisplayName = "ZOOMER robothund"},
+ new FamilyViewModel {DisplayName = "FROST sengetj"},
+ new FamilyViewModel {DisplayName = "BEADOS Quick Dry designstation"},
+ new FamilyViewModel {DisplayName = "Redningsstation i junglen"},
+ };
+
+ readonly FamilyViewModel[] _demoDataSource2 = new FamilyViewModel[] {
+ new FamilyViewModel {DisplayName = "ZOOMER robothund"},
+ new FamilyViewModel {DisplayName = "FROST sengetj"},
+ new FamilyViewModel {DisplayName = "BEADOS Quick Dry designstation"},
+ new FamilyViewModel {DisplayName = "Redningsstation i junglen"},
+ new FamilyViewModel {DisplayName = "CHAMPIONS LEAGUE 2014/15 boosterpakke"},
+ new FamilyViewModel {DisplayName = "NEW BORN BABY luksusske med dukke"},
+ new FamilyViewModel {DisplayName = "FURBY Boom Festive Sweater elektronisk plysdyr"},
+ new FamilyViewModel {DisplayName = "LEGO FRIENDS 41007 Heartlake hundesalon"},
+ new FamilyViewModel {DisplayName = "LEGO CITY 4204 Minen"}
+ };
+
+ ListView _familyListView;
+
+ List<FamilyViewModel> _itemSource;
+
+ void UpdateData ()
+ {
+ Device.BeginInvokeOnMainThread (() => _familyListView.ItemsSource = _demoDataSource);
+ }
+
+#if UITEST
+ [Test]
+ public void TestCellsShowAfterRefresh ()
+ {
+ RunningApp.Tap (q => q.Marked ("Refresh"));
+
+ // make sure the refresh has completed
+ System.Threading.Thread.Sleep (1);
+
+ RunningApp.WaitForElement (q => q.Marked ("ZOOMER robothund"));
+ }
+#endif
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26868.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26868.cs
new file mode 100644
index 00000000..ca744500
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26868.cs
@@ -0,0 +1,105 @@
+using System.Collections.Generic;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 26868, "GroupHeaders do not extend on Windows Phone")]
+ public class Bugzilla26868 : TestContentPage
+ {
+ protected override void Init ()
+ {
+ List<GroupedData> groups = new List<GroupedData> ();
+
+ var group1 = new GroupedData { GroupName = "Group #1" };
+ group1.Add (new GroupItem { DisplayText = "Text for ListView item 1.1" });
+ group1.Add (new GroupItem { DisplayText = "Text for ListView item 1.2" });
+ groups.Add (group1);
+
+ var group2 = new GroupedData { GroupName = "Group #2" };
+ group2.Add (new GroupItem { DisplayText = "Text for ListVIew item 2.1" });
+ group2.Add (new GroupItem { DisplayText = "Text for ListView item 2.2" });
+ groups.Add (group2);
+
+ var itemTemplate = new DataTemplate(typeof(GroupItemTemplate));
+ itemTemplate.CreateContent();
+
+ var groupHeaderTemplate = new DataTemplate(typeof(GroupHeaderTemplate));
+ groupHeaderTemplate.CreateContent();
+
+ var listView = new ListView {
+ IsGroupingEnabled = true,
+ GroupDisplayBinding = new Binding ("GroupName"),
+ GroupShortNameBinding = new Binding ("GroupName"),
+ HasUnevenRows = Device.OnPlatform (Android: true, WinPhone: false, iOS: false),
+
+ ItemTemplate = itemTemplate,
+ GroupHeaderTemplate = groupHeaderTemplate,
+
+ ItemsSource = groups
+ };
+
+ Content = new StackLayout {
+ VerticalOptions = LayoutOptions.Center,
+ Children = {
+ new Label {
+ Text = "The group headers below should extend to the width of the screen. If they aren't the width of the screen, this test has failed."
+ },
+ new ContentView {
+ Content = listView,
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ Padding = 0
+ }
+ }
+ };
+ }
+
+ [Preserve (AllMembers = true)]
+ public class GroupItem
+ {
+ public string DisplayText { get; set; }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class GroupedData : List<GroupItem>
+ {
+ public string GroupName { get; set; }
+ }
+
+ [Preserve (AllMembers=true)]
+ public class GroupItemTemplate : ViewCell
+ {
+ public GroupItemTemplate()
+ {
+ var title = new Label() { FontSize = 14 };
+ title.SetBinding(Label.TextProperty, new Binding("DisplayText", BindingMode.OneWay));
+
+ View = new StackLayout
+ {
+ Orientation = StackOrientation.Horizontal,
+ Padding = new Thickness(8),
+ Children = { title }
+ };
+ }
+ }
+
+ [Preserve(AllMembers = true)]
+ public class GroupHeaderTemplate : ViewCell
+ {
+ public GroupHeaderTemplate()
+ {
+ var title = new Label { TextColor = Color.White, FontSize = 16 };
+ title.SetBinding(Label.TextProperty, new Binding("GroupName", BindingMode.OneWay));
+
+ View = new StackLayout
+ {
+ Padding = new Thickness(8, 0),
+ VerticalOptions = LayoutOptions.StartAndExpand,
+ BackgroundColor = Color.FromHex("#6D91BA"),
+ Orientation = StackOrientation.Horizontal,
+ Children = { title },
+ };
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26993.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26993.cs
new file mode 100644
index 00000000..765fbb12
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla26993.cs
@@ -0,0 +1,105 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+using System.Collections.Generic;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 26993, "https://bugzilla.xamarin.com/show_bug.cgi?id=26993")]
+ public class Bugzilla26993 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ [Preserve (AllMembers = true)]
+ public class Bz26993ViewCell : ViewCell
+ {
+ static int s_id = 0;
+
+ public Bz26993ViewCell ()
+ {
+ View = new WebView {
+ AutomationId = "AutomationId" + s_id,
+ HeightRequest = 300,
+ Source = new HtmlWebViewSource {
+ Html = "<html><head><link rel=\"stylesheet\" href=\"default.css\"></head><body><h1 id=\"CellID" + s_id + "\">Xamarin.Forms " + s_id + "</h1><p>The CSS and image are loaded from local files!</p><img src='WebImages/XamarinLogo.png'/><p><a id=\"LinkID" + s_id++ + "\" href=\"local.html\">next page</a></p></body></html>"
+ }
+ };
+ }
+ }
+
+ protected override void Init ()
+ {
+ var itemSource = new List<string> {
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ };
+
+ Content = new StackLayout {
+ Children = {
+ new ListView {
+ RowHeight = 300,
+ ItemsSource = itemSource,
+ ItemTemplate = new DataTemplate (typeof(Bz26993ViewCell))
+ }
+ }
+ };
+ }
+
+#if UITEST
+ [Test]
+ public void Bugzilla26993Test ()
+ {
+ RunningApp.Screenshot ("I am at BZ26993");
+
+ RunningApp.WaitForElement (q=>q.WebView(0).Css("#CellID0"));
+ RunningApp.Tap (q=>q.WebView(0).Css("#LinkID0"));
+
+ RunningApp.Screenshot ("Load local HTML");
+
+ RunningApp.WaitForNoElement (q=>q.WebView(0).Css("#LinkID0"));
+ var newElem = RunningApp.Query (q => q.WebView (0).Css ("h1"));
+ Assert.AreEqual ("#LocalHtmlPage", newElem[0].Id);
+
+ RunningApp.Screenshot ("I see the Label");
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27085.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27085.cs
new file mode 100644
index 00000000..875d83b5
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27085.cs
@@ -0,0 +1,36 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Issue (IssueTracker.Bugzilla, 27085, "EntryCell has no possibility to hide keyboard on iOS")]
+ public class Bugzilla27085 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ protected override void Init ()
+ {
+ var tableview = new TableView ();
+
+ var section = new TableSection ("Settings");
+ section.Add (new TextCell { Text = "TextCell" });
+ section.Add (new TextCell { Text = "TextCell" });
+ section.Add (new EntryCell { Text = "EntryCell", Keyboard = Keyboard.Numeric });
+ section.Add (new EntryCell { Text = "EntryCell", Keyboard = Keyboard.Numeric });
+ var root = new TableRoot ("Main");
+ root.Add (section);
+
+ tableview.Root = root;
+
+ Content = tableview;
+ }
+
+#if UITEST
+
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27318.xaml b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27318.xaml
new file mode 100644
index 00000000..ae1e9ba7
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27318.xaml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
+ xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+ x:Class="Xamarin.Forms.Controls.Bugzilla27318">
+ <StackLayout>
+ <ListView x:Name="listView" BackgroundColor="Red">
+ <ListView.ItemTemplate>
+ <DataTemplate>
+ <ViewCell>
+ <StackLayout Spacing="0">
+ <Label Text="Fontsize 30 text"
+ BackgroundColor="Green"
+ FontSize="30" />
+ <Label Text="Small text overwritten"
+ BackgroundColor="Yellow"
+ HorizontalOptions="End" />
+ </StackLayout>
+ </ViewCell>
+ </DataTemplate>
+ </ListView.ItemTemplate>
+ </ListView>
+ </StackLayout>
+</ContentPage> \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27318.xaml.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27318.xaml.cs
new file mode 100644
index 00000000..8bd04d09
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27318.xaml.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+
+using Xamarin.Forms.CustomAttributes;
+
+using Xamarin.Forms;
+
+namespace Xamarin.Forms.Controls
+{
+#if APP
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 27318, "Labels overlapping", PlatformAffected.Android, NavigationBehavior.PushAsync)]
+ public partial class Bugzilla27318 : ContentPage
+ {
+ public Bugzilla27318 ()
+ {
+ InitializeComponent ();
+ listView.ItemsSource = new [] { "Foo", "Bar", "Baz" };
+ }
+ }
+#endif
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27350.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27350.cs
new file mode 100644
index 00000000..e4899358
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27350.cs
@@ -0,0 +1,151 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+using System.ComponentModel;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Threading.Tasks;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 27350, "Binding throws Null Pointer Exception when Updating Tab")]
+ public class Bugzilla27350 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ protected override void Init ()
+ {
+ var btn = new Button { Text = "next main" };
+ btn.Clicked += async (object sender, EventArgs e) => await Navigation.PushAsync (new MainPage1 ());
+ Content = btn;
+ }
+
+ class RecipeViewModel
+ {
+ public Recipe Recipe { get; set; }
+
+ public ObservableCollection<RecipeGroup> RecipeGroups { get; set; }
+
+ public async Task LoadRecipesAsync ()
+ {
+ var groups = new ObservableCollection<RecipeGroup> ();
+ groups.Add (new RecipeGroup { Title = "Teste 1" });
+ groups.Add (new RecipeGroup { Title = "Teste 2" });
+ groups.Add (new RecipeGroup { Title = "Teste 3" });
+ groups.Add (new RecipeGroup { Title = "Teste 4" });
+ groups.Add (new RecipeGroup { Title = "Teste 5" });
+ groups.Add (new RecipeGroup { Title = "Teste 6" });
+ groups.Add (new RecipeGroup { Title = "Teste 4" });
+ groups.Add (new RecipeGroup { Title = "Teste 5" });
+ groups.Add (new RecipeGroup { Title = "Teste 6" });
+
+ RecipeGroups = groups;
+ }
+ }
+
+ class Recipe
+ {
+ public string ID { get; set; }
+
+ public string Title { get; set; }
+
+ public string Subtitle { get; set; }
+
+ public string Description { get; set; }
+
+ public string ImagePath { get; set; }
+
+ public string TileImagePath { get; set; }
+
+ public int PrepTime { get; set; }
+
+ public string Directions { get; set; }
+
+ public List<string> Ingredients { get; set; }
+ }
+
+ class RecipeGroup : INotifyPropertyChanged
+ {
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ void OnPropertyChanged (string caller)
+ {
+ var handler = PropertyChanged;
+ if (handler != null) {
+ handler (this, new PropertyChangedEventArgs (caller));
+ }
+ }
+
+ public string ID { get; set; }
+
+ public string Title {
+ get{ return _title; }
+ set {
+ _title = value;
+ OnPropertyChanged ("Title");
+ }
+ }
+
+ string _title;
+
+ public string Subtitle { get; set; }
+
+ public string ImagePath { get; set; }
+
+ public string GroupImagePath { get; set; }
+
+ public string Description { get; set; }
+
+ public List<Recipe> Recipes { get; set; }
+ }
+
+ class MainPage1 : TabbedPage
+ {
+ public MainPage1 ()
+ {
+ ItemTemplate = new DataTemplate (() => {
+ var page = new ContentPage ();
+ page.SetBinding (TitleProperty, new Binding ("Title"));
+ var btn = new Button { Text = "change", Command = new Command (() => {
+ (page.BindingContext as RecipeGroup).Title = "we changed";
+ })
+ };
+ var btn1 = new Button { Text = "null", Command = new Command (() => {
+ (page.BindingContext as RecipeGroup).Title = null;
+ })
+ };
+ page.Content = new StackLayout { Children = { btn, btn1 } };
+ return page;
+ });
+ SetBinding (ItemsSourceProperty, new Binding ("RecipeGroups"));
+ }
+
+ protected override async void OnAppearing ()
+ {
+ base.OnAppearing ();
+
+ if (BindingContext == null)
+ BindingContext = await GetRecipeViewModelAsync ();
+ }
+
+ RecipeViewModel _rvm;
+
+ public async Task<RecipeViewModel> GetRecipeViewModelAsync ()
+ {
+ if (_rvm == null) {
+ _rvm = new RecipeViewModel ();
+ } else {
+ _rvm.RecipeGroups.Clear ();
+ }
+
+ await _rvm.LoadRecipesAsync ();
+
+ return _rvm;
+ }
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27378.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27378.cs
new file mode 100644
index 00000000..7d47e488
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27378.cs
@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls.Issues
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 27378, "Navigation.InsertPageBefore causes AurgumentException only on Windows Phone", PlatformAffected.WinPhone, NavigationBehavior.PushModalAsync)]
+ public class Bugzilla27378
+ : NavigationPage
+ {
+ public Bugzilla27378()
+ {
+ ContentPage page = null;
+ page = new ContentPage {
+ Content = new Button {
+ Text = "Click",
+ Command = new Command (async () => {
+ Navigation.InsertPageBefore (new ContentPage {
+ Content = new Label {
+ Text = "Second page"
+ }
+ }, page);
+ await Navigation.PopAsync ();
+ })
+ }
+ };
+
+ PushAsync (page);
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27581.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27581.cs
new file mode 100644
index 00000000..511e9860
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27581.cs
@@ -0,0 +1,29 @@
+using System;
+
+using Xamarin.Forms;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Bugzilla, 27581, "WebView in ContentPage", PlatformAffected.Android)]
+ public class Bugzilla27581 : ContentPage
+ {
+ public Bugzilla27581 ()
+ {
+ Content = new StackLayout {
+ VerticalOptions = LayoutOptions.FillAndExpand,
+ Children = {
+ new Label {
+ XAlign = TextAlignment.Center,
+ Text = "Tap input field, then try to scroll"
+ },
+ new WebView {
+ Source = "http://movinglabs.com/temp/xamarin/input.html",
+ VerticalOptions = LayoutOptions.FillAndExpand
+ }
+ }
+ };
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27642.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27642.cs
new file mode 100644
index 00000000..ec2c203e
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27642.cs
@@ -0,0 +1,178 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+using System.Text;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 27642, "[Windows Phone] Adding a ScrollView control to a ContentView, remove it and re-add it will cause an exception on Windows Phone")]
+ public class Bugzilla27642 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ ContentView _mainContent;
+ protected override void Init ()
+ {
+ var rootGrid = new Grid {
+ RowDefinitions = new RowDefinitionCollection
+ {
+ new RowDefinition { Height = new GridLength(1, GridUnitType.Star) },
+ new RowDefinition { Height = new GridLength(1, GridUnitType.Auto) },
+ },
+ };
+
+
+ _mainContent = new ContentView { Content = new ScrollView { Content = new Label { Text = Description } } };
+ rootGrid.AddChild (_mainContent, 0, 0);
+
+
+ var buttons = new StackLayout { Orientation = StackOrientation.Horizontal };
+
+ var button1A = new Button { Text = "View 1A" };
+ button1A.Clicked += (sender, args) => ShowView (_view1A);
+ buttons.Children.Add (button1A);
+
+ var button1B = new Button { Text = "View 1B" };
+ button1B.Clicked += (sender, args) => ShowView (_view1B);
+ buttons.Children.Add (button1B);
+
+ var button2 = new Button { Text = "View 2" };
+ button2.Clicked += (sender, args) => ShowView (_view2);
+ buttons.Children.Add (button2);
+
+ rootGrid.AddChild (buttons, 0, 1);
+
+
+ Content = rootGrid;
+ }
+
+ const string Description = "A view containing a ScrollView cannot be re-used (same instance, Singleton) \n\n\n"
+ + "Steps to reproduce: \n\n" + "View1a contains a ScrollView \n"
+ + "Click: View1A -> View2 -> View1A => Exception\n\n"
+ + "View1b also contains a ScrollView, but its Content (including ScrollView!) will be re-generated during activation.\n"
+ + "Click: View1B -> View2 -> View1B => Exception\n\n"
+ + "View2 doesn't contain a ScrollView and therefore can be called again without problems.\n\n"
+ + "The Error-Message-View contains a ScrollView, too but will be re-created every time.";
+
+ readonly View1A _view1A = new View1A (); // always same instance, simulates Singleton from IoC
+ readonly View1B _view1B = new View1B (); // -"-
+ readonly View2 _view2 = new View2 (); // -"-
+
+ void ShowView (ExtendedContentView view)
+ {
+ try {
+ view.Activating (); // implemented only for View1B
+ _mainContent.Content = view;
+ }
+ catch (Exception ex) {
+ _mainContent.Content = new ErrorView (ex);
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class ExtendedContentView : ContentView
+ {
+ public virtual void Activating ()
+ {
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class View1A : ExtendedContentView
+ {
+ public View1A ()
+ {
+
+ BackgroundColor = Color.Olive;
+ var scrollView = new ScrollView ();
+ var sb = new StringBuilder ();
+ for (var i = 0; i < 100; i++)
+ sb.Append ("View 1a with ScrollView +++ ");
+
+ var label = new Label { Text = sb.ToString (), HorizontalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.Center, XAlign = TextAlignment.Center, };
+
+ scrollView.Content = label;
+
+ Content = scrollView;
+
+ }
+
+ }
+
+ [Preserve (AllMembers = true)]
+ public class View1B : ExtendedContentView
+ {
+ public View1B ()
+ {
+ BackgroundColor = Color.Navy;
+ }
+
+ public override void Activating ()
+ {
+ var scrollView = new ScrollView ();
+ var sb = new StringBuilder ();
+ for (var i = 0; i < 50; i++)
+ sb.Append ("View 1b with ScrollView and recreation of content +++++ ");
+
+ var label = new Label { Text = sb.ToString (), HorizontalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.Center, XAlign = TextAlignment.Center, };
+
+ scrollView.Content = label;
+
+ Content = scrollView;
+
+ }
+ }
+
+ public class View2 : ExtendedContentView
+ {
+ public View2 ()
+ {
+ BackgroundColor = Color.Teal;
+ Content = new Label { Text = "View 2", HorizontalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.Center, XAlign = TextAlignment.Center, };
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class ErrorView : ExtendedContentView
+ {
+ public ErrorView (Exception ex)
+ {
+ BackgroundColor = Color.Maroon;
+ Content = new ScrollView { Content = new Label { Text = ex.ToString () } };
+ }
+ }
+
+ }
+
+ public static class GridExtension
+ {
+ public static void AddChild (this Grid grid, View view, int column, int row, int columnspan = 1, int rowspan = 1)
+ {
+ if (row < 0) {
+ throw new ArgumentOutOfRangeException ("row");
+ }
+ if (column < 0) {
+ throw new ArgumentOutOfRangeException ("column");
+ }
+ if (rowspan <= 0) {
+ throw new ArgumentOutOfRangeException ("rowspan");
+ }
+ if (columnspan <= 0) {
+ throw new ArgumentOutOfRangeException ("columnspan");
+ }
+ if (view == null) {
+ throw new ArgumentNullException ("view");
+ }
+
+ Grid.SetRow (view, row);
+ Grid.SetRowSpan (view, rowspan);
+ Grid.SetColumn (view, column);
+ Grid.SetColumnSpan (view, columnspan);
+ grid.Children.Add (view);
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27698.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27698.cs
new file mode 100644
index 00000000..08122826
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27698.cs
@@ -0,0 +1,53 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Issue (IssueTracker.Bugzilla, 27698, "[iOS] DisplayAlert and DisplayActionSheet are shown below master page ")]
+ public class Bugzilla27698 : TestMasterDetailPage // or TestMasterDetailPage, etc ...
+ {
+ protected override void Init ()
+ {
+
+ var showAlertBtn = new Button { Text = "DisplayAlert" };
+ var showActionSheetBtn = new Button { Text = "DisplayActionSheet" };
+
+ var master = new ContentPage
+ {
+ Title = "Master",
+ Content = new StackLayout
+ {
+ VerticalOptions = LayoutOptions.Center,
+ Children = {
+ showAlertBtn,
+ showActionSheetBtn
+ }
+ }
+ };
+
+ Master = master;
+
+ MasterBehavior = MasterBehavior.Popover;
+
+ Detail = new ContentPage {
+ Content = new Label { Text = "Details", HorizontalOptions =
+ LayoutOptions.Center, VerticalOptions = LayoutOptions.Center
+ }
+ };
+
+ showAlertBtn.Clicked += (s, e) => DisplayAlert("Title","Message", "Cancel");
+ showActionSheetBtn.Clicked += (s, e) => DisplayActionSheet ("Title", "Cancel", null, "Button1", "Button2", "Button3");
+
+ }
+
+#if UITEST
+
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27779.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27779.cs
new file mode 100644
index 00000000..271c4b05
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla27779.cs
@@ -0,0 +1,83 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+using System.Collections.Generic;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 27779, "Xamarin.Forms.ReadOnlyListAdapter.IndexOf throws NotImplementedExcpetion ")]
+ public class Bugzilla27779 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ ListView _listview;
+ IReadOnlyList<Person> _itemsSource;
+
+ public class Source : IReadOnlyList<Person>
+ {
+ List<Person> _items;
+ public Source ()
+ {
+ _items = new List<Person> ();
+
+ for (int i = 0; i < 100; i++) {
+ _items.Add (new Person ("Person #" + i));
+ }
+
+ }
+ #region IEnumerable implementation
+ public IEnumerator<Person> GetEnumerator ()
+ {
+ return _items.GetEnumerator ();
+ }
+ #endregion
+ #region IEnumerable implementation
+ System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator ()
+ {
+ return _items.GetEnumerator ();
+ }
+ #endregion
+ #region IReadOnlyList implementation
+ public Person this [int index] {
+ get {
+ return _items [index];
+ }
+ }
+ #endregion
+ #region IReadOnlyCollection implementation
+ public int Count {
+ get {
+ return _items.Count;
+ }
+ }
+ #endregion
+
+ }
+ protected override void Init ()
+ {
+
+ _itemsSource = new Source();
+
+ _listview = new ListView {
+ ItemsSource = _itemsSource
+ };
+
+ var btn = new Button { Text = "Set selected", AutomationId="btnSelect" };
+ btn.Clicked+= (object sender, EventArgs e) => {
+ _listview.SelectedItem = _itemsSource [0];
+ };
+
+ Content = new StackLayout { Children = { btn, _listview } };
+ }
+
+ protected override void OnAppearing ()
+ {
+ base.OnAppearing ();
+ }
+
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28001.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28001.cs
new file mode 100644
index 00000000..e73bc0dd
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28001.cs
@@ -0,0 +1,60 @@
+using System;
+using Xamarin.Forms.CustomAttributes;
+
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 28001, "[Android] TabbedPage: invisible tabs are not Disposed", PlatformAffected.Android)]
+ public class Bugzilla28001 : TestContentPage
+ {
+ static int s_disposeCount;
+ static Label s_lbl;
+
+ void HandleDispose (object sender, EventArgs e)
+ {
+ s_disposeCount++;
+ s_lbl.Text = string.Format ("Dispose {0} pages", s_disposeCount);
+ }
+
+ protected override void Init ()
+ {
+ s_lbl = new Label { AutomationId = "lblDisposedCound" };
+ var tab1 = new DisposePage { Title = "Tab1" };
+ var tab2 = new DisposePage { Title = "Tab2" };
+ tab1.RendererDisposed += HandleDispose;
+ tab2.RendererDisposed += HandleDispose;
+
+ tab2.PopAction = tab1.PopAction = async () => await Navigation.PopAsync ();
+
+ var tabbedPage = new TabbedPage { Children = { tab1, tab2 } };
+ var btm = new Button { Text = "Push" };
+
+ btm.Clicked += async (object sender, EventArgs e) => {
+ await Navigation.PushAsync (tabbedPage);
+ };
+
+ Content = new StackLayout { Children = { btm, s_lbl } };
+ }
+
+
+ #if UITEST
+ [Test]
+ public void Bugzilla28001Test ()
+ {
+ RunningApp.Screenshot ("I am at Bugzilla 28001");
+ RunningApp.Tap (q => q.Marked ("Push"));
+ RunningApp.Tap (q => q.Marked ("Tab2"));
+ RunningApp.Tap (q => q.Marked ("Tab1"));
+ RunningApp.Tap (q => q.Marked ("Pop"));
+ RunningApp.WaitForElement (q => q.Marked (string.Format ("Dispose {0} pages", 2)));
+
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28240.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28240.cs
new file mode 100644
index 00000000..f2bf078a
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28240.cs
@@ -0,0 +1,38 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 28240, "Problems with a NavigationPage as Master+Detail of a MasterDetailPage", PlatformAffected.Android)]
+ public class Bugzilla28240 : TestMasterDetailPage
+ {
+ protected override void Init ()
+ {
+ Detail = new NavigationPage( new ContentPage { Title = "DetailPage", BackgroundColor = Color.Red });
+ Master = new NavigationPage( new ContentPage { Title = "MasterPage", BackgroundColor = Color.Blue }) { Title =" Master" };
+ }
+
+ protected override async void OnAppearing ()
+ {
+ var btn = new Button () { Text = "GO Back" };
+ btn.Clicked+= async (object sender, EventArgs e) => await (Master as NavigationPage).PopAsync ();
+
+ await (Master as NavigationPage).PushAsync (new ContentPage { Title = "New MasterPage", Content = btn , BackgroundColor = Color.Pink });
+ base.OnAppearing ();
+ }
+#if UITEST
+ [Test]
+ public void Bugzilla28240Test ()
+ {
+
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28498.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28498.cs
new file mode 100644
index 00000000..3f5f5abc
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28498.cs
@@ -0,0 +1,78 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 28498, "App crashes when switching between NavigationPages on a MasterDetailPage when In-Call Status Bar is visible")]
+ public class Bugzilla28498 : TestMasterDetailPage
+ {
+ protected override void Init ()
+ {
+
+
+ var carrouselChildPage = new ContentPage { Content = new StackLayout {
+ Orientation = StackOrientation.Vertical,
+ Children = {
+ new Label { Text = "Carousel Page" },
+ new Button { Text = "Open", AutomationId="btnOpen", Command = new Command (() => IsPresented = true) },
+ },
+ Padding = 10
+ }
+ };
+
+ var otherPage = new ContentPage { Content = new StackLayout {
+ Orientation = StackOrientation.Vertical,
+ Children = {
+ new Label { Text = "Other" },
+ new Button { Text = "Open", AutomationId="btnOpen", Command = new Command (() => IsPresented = true) },
+ },
+ Padding = 10
+ }
+ };
+
+ var carousel = new NavigationPage(new CarouselPage { Children = { carrouselChildPage } });
+ var other = new NavigationPage(otherPage);
+ Detail = carousel;
+
+ Master = new ContentPage
+ {
+ Title = "Menu",
+ Content = new StackLayout
+ {
+ Orientation = StackOrientation.Vertical,
+ Children = {
+ new Button { Text = "Page 1 (Carousel)", AutomationId="btnCarousel", Command = new Command(() => Detail = carousel) },
+ new Button { Text = "Page 2 (Other)", AutomationId="btnOther", Command = new Command(() => Detail = other) },
+ },
+ Padding = 10
+ }
+ };
+
+ }
+
+#if UITEST
+ [Test]
+ public void Bugzilla28498Test ()
+ {
+ RunningApp.SetOrientationPortrait ();
+ RunningApp.Tap (q => q.Marked ("btnOpen"));
+ RunningApp.Tap (q => q.Marked ("btnOther"));
+ RunningApp.SetOrientationLandscape ();
+ RunningApp.Tap (q => q.Marked ("btnOpen"));
+ RunningApp.Screenshot ("Detail open");
+
+ if (RunningApp.Query (c => c.Marked ("btnCarousel")).Length > 0)
+ Assert.DoesNotThrow (() => RunningApp.Tap (q => q.Marked ("btnCarousel")));
+ else
+ Assert.Inconclusive ("Should be button here, but rotation could take some time on XTC");
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28570.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28570.cs
new file mode 100644
index 00000000..5e9a8cb8
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28570.cs
@@ -0,0 +1,118 @@
+using System;
+using System.Diagnostics;
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest.Android;
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 28570, "https://bugzilla.xamarin.com/show_bug.cgi?id=28570")]
+ internal class Bugzilla28570 : TestContentPage
+ {
+ public ScrollView ScrollView;
+
+ protected override void Init ()
+ {
+ Label header = new Label {
+ Text = "ScrollView Bug",
+ FontSize = 50,
+ FontAttributes = FontAttributes.Bold,
+ HorizontalOptions = LayoutOptions.Center
+ };
+
+ Label lab1 = new Label ();
+ lab1.Text = "Sometimes page content fits entirely on " +
+ "the page. That's very convenient. But " +
+ "on many occasions, the content of the page " +
+ "is much too large for the page, or only " +
+ "becomes available at runtime." +
+ "\n\n" +
+ "For cases such as these, the ScrollView " +
+ "provides a solution. Simply set its " +
+ "Content property to your content \u2014 in this " +
+ "case a Label but in the general case very " +
+ "likely a Layout derivative with multiple " +
+ "children \u2014 and the ScrollView provides " +
+ "scrolling with the distinctive look and touch " +
+ "familiar to the user." +
+ "\n\n" +
+ "The ScrollView is also capable of " +
+ "horizontal scrolling, and while that's " +
+ "usually not as common as vertical scrolling, " +
+ "sometimes it comes in handy." +
+ "\n\n" +
+ "Most often, the content of a ScrollView is " +
+ "a StackLayout. Whenever you're using a " +
+ "StackLayout with a number of items determined " +
+ "only at runtime, you should probably put it in " +
+ "a StackLayout just to be sure your stuff doesn't " +
+ "go running off the bottom of the screen." +
+ "Most often, the content of a ScrollView is " +
+ "a StackLayout. Whenever you're using a " +
+ "StackLayout with a number of items determined " +
+ "only at runtime, you should probably put it in " +
+ "a StackLayout just to be sure your stuff doesn't " +
+ "go running off the bottom of the screen.";
+
+ var targetLabel = new Label {Text = "Find Me"};
+ targetLabel.AutomationId = "28570Target";
+
+ lab1.FontSize = Device.GetNamedSize (NamedSize.Small, typeof (Label));
+
+
+ ScrollView = new ScrollView {
+ VerticalOptions = LayoutOptions.FillAndExpand,
+ Content = new StackLayout {
+ Children = {
+ lab1,
+ targetLabel
+ }
+ }
+ };
+
+ Button makeBig = new Button ();
+ makeBig.Text = "Tap";
+ //
+ // Clicking button first time does not scroll event though scrollView.Height is already set.
+ // Clicking a second time does correctly scroll to the end. scrollView.Height is unchanged.
+ //
+ // For this test to work you should make sure the text fits into the screen when the font is small
+ // and then becomes larger than the screeen when switching to the Large font.
+ //
+ makeBig.Clicked += (object sender, EventArgs e) => {
+ lab1.FontSize = Device.GetNamedSize (NamedSize.Large, typeof (Label));
+ Debug.WriteLine ("******** scrollView.Height= {0}", lab1.Height); // this shows the same updated size on all clicks, so this is not the problem.
+ ScrollView.ScrollToAsync (0, lab1.Bounds.Bottom, false);
+ };
+
+ // Build the page.
+ Content = new StackLayout {
+ Children = {
+ makeBig,
+ header,
+ ScrollView,
+ }
+ };
+ }
+
+#if UITEST
+ [Test]
+ [Ignore("Fails intermittently on TestCloud")]
+ public void Bugzilla28570Test ()
+ {
+ if (RunningApp is AndroidApp) {
+ RunningApp.WaitForElement (q => q.Marked ("Tap"));
+ RunningApp.Screenshot ("At test page");
+ RunningApp.Tap (q => q.Marked ("Tap"));
+
+ RunningApp.WaitForElement (q => q.Marked ("28570Target"));
+ }
+ }
+#endif
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28575.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28575.cs
new file mode 100644
index 00000000..665dec2d
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28575.cs
@@ -0,0 +1,53 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 28575, "listview header set to null")]
+ public class Bugzilla28575 : TestContentPage
+ {
+ readonly string _header = "Hello I am Header!!!!";
+
+ protected override void Init ()
+ {
+ var listview = new ListView ();
+ listview.Header = new Label () {
+ Text = _header,
+ TextColor = Color.Red,
+ XAlign = TextAlignment.Center
+ };
+
+ var b = new Button () {
+ Text = "Click",
+ AutomationId = "btnClick"
+
+ };
+ b.Clicked += (sender, e) => listview.Header = null;
+
+ Content = new StackLayout {
+ Children = {
+ b,
+ listview
+ }
+ };
+ }
+
+ #if UITEST
+ [Test]
+ public void Bugzilla28575Test ()
+ {
+ RunningApp.Screenshot ("I am at Bugzilla28575Test ");
+ RunningApp.WaitForElement (q => q.Marked (_header));
+ RunningApp.Tap (q => q.Marked ("Click"));
+ RunningApp.WaitForNoElement (q => q.Marked (_header));
+ }
+ #endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28709.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28709.cs
new file mode 100644
index 00000000..db67e935
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28709.cs
@@ -0,0 +1,94 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+using System.Threading.Tasks;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 28709, "Application.Properties saving crash ")]
+ public class Bugzilla28709 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ protected override void Init ()
+ {
+
+ var btn = new Button () {
+ Text = "Save Properties",
+ HorizontalOptions = LayoutOptions.Center,
+ VerticalOptions = LayoutOptions.Center
+ };
+
+ var btn1 = new Button () {
+ Text = "Save Properties Multiple Threads",
+ HorizontalOptions = LayoutOptions.Center,
+ VerticalOptions = LayoutOptions.Center
+ };
+ btn.Clicked += OnButtonClicked;
+ btn1.Clicked += (sender, e) => {
+ Task.Run(() => {System.Diagnostics.Debug.WriteLine ("thread 1"); OnButtonClicked1("thread1",new EventArgs());});
+ Task.Run(() => {System.Diagnostics.Debug.WriteLine ("thread 2"); OnButtonClicked1("thread2",new EventArgs());});
+ Task.Run(() => {System.Diagnostics.Debug.WriteLine ("thread 3"); OnButtonClicked1("thread3",new EventArgs());});
+
+ };
+ Content = new StackLayout { Children = { btn, btn1 }};
+ }
+
+ void OnButtonClicked (object sender, EventArgs e)
+ {
+ System.Diagnostics.Debug.WriteLine ($"OnButtonClicked {sender.ToString()}");
+
+ int j = -1;
+ var properties = Application.Current.Properties;
+ int seed = 13;
+ while (++j < 300) {
+ seed = ((seed * 257) + 41) % 65536;
+ int i = seed % 20;
+
+ int previousClickTotal = -1;
+ if (properties.ContainsKey ("PreviousClickTotal" + i.ToString ()))
+ previousClickTotal = (int)(Application.Current.Properties ["PreviousClickTotal" + i.ToString ()]);
+
+ string clickTotal = "0";
+ if (properties.ContainsKey ("ClickTotal" + i.ToString ()))
+ clickTotal = (string)Application.Current.Properties ["ClickTotal" + i.ToString ()];
+
+ double nextClickTotal = 1.0;
+ if (properties.ContainsKey ("NextClickTotal" + i.ToString ()))
+ nextClickTotal = (double)(Application.Current.Properties ["NextClickTotal" + i.ToString ()]);
+
+ Application.Current.Properties ["PreviousClickTotal" + i.ToString ()] = ++previousClickTotal;
+ Application.Current.Properties ["ClickTotal" + i.ToString ()] = previousClickTotal.ToString ();
+ Application.Current.Properties ["NextClickTotal" + i.ToString ()] = ++nextClickTotal;
+
+ SaveAllProperties ();
+ }
+ }
+
+ async void OnButtonClicked1 (object sender, EventArgs e)
+ {
+ System.Diagnostics.Debug.WriteLine ($"OnButtonClicked {sender.ToString()}");
+ //Application.Current.Properties[sender.ToString()] = 1;
+ await Application.Current.SavePropertiesAsync ();
+ System.Diagnostics.Debug.WriteLine ($"OnButtonClicked {sender.ToString()} done");
+ }
+
+ async void SaveAllProperties ()
+ {
+ await Application.Current.SavePropertiesAsync ();
+ }
+
+
+ #if UITEST
+ [Test]
+ public void Bugzilla28709Test ()
+ {
+ RunningApp.Tap (q => q.Marked ("Save Properties"));
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28796.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28796.cs
new file mode 100644
index 00000000..98938d77
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28796.cs
@@ -0,0 +1,35 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 28796, "Crash on Tab change", PlatformAffected.Android, NavigationBehavior.PushModalAsync)]
+ public class Bugzilla28796
+ : TabbedPage
+ {
+ public Bugzilla28796()
+ {
+ Children.Add (new ContentPage {
+ Title = "First",
+ Content = new Label {
+ Text = "Select the second tab. Click the button and before it finishes animating, select the first tab."
+ }
+ });
+
+ var button = new Button {
+ Text = "Navigate"
+ };
+ button.Clicked += (sender, args) => {
+ Navigation.PushModalAsync (new ContentPage());
+ };
+
+ Children.Add (new ContentPage {
+ Title = "Second",
+ Content = button
+ });
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28939.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28939.cs
new file mode 100644
index 00000000..c216f23d
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla28939.cs
@@ -0,0 +1,21 @@
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Issue (IssueTracker.Bugzilla, 28939, " Entry Control loses cursor position to either beginning or end of input ",
+ PlatformAffected.WinPhone)]
+ public class Bugzilla28939 : TestContentPage
+ {
+ protected override void Init ()
+ {
+ Content = new StackLayout {
+ Children = {
+ new Label {
+ Text = @"Enter the text ""testing"" in the Entry Control below. Move the cursor between the 'e' and the 's'. Type the letter 'a'. If the cursor is positioned after the 'a', the test has passed."
+ },
+ new Entry()
+ }
+ };
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29017.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29017.cs
new file mode 100644
index 00000000..eea9295d
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29017.cs
@@ -0,0 +1,82 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+using Xamarin.Forms.Maps;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Issue (IssueTracker.Bugzilla, 29017, "Pin clicked does not work on iOS maps")]
+ public class Issue29017 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ Label _lbl;
+
+ protected override void Init ()
+ {
+ var map = new Map {
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ VerticalOptions = LayoutOptions.FillAndExpand
+ };
+
+ _lbl = new Label {
+ Text = "Not Clicked"
+ };
+
+ Content = new StackLayout {
+ Children = {
+ new Button {
+ Text = "Add pins",
+ Command = new Command (() => {
+
+ foreach (var pin in map.Pins) {
+ pin.Clicked -= PinClicked;
+ }
+
+ map.Pins.Clear ();
+
+ for (int i = 0; i < 100; i++) {
+ var rnd = new Random ();
+ var lat = rnd.NextDouble () / 10;
+ var lng = rnd.NextDouble () / 10;
+
+ if (i % 2 == 0) {
+ lat = -lat;
+ lng = -lng;
+ }
+
+ var pin = new Pin {
+ Address = "address",
+ Label = "label",
+ Type = PinType.Place,
+ Position = new Position (map.VisibleRegion.Center.Latitude + lat, map.VisibleRegion.Center.Longitude + lng)
+ };
+
+ pin.Clicked += PinClicked;
+ map.Pins.Add (pin);
+ }
+ })
+ },
+ _lbl,
+ map
+ }
+ };
+ }
+
+ void PinClicked (object sender, EventArgs e)
+ {
+ _lbl.Text = "Click " + DateTime.Now.ToLocalTime ();
+ }
+
+#if UITEST
+ [Test]
+ public void Issue1Test ()
+ {
+
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29107.xaml b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29107.xaml
new file mode 100644
index 00000000..de0f96d7
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29107.xaml
@@ -0,0 +1,249 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<local:TestContentPage xmlns="http://xamarin.com/schemas/2014/forms"
+ xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+ xmlns:local="clr-namespace:Xamarin.Forms.Controls"
+ x:Class="Xamarin.Forms.Controls.Bugzilla29107">
+ <StackLayout Orientation="Vertical" HorizontalOptions="FillAndExpand" Padding="20">
+ <Frame OutlineColor="Gray" Padding="5">
+ <Label Text="" VerticalOptions="End" HorizontalOptions="Start" />
+ </Frame>
+ <StackLayout HorizontalOptions="FillAndExpand" Orientation="Horizontal">
+ <Label Text=" State:" HorizontalOptions="Start">
+ <Label.Font>
+ Bold,Large
+ </Label.Font>
+ </Label>
+ <Label Text="Test State" HorizontalOptions="Start">
+ <Label.Font>
+ Bold,Large
+ </Label.Font>
+ </Label>
+ </StackLayout>
+ <StackLayout HorizontalOptions="FillAndExpand" Orientation="Horizontal">
+ <ScrollView Orientation="Vertical" IsClippedToBounds="true">
+ <StackLayout HorizontalOptions="FillAndExpand">
+ <Label Text="Parameter1" HorizontalOptions="FillAndExpand" />
+ <Picker x:Name="pickerParam1" Title="Prameter1">
+ </Picker>
+ <StackLayout x:Name="layoutParam1" HorizontalOptions="FillAndExpand">
+ <Label Text="Entry" HorizontalOptions="FillAndExpand">
+ </Label>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ <Label Text="Entry" HorizontalOptions="FillAndExpand">
+ </Label>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ <Label Text="Entry" HorizontalOptions="FillAndExpand">
+ </Label>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ <Label Text="Entry" HorizontalOptions="FillAndExpand">
+ </Label>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ <Label Text="Entry" HorizontalOptions="FillAndExpand">
+ </Label>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ <Label Text="Entry" HorizontalOptions="FillAndExpand">
+ </Label>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ <Label Text="Entry" HorizontalOptions="FillAndExpand">
+ </Label>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ <Label Text="Entry" HorizontalOptions="FillAndExpand">
+ </Label>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ <Label Text="Entry" HorizontalOptions="FillAndExpand">
+ </Label>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ <Label Text="Entry" HorizontalOptions="FillAndExpand">
+ </Label>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ <Label Text="Entry" HorizontalOptions="FillAndExpand">
+ </Label>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ <Label Text="Entry" HorizontalOptions="FillAndExpand">
+ </Label>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ <Label Text="Entry" HorizontalOptions="FillAndExpand">
+ </Label>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ </StackLayout>
+ </StackLayout>
+ </ScrollView>
+ <ScrollView Orientation="Vertical" IsClippedToBounds="true">
+ <StackLayout HorizontalOptions="FillAndExpand">
+ <Label Text="Parameter2" HorizontalOptions="FillAndExpand" />
+ <Picker x:Name="pickerParam2" Title="Parameter2">
+ </Picker>
+ <StackLayout x:Name="layoutParam2" HorizontalOptions="FillAndExpand">
+ <Label Text="Entry" HorizontalOptions="FillAndExpand">
+ </Label>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ <Label Text="Entry" HorizontalOptions="FillAndExpand">
+ </Label>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ <Label Text="Entry" HorizontalOptions="FillAndExpand">
+ </Label>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ <Label Text="Entry" HorizontalOptions="FillAndExpand">
+ </Label>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ <Label Text="Entry" HorizontalOptions="FillAndExpand">
+ </Label>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ <Label Text="Entry" HorizontalOptions="FillAndExpand">
+ </Label>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ <Label Text="Entry" HorizontalOptions="FillAndExpand">
+ </Label>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ <Label Text="Entry" HorizontalOptions="FillAndExpand">
+ </Label>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ <Label Text="Entry" HorizontalOptions="FillAndExpand">
+ </Label>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ <Label Text="Entry" HorizontalOptions="FillAndExpand">
+ </Label>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ <Label Text="Entry" HorizontalOptions="FillAndExpand">
+ </Label>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ <Label Text="Entry" HorizontalOptions="FillAndExpand">
+ </Label>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ <Label Text="Entry" HorizontalOptions="FillAndExpand">
+ </Label>
+ <Entry HorizontalOptions="FillAndExpand">
+ </Entry>
+ </StackLayout>
+ </StackLayout>
+ </ScrollView>
+ <Grid HorizontalOptions="Start" Padding="2" VerticalOptions="FillAndExpand">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="200" />
+ <ColumnDefinition Width="200" />
+ </Grid.ColumnDefinitions>
+ <Grid.RowDefinitions>
+ <RowDefinition Height="20">
+ </RowDefinition>
+ <RowDefinition Height="20">
+ </RowDefinition>
+ <RowDefinition Height="20">
+ </RowDefinition>
+ <RowDefinition Height="20">
+ </RowDefinition>
+ <RowDefinition Height="20">
+ </RowDefinition>
+ <RowDefinition Height="20">
+ </RowDefinition>
+ <RowDefinition Height="20">
+ </RowDefinition>
+ <RowDefinition Height="20">
+ </RowDefinition>
+ </Grid.RowDefinitions>
+ <Label Text="Field" Grid.Row="0" Grid.Column="0">
+ <Label.Font>
+ Bold,Large
+ </Label.Font>
+ </Label>
+ <Label Text="Field" Grid.Row="0" Grid.Column="1">
+ <Label.Font>
+ Bold,Large
+ </Label.Font>
+ </Label>
+ <Label Text="Field" Grid.Row="1" Grid.Column="0">
+ <Label.Font>
+ Bold,Medium
+ </Label.Font>
+ </Label>
+ <Label Text="Field" Grid.Row="1" Grid.Column="1">
+ </Label>
+ <Label Text="Field" Grid.Row="2" Grid.Column="0">
+ <Label.Font>
+ Bold,Medium
+ </Label.Font>
+ </Label>
+ <Label Text="Field" Grid.Row="2" Grid.Column="1">
+ </Label>
+ <Label Text="Field" Grid.Row="3" Grid.Column="0">
+ <Label.Font>
+ Bold,Medium
+ </Label.Font>
+ </Label>
+ <Label Text="Field" Grid.Row="3" Grid.Column="1">
+ </Label>
+ <Label Text="Field" Grid.Row="4" Grid.Column="0">
+ <Label.Font>
+ Bold,Medium
+ </Label.Font>
+ </Label>
+ <Label Text="Field" Grid.Row="4" Grid.Column="1">
+ </Label>
+ <Label Text="Field" Grid.Row="5" Grid.Column="0">
+ <Label.Font>
+ Bold,Medium
+ </Label.Font>
+ </Label>
+ <Label Text="Field" Grid.Row="5" Grid.Column="1">
+ </Label>
+ <Label Text="Field" Grid.Row="6" Grid.Column="0">
+ <Label.Font>
+ Bold,Medium
+ </Label.Font>
+ </Label>
+ <Label Text="Field" Grid.Row="6" Grid.Column="1">
+ </Label>
+ <Label Text="Field" Grid.Row="7" Grid.Column="0">
+ <Label.Font>
+ Bold,Medium
+ </Label.Font>
+ </Label>
+ <Label Text="Field" Grid.Row="7" Grid.Column="1">
+ </Label>
+ <Label Text="Field" Grid.Row="8" Grid.Column="0">
+ <Label.Font>
+ Bold,Medium
+ </Label.Font>
+ </Label>
+ <Label Text="Field" Grid.Row="8" Grid.Column="1">
+ </Label>
+ </Grid>
+ </StackLayout>
+ <StackLayout HorizontalOptions="FillAndExpand" Orientation="Horizontal">
+ <Button Text="Start">
+ </Button>
+ <Button Text="Cancel">
+ </Button>
+ <Button Text="End">
+ </Button>
+ </StackLayout>
+ </StackLayout>
+</local:TestContentPage> \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29107.xaml.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29107.xaml.cs
new file mode 100644
index 00000000..d7a7ddca
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29107.xaml.cs
@@ -0,0 +1,22 @@
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 29107, "Xamarin.Android ScrollView text overlaps", PlatformAffected.Android)]
+ public partial class Bugzilla29107 : TestContentPage
+ {
+ public Bugzilla29107 ()
+ {
+#if APP
+ InitializeComponent ();
+#endif
+ }
+
+ protected override void Init ()
+ {
+
+ }
+
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29128.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29128.cs
new file mode 100644
index 00000000..c414e49e
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29128.cs
@@ -0,0 +1,36 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 29128, "Slider background lays out wrong Android")]
+ public class Bugzilla29128 : TestContentPage
+ {
+ protected override void Init ()
+ {
+ Content = new Slider {
+ AutomationId = "SliderId",
+ BackgroundColor = Color.Blue,
+ Maximum = 255,
+ Minimum = 0,
+ };
+ }
+
+#if UITEST
+ [Test]
+ public void Bugzilla29128Test ()
+ {
+ RunningApp.WaitForElement (q => q.Marked ("SliderId"));
+ RunningApp.Screenshot("Slider and button should be centered");
+ Assert.Inconclusive ("For visual review only");
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29158.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29158.cs
new file mode 100644
index 00000000..f755348b
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29158.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls.Issues
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 29158, "XF for WP8.1RT - BeginInvokeOnMainThread generates NullReferenceException", (PlatformAffected)(1<<3))]
+ public class Bugzilla29158
+ : ContentPage
+ {
+ protected override void OnAppearing()
+ {
+ base.OnAppearing();
+
+ System.Threading.Tasks.Task.Run (async () =>
+ {
+ await System.Threading.Tasks.Task.Delay (1000);
+ Device.BeginInvokeOnMainThread (() => DisplayAlert("Time's up", "", "OK"));
+ });
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29229.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29229.cs
new file mode 100644
index 00000000..059c2110
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29229.cs
@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls.Issues
+{
+ [Issue (IssueTracker.Bugzilla, 29229, "ListView crash on Windows Phone", PlatformAffected.WinPhone, NavigationBehavior.PushModalAsync)]
+ public class Bugzilla29229
+ : NavigationPage
+ {
+ public Bugzilla29229()
+ {
+ var absLayout = new AbsoluteLayout();
+ absLayout.BackgroundColor = Color.Red;
+ absLayout.Scale = 1;
+
+ var cPx = new ListView ();
+ Point ptx = Point.Zero;
+ cPx.ItemTapped += delegate (object sender, ItemTappedEventArgs e) {
+ };
+ cPx.ClassId = "weather";
+ cPx.Layout (new Rectangle (0,0,480,768));
+ absLayout.Children.Add (cPx, new Rectangle (cPx.X, cPx.Y, cPx.Width, cPx.Height), AbsoluteLayoutFlags.None);
+ absLayout.LowerChild (cPx);
+ PushAsync (new ContentPage { Content = absLayout });
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29247.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29247.cs
new file mode 100644
index 00000000..74828e71
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29247.cs
@@ -0,0 +1,67 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 29247, "iOS Device.OpenUri breaks with encoded params", PlatformAffected.iOS )]
+ public class Bugzilla29247 : TestContentPage
+ {
+ protected override void Init ()
+ {
+ Content = new StackLayout {
+ VerticalOptions = LayoutOptions.Center,
+ Children = {
+ new Label {
+ XAlign = TextAlignment.Center,
+ Text = "Welcome to Xamarin Forms!"
+ },
+ new Button {
+ Text = "Without Params (Works)",
+ AutomationId = "btnOpenUri1",
+ Command = new Command (() => Device.OpenUri (new Uri ("http://www.bing.com")))
+ },
+ new Button {
+ Text = "With encoded Params (Breaks)",
+ AutomationId = "btnOpenUri2",
+ Command = new Command (() => Device.OpenUri (new Uri ("http://www.bing.com/search?q=xamarin%20bombs%20on%20this")))
+ },
+ new Button {
+ Text = "With decoded Params (Breaks)",
+ AutomationId = "btnOpenUri3",
+ Command = new Command (() => Device.OpenUri (new Uri ("http://www.bing.com/search?q=xamarin bombs on this")))
+ }
+ }
+ };
+ }
+
+ #if UITEST
+ [Test]
+ [Ignore("Fails on ios 7.1")]
+ public void Bugzilla29247Test ()
+ {
+ RunningApp.Tap (q => q.Marked ("btnOpenUri1"));
+ }
+
+ [Test]
+ [Ignore("Fails on ios 7.1")]
+ public void Bugzilla29247EncodedParamsTest ()
+ {
+ RunningApp.Tap (q => q.Marked ("btnOpenUri2"));
+ }
+
+ [Test]
+ [Ignore("Fails on ios 7.1")]
+ public void Bugzilla29247DecodeParamsTest ()
+ {
+ RunningApp.Tap (q => q.Marked ("btnOpenUri3"));
+ }
+ #endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29257.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29257.cs
new file mode 100644
index 00000000..012ed59e
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29257.cs
@@ -0,0 +1,100 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+using System.Collections.Generic;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 29257, "CarouselPage.CurrentPage Does Not Work Properly When Used Inside a NavigationPage ")]
+ public class Bugzilla29257 : TestContentPage
+ {
+ List<string> _menuItems = new List<string> {
+ "Page 1", "Page 2", "Page 3", "Page 4", "Page 5"
+ };
+
+ ListView _menu;
+
+ protected override void Init ()
+ {
+ _menu = new ListView { ItemsSource = _menuItems };
+
+ _menu.ItemSelected += PageSelected;
+
+ Content = _menu;
+ }
+
+ async void PageSelected(object sender, SelectedItemChangedEventArgs e)
+ {
+ var selection = e.SelectedItem as string;
+
+ switch (selection)
+ {
+ case "Page 1":
+ await Navigation.PushAsync(new TestPage(0));
+ break;
+
+ case "Page 2":
+ await Navigation.PushAsync(new TestPage(1));
+ break;
+
+ case "Page 3":
+ await Navigation.PushAsync(new TestPage(2));
+ break;
+
+ case "Page 4":
+ await Navigation.PushAsync(new TestPage(3));
+ break;
+
+ case "Page 5":
+ await Navigation.PushAsync(new TestPage(4));
+ break;
+ }
+ _menu.SelectedItem = null;
+ }
+
+ public class TestPage : CarouselPage
+ {
+ public TestPage()
+ {
+ Children.Add(new ContentPage { Content = new Label { Text = "This is page 1" , BackgroundColor = Color.Red} });
+ Children.Add(new ContentPage { Content = new Label { Text = "This is page 2" , BackgroundColor = Color.Green} });
+ Children.Add(new ContentPage { Content = new Label { Text = "This is page 3" , BackgroundColor = Color.Blue} });
+ Children.Add(new ContentPage { Content = new Label { Text = "This is page 4" , BackgroundColor = Color.Pink} });
+ Children.Add(new ContentPage { Content = new Label { Text = "This is page 5" , BackgroundColor = Color.Yellow } });
+
+ }
+
+ public TestPage(int page) : this()
+ {
+ CurrentPage = Children[page];
+ }
+ }
+
+#if UITEST
+ [Test]
+ public void Bugzilla29257Test ()
+ {
+ RunningApp.Tap (q => q.Marked ("Page 1"));
+ RunningApp.WaitForElement (q => q.Marked ("This is page 1"));
+ RunningApp.Back ();
+ RunningApp.Tap (q => q.Marked ("Page 2"));
+ RunningApp.WaitForElement (q => q.Marked ("This is page 2"));
+ RunningApp.Back ();
+ RunningApp.Tap (q => q.Marked ("Page 3"));
+ RunningApp.WaitForElement (q => q.Marked ("This is page 3"));
+ RunningApp.Back ();
+ RunningApp.Tap (q => q.Marked ("Page 4"));
+ RunningApp.WaitForElement (q => q.Marked ("This is page 4"));
+ RunningApp.Back ();
+ RunningApp.Tap (q => q.Marked ("Page 5"));
+ RunningApp.WaitForElement (q => q.Marked ("This is page 5"));
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29363.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29363.cs
new file mode 100644
index 00000000..fbacce89
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29363.cs
@@ -0,0 +1,48 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using NUnit.Framework;
+#endif
+
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 29363, "PushModal followed immediate by PopModal crashes")]
+ public class Bugzilla29363 : TestContentPage
+ {
+ protected override void Init ()
+ {
+ var layout = new StackLayout () {HorizontalOptions = LayoutOptions.FillAndExpand, VerticalOptions = LayoutOptions.FillAndExpand};
+
+ Button modal = new Button {
+ Text = "Modal Push Pop Test",
+ Font = Font.SystemFontOfSize (25, FontAttributes.Bold),
+ HorizontalOptions = LayoutOptions.Center
+ };
+ modal.Clicked += async (object sender, EventArgs e) => {
+ var page = new ContentPage () {BackgroundColor = Color.Red};
+
+ await Navigation.PushModalAsync (page);
+
+ await Navigation.PopModalAsync (true);
+ };
+
+ layout.Children.Add (modal);
+ Content = layout;
+ }
+
+#if UITEST
+ [Test]
+ public void PushButton ()
+ {
+ RunningApp.Tap (q => q.Marked ("Modal Push Pop Test"));
+ System.Threading.Thread.Sleep (5);
+ // if it didn't crash, yay
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29453.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29453.cs
new file mode 100644
index 00000000..ce6e5e12
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla29453.cs
@@ -0,0 +1,72 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 29453, "Navigation.PopAsync(false) in Entry.Completed handler => System.ArgumentException", PlatformAffected.Android)]
+ public class Bugzilla29453 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ protected override void Init ()
+ {
+ var page1Layout = new StackLayout {
+ Children = {
+ new Label {
+ XAlign = TextAlignment.Center,
+ Text = "Page 1"
+ }
+ }
+ };
+
+ var page2Layout = new StackLayout {
+ Children = {
+ new Label {
+ XAlign = TextAlignment.Center,
+ Text = "Page 2"
+ }
+ }
+ };
+
+ var entry = new Entry { AutomationId = "entryText" };
+
+ entry.Completed += async (sender, args) => {
+ await Navigation.PopAsync (false);
+ };
+
+ page2Layout.Children.Add (entry);
+
+ var page2 = new ContentPage {
+ Content = page2Layout
+ };
+
+ var button = new Button {
+ Text = "Go to page 2",
+ AutomationId = "btnGotoPage2",
+ Command = new Command (async () => await Navigation.PushAsync (page2))
+ };
+
+ page1Layout.Children.Add (button);
+ Content = page1Layout;
+ }
+
+ #if UITEST
+ [Test]
+ public void Bugzilla29453Test ()
+ {
+ RunningApp.Screenshot ("I am at Issue Bugzilla29453");
+ RunningApp.WaitForElement (q => q.Marked ("Page 1"));
+ RunningApp.Tap (q => q.Marked ("btnGotoPage2"));
+ RunningApp.Tap (q => q.Marked ("entryText"));
+ RunningApp.EnterText ("XF");
+ RunningApp.PressEnter ();
+ RunningApp.WaitForElement (q => q.Marked ("Page 1"));
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla30317.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla30317.cs
new file mode 100644
index 00000000..7cc07709
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla30317.cs
@@ -0,0 +1,260 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+using Xamarin.UITest.Android;
+using System.Collections.Generic;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 30317, "https://bugzilla.xamarin.com/show_bug.cgi?id=30137")]
+ public class Bugzilla30317 : TestNavigationPage // or TestMasterDetailPage, etc ...
+ {
+ [Preserve (AllMembers = true)]
+ public class Bugzilla30317ListItem
+ {
+ public string Label { get; set; }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class Bugzilla30317ListCell : ViewCell
+ {
+ public Bugzilla30317ListCell()
+ {
+ var label = new Label (); ;
+ label.SetBinding(Label.TextProperty, "Label");
+ View = label;
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class Bugzilla30317Page1 : ContentPage
+ {
+ ListView _listView;
+
+ public Bugzilla30317Page1 ()
+ {
+ AutomationId = "PageOne";
+ Title = "Set ItemSource On Appearing";
+
+ _listView = new ListView ();
+
+ _listView.ItemTemplate = new DataTemplate(typeof(Bugzilla30317ListCell));
+
+ var nextPageButton = new Button {
+ AutomationId = "GoToPageTwoButton",
+ Text = "Go Page 2",
+ Command = new Command (async () => {
+ await Navigation.PushAsync (new Bugzilla30317Page2 ());
+ })
+ };
+
+ Content = new StackLayout { Children = { nextPageButton, _listView } };
+ }
+
+ protected override void OnAppearing ()
+ {
+ base.OnAppearing ();
+
+ _listView.ItemsSource = new Bugzilla30317ListItem[] {
+ new Bugzilla30317ListItem { Label = "PageOneItem1" },
+ new Bugzilla30317ListItem { Label = "PageOneItem2" },
+ new Bugzilla30317ListItem { Label = "PageOneItem3" },
+ new Bugzilla30317ListItem { Label = "PageOneItem4" },
+ new Bugzilla30317ListItem { Label = "PageOneItem5" },
+ };
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class Bugzilla30317Page2 : ContentPage
+ {
+ public Bugzilla30317Page2 ()
+ {
+ AutomationId = "PageTwo";
+ Title = "Set ItemSource in ctor";
+
+ var listView = new ListView ();
+
+ listView.ItemTemplate = new DataTemplate(typeof(Bugzilla30317ListCell));
+ listView.ItemsSource = new Bugzilla30317ListItem[] {
+ new Bugzilla30317ListItem { Label = "PageTwoItem1" },
+ new Bugzilla30317ListItem { Label = "PageTwoItem2" },
+ new Bugzilla30317ListItem { Label = "PageTwoItem3" },
+ new Bugzilla30317ListItem { Label = "PageTwoItem4" },
+ new Bugzilla30317ListItem { Label = "PageTwoItem5" },
+ };
+
+ var nextPageButton = new Button {
+ AutomationId = "GoToPageThreeButton",
+ Text = "Go Page 3",
+ Command = new Command (async () => {
+ await Navigation.PushModalAsync (new Bugzilla30317Page3 ());
+ })
+ };
+
+ Content = new StackLayout { Children = { nextPageButton, listView } };
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class Bugzilla30317Page3TabOne : ContentPage
+ {
+ public Bugzilla30317Page3TabOne ()
+ {
+ AutomationId = "TabbedPageOne";
+ Title = "TabOneCtor";
+
+ var listView = new ListView ();
+
+ listView.ItemTemplate = new DataTemplate(typeof(Bugzilla30317ListCell));
+ listView.ItemsSource = new Bugzilla30317ListItem[] {
+ new Bugzilla30317ListItem { Label = "PageThreeTabOneItem1" },
+ new Bugzilla30317ListItem { Label = "PageThreeTabOneItem2" },
+ new Bugzilla30317ListItem { Label = "PageThreeTabOneItem3" },
+ new Bugzilla30317ListItem { Label = "PageThreeTabOneItem4" },
+ new Bugzilla30317ListItem { Label = "PageThreeTabOneItem5" },
+ };
+
+ Content = listView;
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class Bugzilla30317Page3TabTwo : ContentPage
+ {
+ ListView _listView;
+
+ public Bugzilla30317Page3TabTwo ()
+ {
+ AutomationId = "TabbedPageTwo";
+ Title = "TabTwoOnAppearing";
+
+ _listView = new ListView ();
+
+ _listView.ItemTemplate = new DataTemplate(typeof(Bugzilla30317ListCell));
+
+
+ Content = _listView;
+
+ }
+
+ protected override void OnAppearing ()
+ {
+ base.OnAppearing ();
+
+ _listView.ItemsSource = new Bugzilla30317ListItem[] {
+ new Bugzilla30317ListItem { Label = "PageThreeTabTwoItem1" },
+ new Bugzilla30317ListItem { Label = "PageThreeTabTwoItem2" },
+ new Bugzilla30317ListItem { Label = "PageThreeTabTwoItem3" },
+ new Bugzilla30317ListItem { Label = "PageThreeTabTwoItem4" },
+ new Bugzilla30317ListItem { Label = "PageThreeTabTwoItem5" },
+ };
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class Bugzilla30317Page3 : TabbedPage
+ {
+ public Bugzilla30317Page3 ()
+ {
+ Children.Add (new Bugzilla30317Page3TabOne ());
+ Children.Add (new Bugzilla30317Page3TabTwo ());
+ }
+ }
+
+ protected override void Init ()
+ {
+ Navigation.PushAsync (new Bugzilla30317Page1 ());
+ }
+
+#if UITEST
+ [Test]
+ public void Bugzilla30317ItemSourceOnAppearingContentPage ()
+ {
+ if (RunningApp is AndroidApp) {
+ RunningApp.Screenshot ("I am at Bugzilla30317");
+ RunningApp.WaitForElement (q => q.Marked ("PageOne"));
+ RunningApp.Screenshot ("I see Page 1");
+
+ RunningApp.WaitForElement (q => q.Marked ("PageOneItem1"));
+ RunningApp.TouchAndHold (q => q.Marked ("PageOneItem1"));
+
+ RunningApp.WaitForElement (q => q.Marked ("PageOneItem5"));
+ RunningApp.TouchAndHold (q => q.Marked ("PageOneItem5"));
+
+ RunningApp.Screenshot ("I did not crash");
+ } else {
+ Assert.Inconclusive ("Not run on iOS");
+ }
+ }
+
+ [Test]
+ public void Bugzilla30317ItemSourceCtorContentPage ()
+ {
+ if (RunningApp is AndroidApp) {
+ RunningApp.WaitForElement (q => q.Marked ("GoToPageTwoButton"));
+ RunningApp.Tap (q => q.Marked ("GoToPageTwoButton"));
+
+ RunningApp.WaitForElement (q => q.Marked ("PageTwo"));
+ RunningApp.Screenshot ("I see Page 2");
+
+ RunningApp.WaitForElement (q => q.Marked ("PageTwoItem1"));
+ RunningApp.TouchAndHold (q => q.Marked ("PageTwoItem1"));
+
+ RunningApp.WaitForElement (q => q.Marked ("PageTwoItem5"));
+ RunningApp.TouchAndHold (q => q.Marked ("PageTwoItem5"));
+
+ RunningApp.Screenshot ("I did not crash");
+ } else {
+ Assert.Inconclusive ("Not run on iOS");
+ }
+ }
+
+ [Test]
+ public void Bugzilla30317ItemSourceTabbedPage ()
+ {
+ if (RunningApp is AndroidApp) {
+ RunningApp.WaitForElement (q => q.Marked ("GoToPageTwoButton"));
+ RunningApp.Tap (q => q.Marked ("GoToPageTwoButton"));
+
+ RunningApp.Screenshot ("I see Page 2");
+ RunningApp.WaitForElement (q => q.Marked ("PageTwo"));
+
+ RunningApp.WaitForElement (q => q.Marked ("GoToPageThreeButton"));
+ RunningApp.Tap (q => q.Marked ("GoToPageThreeButton"));
+
+ RunningApp.Screenshot ("I see TabbedPage One");
+ RunningApp.WaitForElement (q => q.Marked ("TabOneCtor"));
+
+ RunningApp.WaitForElement (q => q.Marked ("PageThreeTabOneItem1"));
+ RunningApp.TouchAndHold (q => q.Marked ("PageThreeTabOneItem1"));
+ RunningApp.WaitForElement (q => q.Marked ("PageThreeTabOneItem1"));
+
+ RunningApp.WaitForElement (q => q.Marked ("PageThreeTabOneItem5"));
+ RunningApp.TouchAndHold (q => q.Marked ("PageThreeTabOneItem5"));
+ RunningApp.WaitForElement (q => q.Marked ("PageThreeTabOneItem5"));
+
+ RunningApp.Screenshot ("I see TabbedPage Two");
+ RunningApp.WaitForElement (q => q.Marked ("TabTwoOnAppearing"));
+ RunningApp.Tap (q => q.Marked ("TabTwoOnAppearing"));
+
+ RunningApp.WaitForElement (q => q.Marked ("PageThreeTabTwoItem1"));
+ RunningApp.TouchAndHold (q => q.Marked ("PageThreeTabTwoItem1"));
+ RunningApp.WaitForElement (q => q.Marked ("PageThreeTabTwoItem1"));
+
+ RunningApp.WaitForElement (q => q.Marked ("PageThreeTabTwoItem5"));
+ RunningApp.TouchAndHold (q => q.Marked ("PageThreeTabTwoItem5"));
+ RunningApp.WaitForElement (q => q.Marked ("PageThreeTabTwoItem5"));
+ } else {
+ Assert.Inconclusive ("Not run on iOS");
+ }
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla30324.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla30324.cs
new file mode 100644
index 00000000..1356ffa7
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla30324.cs
@@ -0,0 +1,97 @@
+using System;
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 30324, "Detail view of MasterDetailPage does not get appearance events on Android when whole MasterDetailPage disappears/reappears")]
+ public class Bugzilla30324 : TestNavigationPage
+ {
+ Label _lbl;
+ int _count;
+
+ protected override void Init ()
+ {
+ MasterDetailPage page = new MasterDetailPage();
+ page.Master = new Page () { Title = "Master", BackgroundColor = Color.Red };
+ _lbl = new Label ();
+
+ var otherPage = new ContentPage () {
+ Title = "Other",
+ Content = new StackLayout { Children = {
+ new Button () {
+ Text = "navigate back",
+ HorizontalOptions = LayoutOptions.Center,
+ VerticalOptions = LayoutOptions.Center,
+
+ Command = new Command (() => Navigation.PopAsync())
+ }
+ }
+ }
+ };
+
+ page.Detail = new ContentPage () {
+ Title = "Detail",
+ Content = new StackLayout { Children = {
+ _lbl,
+ new Button () {
+ Text = "navigate",
+ HorizontalOptions = LayoutOptions.Center,
+ VerticalOptions = LayoutOptions.Center,
+
+ Command = new Command (() => Navigation.PushAsync (otherPage))
+ }
+ }
+ }
+ };
+
+ page.Appearing += (sender, e) =>
+ {
+ System.Diagnostics.Debug.WriteLine("Appear MDP");
+ };
+ page.Disappearing += (sender, e) =>
+ {
+ System.Diagnostics.Debug.WriteLine("Disappear MDP");
+ };
+ page.Detail.Appearing += (sender, args) =>
+ {
+ if(_count ==2)
+ _lbl.Text = "Appear detail";
+ System.Diagnostics.Debug.WriteLine("Appear detail");
+ };
+ page.Detail.Disappearing += (sender, args) => {
+ System.Diagnostics.Debug.WriteLine ("Disappear detail");
+ _lbl.Text = "Disappear detail";
+ page.Detail.BackgroundColor = Color.Green;
+ _count++;
+ };
+ page.Master.Appearing += (sender, e) =>
+ {
+ System.Diagnostics.Debug.WriteLine("Appear master");
+ };
+ Navigation.PushAsync (page);
+ }
+
+ #if UITEST
+ [Test]
+ public void Bugzilla30324Test ()
+ {
+ RunningApp.Tap (q => q.Marked ("navigate"));
+ RunningApp.Tap (q => q.Marked ("navigate back"));
+ RunningApp.WaitForElement (q => q.Marked ("Disappear detail"));
+ RunningApp.Tap (q => q.Marked ("navigate"));
+ RunningApp.Tap (q => q.Marked ("navigate back"));
+ RunningApp.WaitForElement (q => q.Marked ("Appear detail"));
+ }
+ #endif
+ }
+
+
+}
+
+
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla30353.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla30353.cs
new file mode 100644
index 00000000..56c5ef87
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla30353.cs
@@ -0,0 +1,113 @@
+using System;
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest.iOS;
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 30353, "MasterDetailPage.IsPresentedChanged is not raised")]
+ public class Bugzilla30353 : TestMasterDetailPage
+ {
+ protected override void Init ()
+ {
+ var lbl = new Label {
+ HorizontalOptions = LayoutOptions.CenterAndExpand,
+ VerticalOptions = LayoutOptions.CenterAndExpand,
+ Text = "Detail"
+ };
+
+ #if !UITEST
+ if (App.IOSVersion == 7) {
+ lbl.Text = "Don't run";
+ }
+ #endif
+
+ var lblMaster = new Label {
+ HorizontalOptions = LayoutOptions.CenterAndExpand,
+ VerticalOptions = LayoutOptions.CenterAndExpand,
+ Text = "Master"
+ };
+ var btn = new Button () {
+ Text = "Toggle"
+ };
+ var btn1 = new Button () {
+ Text = "Toggle"
+ };
+
+ btn.Clicked += (object sender, EventArgs e) => IsPresented = !IsPresented;
+ btn1.Clicked += (object sender, EventArgs e) => IsPresented = !IsPresented;
+
+ var stacklayout = new StackLayout ();
+ stacklayout.Children.Add (lbl);
+ stacklayout.Children.Add (btn);
+
+ var stacklayout1 = new StackLayout ();
+ stacklayout1.Children.Add (lblMaster);
+ stacklayout1.Children.Add (btn1);
+
+ Master = new ContentPage {
+ Title = "IsPresentedChanged Test",
+ BackgroundColor = Color.Green,
+ Content = stacklayout1
+ };
+ Detail = new ContentPage {
+ BackgroundColor = Color.Gray,
+ Content = stacklayout
+ };
+ MasterBehavior = MasterBehavior.Popover;
+ IsPresentedChanged += (s, e) =>
+ lblMaster.Text = lbl.Text = string.Format ("The Master is now {0}", IsPresented ? "visible" : "invisible");
+ }
+
+ #if UITEST
+ [Test]
+ public void Bugzilla30353Test ()
+ {
+ var dontRun = RunningApp.Query (q => q.Marked ("Don't run"));
+ if (dontRun.Length > 0)
+ {
+ return;
+ }
+ RunningApp.SetOrientationPortrait ();
+ RunningApp.Screenshot ("Portrait");
+ RunningApp.Tap (q => q.Marked ("Toggle"));
+ RunningApp.Screenshot ("Portrait Visible");
+ RunningApp.WaitForElement (q => q.Marked ("The Master is now visible"));
+ if (RunningApp is iOSApp)
+ RunningApp.Tap (q => q.Marked ("Toggle"));
+ else
+ RunningApp.Back ();
+ RunningApp.Screenshot ("Portrait Invisible");
+ RunningApp.WaitForElement (q => q.Marked ("The Master is now invisible"));
+ RunningApp.SetOrientationLandscape ();
+ RunningApp.Screenshot ("Landscape Invisible");
+ RunningApp.WaitForElement (q => q.Marked ("The Master is now invisible"));
+ RunningApp.Tap (q => q.Marked ("Toggle"));
+ RunningApp.Screenshot ("Landscape Visible");
+ RunningApp.WaitForElement (q => q.Marked ("The Master is now visible"));
+ if (RunningApp is iOSApp)
+ RunningApp.Tap (q => q.Marked ("Toggle"));
+ else
+ RunningApp.Back ();
+ RunningApp.Screenshot ("Landscape InVisible");
+ RunningApp.WaitForElement (q => q.Marked ("The Master is now invisible"));
+ RunningApp.SetOrientationPortrait ();
+ RunningApp.Tap (q => q.Marked ("Toggle"));
+ RunningApp.Screenshot ("Portrait Visible");
+ RunningApp.WaitForElement (q => q.Marked ("The Master is now visible"));
+ if (RunningApp is iOSApp)
+ RunningApp.Tap (q => q.Marked ("Toggle"));
+ else
+ RunningApp.Back ();
+ RunningApp.Screenshot ("Portrait Invisible");
+ RunningApp.WaitForElement (q => q.Marked ("The Master is now invisible"));
+ RunningApp.SetOrientationLandscape ();
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla30651.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla30651.cs
new file mode 100644
index 00000000..a2466b98
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla30651.cs
@@ -0,0 +1,101 @@
+using System;
+using Xamarin.Forms.CustomAttributes;
+using System.Collections.ObjectModel;
+using System.Linq;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 30651, "ListView jumps around while scrolling after items are added to its source")]
+ public class Bugzilla30651: TestContentPage
+ {
+ ListViewModel _viewModel;
+ protected override void Init ()
+ {
+ _viewModel = new ListViewModel();
+ BindingContext = _viewModel;
+ var lv = new ListView ();
+ lv.SetBinding (ListView.ItemsSourceProperty, new Binding ("Items"));
+ lv.SeparatorVisibility = SeparatorVisibility.None;
+ lv.HasUnevenRows = true;
+ lv.ItemAppearing+= (object sender, ItemVisibilityEventArgs e) => {
+ _viewModel.OnItemAppearing(e.Item.ToString());
+ };
+ lv.ItemTemplate = new DataTemplate (typeof(TestCell));
+ Content = lv;
+ }
+
+ public class TestCell : ViewCell {
+ Label _myLabel;
+ public TestCell ()
+ {
+ View = _myLabel = new Label();
+ }
+
+ protected override void OnBindingContextChanged()
+ {
+ if (BindingContext == null)
+ return;
+
+ var i = BindingContext as string;
+ _myLabel.Text = i;
+ Height = 100;
+
+ base.OnBindingContextChanged();
+ }
+ }
+
+
+ public class ListViewModel : ViewModelBase
+ {
+ ObservableCollection<string> _items;
+ int _counter = 0;
+
+ public ObservableCollection<string> Items
+ {
+ get { return _items; }
+ set { _items = value; OnPropertyChanged ();}
+ }
+
+ public ListViewModel()
+ {
+ Items = new ObservableCollection<string>();
+ AddMoreData();
+ }
+
+ public void OnItemAppearing(string s)
+ {
+ if (Items.Last() == s)
+ AddMoreData();
+ }
+
+ void AddMoreData()
+ {
+ _counter++;
+ Items.Add(_counter.ToString());
+ _counter++;
+ Items.Add(_counter.ToString());
+ _counter++;
+ Items.Add(_counter.ToString());
+ _counter++;
+ Items.Add(_counter.ToString());
+ _counter++;
+ Items.Add(_counter.ToString());
+ _counter++;
+ Items.Add(_counter.ToString());
+ _counter++;
+ Items.Add(_counter.ToString());
+ _counter++;
+ Items.Add(_counter.ToString());
+ _counter++;
+ Items.Add(_counter.ToString());
+ _counter++;
+ Items.Add(_counter.ToString());
+ _counter++;
+ Items.Add(_counter.ToString());
+ _counter++;
+ Items.Add(_counter.ToString());
+ }
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla30835.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla30835.cs
new file mode 100644
index 00000000..c4af01d6
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla30835.cs
@@ -0,0 +1,207 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+using System.Collections.Generic;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 30835, "Navigating to and from the Carousel page with MasterDetail page creates an Out of memory exception")]
+ public class Bugzilla30835 : TestMasterDetailPage // or TestMasterDetailPage, etc ...
+ {
+ protected override void Init ()
+ {
+ var menuPage = new MenuPage ();
+
+ menuPage.Menu.ItemSelected += (sender, e) => NavigateTo (e.SelectedItem as MenuItem);
+
+ Master = menuPage;
+ Detail = new NavigationPage (new HolderCarouselPages ());
+ }
+
+ void NavigateTo (MenuItem menu)
+ {
+ var displayPage = (Page)Activator.CreateInstance (menu.TargetType);
+ Detail = new NavigationPage (displayPage);
+ IsPresented = false;
+ }
+
+ [Preserve (AllMembers = true)]
+ public class HolderCarouselPages : CarouselPage
+ {
+ public HolderCarouselPages ()
+ {
+ Device.BeginInvokeOnMainThread (() => {
+ ItemsSource = new HolderImage[] {
+ new HolderImage ("frog", "photo.jpg"),
+ new HolderImage ("history", "photo.jpg"),
+ new HolderImage ("Test", "photo.jpg"),
+ };
+ });
+
+ ItemTemplate = new DataTemplate (() => new DisplayContentPage ());
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class HolderImage
+ {
+ public HolderImage (string name, string images)
+ {
+ Name = name;
+ Homeimages = images;
+ }
+
+ public string Name { private set; get; }
+
+ public string Homeimages { private set; get; }
+
+ public override string ToString ()
+ {
+ return Name;
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class DisplayContentPage : ContentPage
+ {
+ public DisplayContentPage ()
+ {
+ var imageView = new Image {
+ HorizontalOptions = LayoutOptions.Center,
+ };
+
+ Content = new StackLayout {
+ Children = {
+ new StackLayout {
+ HorizontalOptions = LayoutOptions.Center,
+ VerticalOptions = LayoutOptions.StartAndExpand,
+ Children = {
+ imageView
+ }
+ },
+ }
+ };
+ imageView.SetBinding (Image.SourceProperty, "Homeimages");
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class MenuPage : ContentPage
+ {
+ public ListView Menu { get; set; }
+
+ public MenuPage ()
+ {
+ Icon = "bank.png";
+ Title = "Carsousel Memory Bug";
+ BackgroundColor = Color.FromHex ("#000000");
+
+ Menu = new MenuListView ();
+
+ var menuLabel = new ContentView {
+ Padding = new Thickness (10, 36, 0, 5),
+ Content = new Label {
+ TextColor = Color.FromHex ("#FFFFFF"),
+ Text = "Carsousel Memory Bug",
+ }
+ };
+
+ var layout = new StackLayout {
+ Spacing = 0,
+ VerticalOptions = LayoutOptions.FillAndExpand,
+ };
+ layout.Children.Add (menuLabel);
+ layout.Children.Add (Menu);
+
+ Content = layout;
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class MenuListView : ListView
+ {
+ public MenuListView ()
+ {
+ List<MenuItem> data = new MenuListData ();
+
+ ItemsSource = data;
+ VerticalOptions = LayoutOptions.FillAndExpand;
+ BackgroundColor = Color.Black;
+
+ var cell = new DataTemplate (typeof(ImageCell));
+ cell.SetBinding (TextCell.TextColorProperty, "TextColor");
+ cell.SetBinding (TextCell.TextProperty, "Title");
+ cell.SetBinding (ImageCell.ImageSourceProperty, "IconSource");
+
+ ItemTemplate = cell;
+ SelectedItem = data [0];
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class MenuListData : List<MenuItem>
+ {
+ public MenuListData ()
+ {
+ Add (new MenuItem () {
+ Title = "Carousel",
+ IconSource = "icon.png",
+ TargetType = typeof(HolderCarouselPages),
+ TextColor = Color.White
+ });
+
+ Add (new MenuItem () {
+ Title = "Pic 1",
+ IconSource = "icon.png",
+ TargetType = typeof(Pic1),
+ TextColor = Color.White
+ });
+
+ Add (new MenuItem () {
+ Title = "Pic 2",
+ IconSource = "icon.png",
+ TargetType = typeof(Pic1),
+ TextColor = Color.White
+ });
+
+ Add (new MenuItem () {
+ Title = "Pic 3",
+ IconSource = "icon.png",
+ TargetType = typeof(Pic1),
+ TextColor = Color.White
+ });
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class MenuItem
+ {
+ public string Title { get; set; }
+
+ public string IconSource { get; set; }
+
+ public Type TargetType { get; set; }
+
+ public Color TextColor { get ; set; }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class Pic1 : ContentPage
+ {
+ public Pic1 ()
+ {
+ Content = new StackLayout {
+ Children = {
+ new Image { Source = "photo.jpg" }
+ }
+ };
+ }
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla30935.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla30935.cs
new file mode 100644
index 00000000..3953f63d
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla30935.cs
@@ -0,0 +1,44 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Issue (IssueTracker.Bugzilla, 30935, "NullReferenceException in ViewRenderer<TView, TNativeView> (Xamarin.Forms.Platform.Android)")]
+ public class Bugzilla30935 : TestContentPage
+ {
+ Entry _entry;
+ protected override void Init ()
+ {
+ _entry = new Entry { AutomationId = "entry" };
+ // Initialize ui here instead of ctor
+ Content = new StackLayout { Children = { new Label {
+ AutomationId = "IssuePageLabel",
+ Text = "See if I'm here"
+ },_entry
+ }
+ };
+ }
+
+ protected override void OnAppearing ()
+ {
+ _entry.Focus ();
+ Content = null;
+ base.OnAppearing ();
+ }
+
+#if UITEST
+ [Test]
+ public void Bugzilla30935DoesntThrowException ()
+ {
+ RunningApp.WaitForNoElement (q => q.Marked ("IssuePageLabel"));
+ RunningApp.WaitForNoElement (q => q.Marked ("entry"));
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31029.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31029.cs
new file mode 100644
index 00000000..9f9594a2
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31029.cs
@@ -0,0 +1,126 @@
+using System;
+using System.IO;
+using System.Text;
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 31029, "[Windows Phone 8.1]Generating an Image via MemoryStream does not appear")]
+ public class Bugzilla31029 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ protected override void Init ()
+ {
+ var generatedImage = new Image { Aspect = Aspect.AspectFit };
+
+ var btn = new Button { Text="generate" };
+
+ btn.Clicked += (sender, e) => {
+ var source = GenerateBmp (60, 60, Color.Red);
+ generatedImage.Source = source;
+
+ };
+
+ Content = new StackLayout {
+ Children = {
+ btn,
+ new Label {Text = "GeneratedImage", Font=Font.BoldSystemFontOfSize(NamedSize.Medium)},
+ generatedImage
+ },
+ Padding = new Thickness (0, 20, 0, 0),
+ VerticalOptions = LayoutOptions.StartAndExpand,
+ HorizontalOptions = LayoutOptions.CenterAndExpand
+ };
+ }
+ public ImageSource GenerateBmp (int rows, int cols, Color color)
+ {
+ BmpMaker bmpMaker = new BmpMaker (rows, cols);
+ //background color to white
+ for (int i = 0; i < rows; i++) {
+ for (int j = 0; j < cols; j++) {
+ bmpMaker.SetPixel (i, j, Color.White);
+ }
+ }
+ //draw a square
+ int marginX = rows / 10;
+ int marginY = cols / 10;
+ for (int row = marginX; row < (rows - marginX); row++) {
+ for (int col = marginY; col < (cols - marginY); col++) {
+ bmpMaker.SetPixel (row, col, color);
+ }
+ }
+ ImageSource resultImage = bmpMaker.Generate ();
+ return resultImage;
+ }
+ }
+
+ public class BmpMaker
+ {
+ const int HeaderSize = 54;
+ readonly byte[] _buffer;
+ public BmpMaker (int width, int height)
+ {
+ Width = width;
+ Height = height;
+ int numPixels = Width * Height;
+ int numPixelBytes = 4 * numPixels;
+ int fileSize = HeaderSize + numPixelBytes;
+ _buffer = new byte[fileSize];
+ // Write headers in MemoryStream and hence the buffer.
+ using (MemoryStream memoryStream = new MemoryStream (_buffer)) {
+ using (BinaryWriter writer = new BinaryWriter (memoryStream, Encoding.UTF8)) {
+ // Construct BMP header (14 bytes).
+ writer.Write (new char[] { 'B', 'M' }); // Signature
+ writer.Write (fileSize); // File size
+ writer.Write ((short) 0); // Reserved
+ writer.Write ((short) 0); // Reserved
+ writer.Write (HeaderSize); // Offset to pixels
+ // Construct BitmapInfoHeader (40 bytes).
+ writer.Write (40); // Header size
+ writer.Write (Width); // Pixel width
+ writer.Write (Height); // Pixel height
+ writer.Write ((short) 1); // Planes
+ writer.Write ((short) 32); // Bits per pixel
+ writer.Write (0); // Compression
+ writer.Write (numPixelBytes); // Image size in bytes
+ writer.Write (0); // X pixels per meter
+ writer.Write (0); // Y pixels per meter
+ writer.Write (0); // Number colors in color table
+ writer.Write (0); // Important color count
+ }
+ }
+ }
+
+ public int Width { get; private set; }
+ public int Height { get; private set; }
+
+ public void SetPixel (int row, int col, Color color)
+ {
+ SetPixel (row, col, (int) (255 * color.R),
+ (int) (255 * color.G),
+ (int) (255 * color.B),
+ (int) (255 * color.A));
+ }
+
+ public void SetPixel (int row, int col, int r, int g, int b, int a = 255)
+ {
+ int index = (row * Width + col) * 4 + HeaderSize;
+ _buffer[index + 0] = (byte) b;
+ _buffer[index + 1] = (byte) g;
+ _buffer[index + 2] = (byte) r;
+ _buffer[index + 3] = (byte) a;
+ }
+
+ public ImageSource Generate ()
+ {
+ Stream memoryStream = new MemoryStream (_buffer);
+ ImageSource imageSource = ImageSource.FromStream (() => { return memoryStream; });
+ return imageSource;
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31114.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31114.cs
new file mode 100644
index 00000000..e7f5be4d
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31114.cs
@@ -0,0 +1,421 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+using System.Collections.ObjectModel;
+
+#if UITEST
+using Xamarin.UITest.iOS;
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 31114, "iOS ContextAction leaves blank line after swiping in ListView")]
+ public class Bugzilla31114 : TestContentPage
+ {
+ ObservableCollection<ListItem> _items = new ObservableCollection<ListItem>();
+ ListView _listView;
+ Button _btbLoad;
+ public Command RefreshListCommand;
+ bool _isBusy = false;
+
+ protected override void Init ()
+ {
+
+ RefreshListCommand = new Command(LoadItemsFromCommand, CanRefreshList);
+ _listView = new ListView();
+ _listView.ItemsSource = _items;
+ _listView.ItemTemplate = new DataTemplate(typeof(TaskItemTemplate));
+ _listView.RowHeight = 64;
+ _listView.RefreshCommand = RefreshListCommand;
+ _listView.IsPullToRefreshEnabled = true;
+
+ _btbLoad = new Button { Text = "Load", AutomationId = "btnLoad", Command = RefreshListCommand };
+ TaskItemTemplate.RefreshFromQuickComplete += TaskListPageRefreshFromQuickComplete;
+
+ LoadItems();
+
+ Content = new StackLayout {
+ VerticalOptions = LayoutOptions.FillAndExpand,
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ Children = {
+ _listView,_btbLoad
+ }
+ };
+ }
+
+ protected override void OnDisappearing ()
+ {
+ TaskItemTemplate.RefreshFromQuickComplete -= TaskListPageRefreshFromQuickComplete;
+ base.OnDisappearing ();
+ }
+
+ bool CanRefreshList()
+ {
+ return !isBusy;
+ }
+
+ void LoadItemsFromCommand()
+ {
+ LoadItems();
+ }
+
+ void TaskListPageRefreshFromQuickComplete(object sender, ListItemEventArgs e)
+ {
+ Device.BeginInvokeOnMainThread(() =>
+ {
+ LoadItemsFromCommand();
+ });
+ }
+
+ void LoadItems()
+ {
+ isBusy = true;
+
+ Random random = new Random(DateTime.Now.Millisecond);
+
+ int count = random.Next(20, 30);
+
+ _items.Clear();
+
+ for (int i = 0; i < count - 1; i++)
+ {
+ var newItem = new ListItem()
+ {
+ Id = Guid.NewGuid().ToString(),
+ EntityTypeId = 1350,
+ BackgroundColor = "00aa00",
+ TextColor = "FFFFFF",
+ PrimaryText = "PIPE #"+(i+1000).ToString(),
+ CircleColor = "0000aa",
+ Icon = "",
+ OtherText = random.Next(100, 200).ToString() + " ft",
+ SecondaryText = "LENGTH " + i.ToString(),
+ SupportsQuickComplete = true,
+ };
+
+ //Debug.WriteLine(newItem.PrimaryText);
+
+ _items.Add(newItem);
+ }
+
+
+ isBusy = false;
+ }
+
+ bool isBusy
+ {
+ get { return _isBusy; }
+ set
+ {
+ _isBusy = value;
+ _listView.IsRefreshing = _isBusy;
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class ListItem
+ {
+ public string Id { get; set; }
+
+ public string PrimaryText { get; set; }
+
+ public string SecondaryText { get; set; }
+
+ public string TertiaryText { get; set; }
+
+ public string OtherText { get; set; }
+
+ public string ListControl { get; set; }
+
+ public string Icon { get; set; }
+
+ public string Params { get; set; }
+
+ public string BackgroundColor { get; set; }
+
+ public string TextColor { get; set; }
+
+ public string CircleColor { get; set; }
+
+ public long EntityTypeId { get; set; }
+
+ public bool SupportsQuickComplete { get; set; }
+
+ public ListItem ()
+ {
+ }
+
+ public string BackgroundColorColor
+ {
+ get
+ {
+ return BackgroundColor;
+ }
+ set
+ {
+ if (BackgroundColor != value)
+ {
+ BackgroundColor = value;
+ }
+ }
+ }
+
+ public string PrimaryLabelText
+ {
+ get
+ {
+ return PrimaryText;
+ }
+ }
+
+ public string SecondaryLabelText
+ {
+ get
+ {
+ return SecondaryText;
+ }
+ }
+
+ public string OtherLabelText
+ {
+ get
+ {
+ return OtherText;
+ }
+ }
+ }
+
+ public class ListItemEventArgs : EventArgs
+ {
+ public ListItem ListItem { get; set; }
+
+ public ListItemEventArgs(ListItem item)
+ {
+ ListItem = item;
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class TaskItemTemplate : ViewCell
+ {
+ Image _photo;
+ Label _mainLabel;
+ Label _secondaryLabel;
+ Label _distanceLabel;
+ Label _statusCircle;
+ StackLayout _stackLayout;
+ StackLayout _primaryContent;
+ StackLayout _secondaryContent;
+ AbsoluteLayout _masterLayout;
+
+ MenuItem _quickCompleteMenu;
+
+ public static event EventHandler<ListItemEventArgs> RefreshFromQuickComplete;
+
+ public TaskItemTemplate()
+ {
+ Init(true);
+ }
+
+ public TaskItemTemplate(bool fast = true)
+ {
+ Init(fast);
+ }
+
+ void Init(bool fast)
+ {
+ _photo = new Image
+ {
+ HeightRequest = 52,
+ WidthRequest = 52,
+ };
+
+
+ _mainLabel = new Label() { HeightRequest = 40, FontSize = 24, TranslationY = 5, LineBreakMode = LineBreakMode.TailTruncation };
+ _mainLabel.SetBinding(Label.TextProperty, "PrimaryLabelText");
+
+ _secondaryLabel = new Label() { HeightRequest = 40, FontSize = 16, TranslationY = -5, LineBreakMode = LineBreakMode.TailTruncation };
+ _secondaryLabel.SetBinding(Label.TextProperty, "SecondaryLabelText");
+
+ _distanceLabel = new Label() { XAlign = TextAlignment.End, HorizontalOptions = LayoutOptions.EndAndExpand, FontSize = 11, LineBreakMode = LineBreakMode.NoWrap };
+ _distanceLabel.SetBinding(Label.TextProperty, "OtherLabelText");
+
+ _statusCircle = new Label()
+ {
+ HorizontalOptions = LayoutOptions.EndAndExpand,
+ FontSize = 30,
+ TranslationY = 0,
+ };
+
+ _primaryContent = new StackLayout()
+ {
+ HorizontalOptions = LayoutOptions.StartAndExpand,
+ Orientation = StackOrientation.Vertical,
+ Children =
+ {
+ _mainLabel,
+ _secondaryLabel,
+ },
+ Padding = new Thickness(12, 0, 0, 0),
+ };
+
+ _secondaryContent = new StackLayout()
+ {
+ MinimumWidthRequest = 50,
+ HorizontalOptions = LayoutOptions.EndAndExpand,
+ Children =
+ {
+ _distanceLabel,
+ _statusCircle,
+ },
+ Padding = new Thickness(0, 5, 5, 0),
+ };
+
+ _stackLayout = new StackLayout
+ {
+ Orientation = StackOrientation.Horizontal,
+ Children =
+ {
+ _photo,
+ _primaryContent,
+ _secondaryContent,
+ },
+ Padding = new Thickness(5, 0, 0, 0)
+ };
+
+ if (!fast)
+ {
+ View = _stackLayout;
+ }
+ else
+ {
+ _quickCompleteMenu = new MenuItem { Text = "Complete", IsDestructive = false };
+ _quickCompleteMenu.SetBinding(MenuItem.CommandParameterProperty, new Binding("."));
+
+ // Delete context menu action
+ _quickCompleteMenu.Clicked += (sender, e) =>
+ {
+ FastCompleteForCmd(sender);
+ };
+
+ // Add this action to the cell
+ ContextActions.Add(_quickCompleteMenu);
+
+ _masterLayout = new AbsoluteLayout();
+
+ _masterLayout.Children.Add(_stackLayout);
+
+ AbsoluteLayout.SetLayoutFlags(_stackLayout, AbsoluteLayoutFlags.All);
+ AbsoluteLayout.SetLayoutBounds(_stackLayout, new Rectangle(0.0, 0.0, 1.0f, 1.0f));
+
+ View = _masterLayout;
+ }
+ }
+
+
+ protected override void OnPropertyChanged(string propertyName = null)
+ {
+ base.OnPropertyChanged(propertyName);
+ if (propertyName == "BackgroundColor")
+ {
+ var item = BindingContext as ListItem;
+ if (item != null && !string.IsNullOrEmpty(item.BackgroundColor))
+ View.BackgroundColor = Color.FromHex(item.BackgroundColor);
+ }
+ }
+
+ protected override void OnBindingContextChanged()
+ {
+ try
+ {
+ base.OnBindingContextChanged();
+ var item = BindingContext as ListItem;
+ if (item != null)
+ {
+ Color transformedColor;
+
+ if (!string.IsNullOrWhiteSpace(item.TextColor))
+ {
+ transformedColor = Color.FromHex(item.TextColor);
+
+ _mainLabel.TextColor = transformedColor;
+ _secondaryLabel.TextColor = transformedColor;
+ _distanceLabel.TextColor = transformedColor;
+ }
+
+ if (string.IsNullOrEmpty(item.Icon))
+ item.Icon = "https://beehive.blob.core.windows.net/staticimages/FeatureImages/MutantLizard01.png";
+
+ _photo.Source = new UriImageSource()
+ {
+ Uri = new Uri(item.Icon),
+ CachingEnabled = true,
+ CacheValidity = new TimeSpan(30, 0, 0, 0),
+ };
+
+ if (!string.IsNullOrWhiteSpace(item.BackgroundColor))
+ {
+ transformedColor = Color.FromHex(item.BackgroundColor);
+ View.BackgroundColor = transformedColor;
+ }
+
+ if (!string.IsNullOrWhiteSpace(item.CircleColor))
+ {
+ _statusCircle.Text = "\u25CF "; // ascii circle
+ _statusCircle.TextColor = Color.FromHex(item.CircleColor);
+ _statusCircle.FontSize = 30;
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ }
+ }
+
+ async void FastCompleteForCmd(object sender)
+ {
+ try
+ {
+ {
+ var item = BindingContext as ListItem;
+ bool success = true; // await _taskListManager.FastComplete(item);
+
+ if (success)
+ RefreshFromQuickComplete(this, new ListItemEventArgs(item));
+ }
+ }
+ catch (Exception ex)
+ {
+
+ }
+ }
+
+ }
+
+#if UITEST
+ [Test]
+ [Ignore("Fails sometimes - needs a better test")]
+ public void Bugzilla31114Test ()
+ {
+ if (RunningApp is iOSApp) {
+ for (int i = 0; i < 5; i++) {
+ RunningApp.DragCoordinates (10, 300, 10, 10);
+ }
+ RunningApp.Tap (q => q.Marked ("btnLoad"));
+ RunningApp.DragCoordinates (10, 300, 10, 10);
+ RunningApp.WaitForElement (q => q.Marked ("PIPE #1007"));
+ RunningApp.WaitForElement (q => q.Marked ("PIPE #1008"));
+ RunningApp.WaitForElement (q => q.Marked ("PIPE #1009"));
+ RunningApp.DragCoordinates (10, 300, 10, 10);
+ RunningApp.WaitForElement (q => q.Marked ("PIPE #1010"));
+ RunningApp.WaitForElement (q => q.Marked ("PIPE #1011"));
+ RunningApp.WaitForElement (q => q.Marked ("PIPE #1012"));
+ RunningApp.WaitForElement (q => q.Marked ("PIPE #1013"));
+ }
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31145.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31145.cs
new file mode 100644
index 00000000..9e1d7916
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31145.cs
@@ -0,0 +1,67 @@
+using System;
+using System.Threading.Tasks;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve(AllMembers = true)]
+ [Issue(IssueTracker.Bugzilla, 31145, "Picker cause memory leak holding entire Page in memory after it popped (WP8 SL only)", PlatformAffected.WinPhone)]
+ public class Bugzilla31145 : TestContentPage
+ {
+ WeakReference _page2Tracker;
+ Label _resultLabel;
+
+ protected override void Init()
+ {
+ var instructions = new Label () { Text = "The counter below should say 'Page2 IsAlive = false' after a short period of time. If the counter does not say that within 5 seconds, this test has failed." };
+ _resultLabel = new Label ();
+ Content = new StackLayout { Children = { instructions, _resultLabel } };
+ }
+
+ protected override async void OnAppearing()
+ {
+ base.OnAppearing();
+
+ if (_page2Tracker == null)
+ {
+ var page2 = new Bugzilla31145Page2();
+
+ _page2Tracker = new WeakReference(page2, false);
+
+ await Task.Yield();
+ await Navigation.PushModalAsync(page2);
+
+ StartTrackPage2();
+ }
+ }
+
+ async void StartTrackPage2()
+ {
+ var n = 0;
+ while (_page2Tracker.IsAlive)
+ {
+ _resultLabel.Text = $"Page2 IsAlive = {_page2Tracker.IsAlive} ({n++})";
+ await Task.Delay(1000);
+ GC.Collect();
+ }
+
+ _resultLabel.Text = $"Page2 IsAlive = {_page2Tracker.IsAlive}";
+ }
+ }
+
+ public class Bugzilla31145Page2 : ContentPage
+ {
+ public Bugzilla31145Page2()
+ {
+ Content = new Picker();
+ }
+
+ protected override async void OnAppearing()
+ {
+ base.OnAppearing();
+
+ await Task.Yield();
+ await Navigation.PopModalAsync();
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31255.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31255.cs
new file mode 100644
index 00000000..378077e0
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31255.cs
@@ -0,0 +1,88 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+using System.Threading.Tasks;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 31255, "Master's page Icon cause memory leak after MasterDetailPage is popped out by holding on page")]
+ public class Bugzilla31255 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ protected override void Init ()
+ {
+ var stack = new StackLayout () { VerticalOptions = LayoutOptions.Center };
+
+ stack.Children.Add (new Label () { VerticalOptions =
+ LayoutOptions.Center, XAlign = TextAlignment.Center, Text = "Page 1"
+ });
+
+ Content = stack;
+
+ }
+
+ WeakReference _page2Tracker;
+
+ protected override async void OnAppearing ()
+ {
+ base.OnAppearing ();
+
+ if (_page2Tracker == null) {
+ var page2 = new Page2 ();
+
+ _page2Tracker = new WeakReference (page2, false);
+
+ await Task.Delay (1000);
+ await Navigation.PushModalAsync (page2);
+
+ StartTrackPage2 ();
+ }
+ }
+
+ async void StartTrackPage2 ()
+ {
+ while (true) {
+ ((Label)((StackLayout)Content).Children [0]).Text =
+ string.Format ("Page1. But Page2 IsAlive = {0}", _page2Tracker.IsAlive);
+ await Task.Delay (1000);
+ GC.Collect ();
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class Page2 : MasterDetailPage
+ {
+ public Page2 ()
+ {
+ Master = new Page () { Title = "Master",
+ Icon = "Icon.png"
+ };
+ Detail = new Page () { Title = "Detail" };
+ }
+
+ protected override async void OnAppearing ()
+ {
+ base.OnAppearing ();
+
+ await Task.Delay (1000);
+ await Navigation.PopModalAsync ();
+ }
+ }
+
+ #if UITEST
+ [Test]
+ [Ignore("Fails intermittently on TestCloud")]
+ public async void Bugzilla31255Test ()
+ {
+ RunningApp.Screenshot ("I am at Bugzilla 31255");
+ await Task.Delay (5000);
+ RunningApp.WaitForElement (q => q.Marked ("Page1. But Page2 IsAlive = False"));
+ }
+ #endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31330.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31330.cs
new file mode 100644
index 00000000..5f7e14ec
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31330.cs
@@ -0,0 +1,163 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+using System.Collections.ObjectModel;
+using System.Windows.Input;
+
+
+#if UITEST
+using Xamarin.UITest.iOS;
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 31330, "Disabled context actions appear enabled")]
+ public class Bugzilla31330 : TestContentPage
+ {
+ protected override void Init ()
+ {
+ var vm = new ListViewModel ();
+ BindingContext = vm;
+ vm.Init ();
+ var listview = new ListView ();
+ listview.SetBinding (ListView.ItemsSourceProperty, new Binding ("Items"));
+ listview.ItemTemplate = new DataTemplate (typeof(CustomTextCell));
+ listview.ItemSelected += (object sender, SelectedItemChangedEventArgs e) => {
+ (e.SelectedItem as ListItemViewModel).CanExecute = true;
+ ((e.SelectedItem as ListItemViewModel).DeleteItemCommand as Command).ChangeCanExecute ();
+ };
+ // Initialize ui here instead of ctor
+ Content = listview;
+ }
+
+ [Preserve (AllMembers = true)]
+ public class CustomTextCell : TextCell
+ {
+ public CustomTextCell ()
+ {
+ SetBinding (TextProperty, new Binding ("Title"));
+ var deleteMenuItem = new MenuItem ();
+ deleteMenuItem.Text = "Delete";
+ deleteMenuItem.IsDestructive = true;
+ deleteMenuItem.SetBinding (MenuItem.CommandProperty, new Binding ("DeleteItemCommand"));
+ ContextActions.Add (deleteMenuItem);
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class ListViewModel : ViewModel
+ {
+ public void Init ()
+ {
+ Items.Add (new ListItemViewModel (this) { Title = string.Format ("Something {0}", Items.Count.ToString ()) });
+ Items.Add (new ListItemViewModel (this) { Title = string.Format ("Something {0}", Items.Count.ToString ()) });
+ Items.Add (new ListItemViewModel (this) { Title = string.Format ("Something {0}", Items.Count.ToString ()) });
+ }
+
+ public ObservableCollection<ListItemViewModel> Items { get; } = new ObservableCollection<ListItemViewModel>();
+
+ ICommand _disabledCommand;
+
+ public ICommand DisabledCommand {
+ get {
+ if (_disabledCommand == null) {
+ _disabledCommand = new Command (() => {
+ }, () => false);
+ }
+
+ return _disabledCommand;
+ }
+ }
+
+ ICommand _addItemCommand;
+
+ public ICommand AddItemCommand {
+ get {
+ if (_addItemCommand == null) {
+ _addItemCommand = new Command (() => Items.Add (new ListItemViewModel (this) { Title = string.Format ("Something {0}", Items.Count.ToString ()) }));
+ }
+
+ return _addItemCommand;
+ }
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class ListItemViewModel : ViewModel
+ {
+ public bool CanExecute = false;
+ readonly ListViewModel _listViewModel;
+
+ public ListItemViewModel (ListViewModel listViewModel)
+ {
+ if (listViewModel == null) {
+ throw new ArgumentNullException ("listViewModel");
+ }
+ _listViewModel = listViewModel;
+ }
+
+ public string Title { get; set; }
+
+ ICommand _deleteItemCommand;
+
+ public ICommand DeleteItemCommand {
+ get {
+ if (_deleteItemCommand == null) {
+ _deleteItemCommand = new Command (() => _listViewModel.Items.Remove (this), () => CanExecute);
+ }
+
+ return _deleteItemCommand;
+ }
+ }
+
+ ICommand _otherCommand;
+
+ public ICommand OtherCommand {
+ get {
+ if (_otherCommand == null) {
+ _otherCommand = new Command (() => {
+ }, () => false);
+ }
+
+ return _otherCommand;
+ }
+ }
+ }
+
+ #if UITEST
+ [Test]
+ public void Bugzilla31330Test ()
+ {
+ var screenBounds = RunningApp.Query (q => q.Raw ("* index:0"))[0].Rect;
+
+ var cell = RunningApp.Query (c => c.Marked ("Something 1")) [0];
+ var cell2 = RunningApp.Query (c => c.Marked ("Something 2")) [0];
+ if (RunningApp is iOSApp) {
+ RunningApp.DragCoordinates (screenBounds.Width - 10, cell.Rect.CenterY, 0, cell.Rect.CenterY);
+ RunningApp.WaitForElement (c => c.Marked ("Delete"));
+ RunningApp.Tap (c => c.Marked ("Delete"));
+ RunningApp.WaitForElement (c => c.Marked ("Something 1"));
+ RunningApp.Tap (c => c.Marked ("Something 2"));
+ RunningApp.DragCoordinates (screenBounds.Width - 10, cell2.Rect.CenterY, 0, cell2.Rect.CenterY);
+ RunningApp.Tap (c => c.Marked ("Delete"));
+ RunningApp.WaitForNoElement (c => c.Marked ("Something 2"));
+ }
+ else {
+ RunningApp.TouchAndHoldCoordinates (cell.Rect.CenterX, cell.Rect.CenterY);
+ RunningApp.WaitForElement (c => c.Marked ("Delete"));
+ RunningApp.Tap (c => c.Marked ("Delete"));
+ RunningApp.Back ();
+ RunningApp.WaitForElement (c => c.Marked ("Something 1"));
+ RunningApp.Tap (c => c.Marked ("Something 2"));
+ RunningApp.TouchAndHoldCoordinates (cell2.Rect.CenterX, cell2.Rect.CenterY);
+ RunningApp.Tap (c => c.Marked ("Delete"));
+ RunningApp.WaitForNoElement (c => c.Marked ("Something 2"));
+ }
+
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31333.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31333.cs
new file mode 100644
index 00000000..3d8f68d7
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31333.cs
@@ -0,0 +1,256 @@
+using System;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using Xamarin.Forms.CustomAttributes;
+#if UITEST
+using NUnit.Framework;
+using Xamarin.UITest;
+
+#endif
+
+namespace Xamarin.Forms.Controls.TestCasesPages
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Bugzilla, 31333,
+ "Focus() on Entry in ViewCell brings up keyboard, but doesn't have cursor in EditText", PlatformAffected.Android)]
+ public class Bugzilla31333 : TestContentPage
+ {
+ [Preserve (AllMembers=true)]
+ public class Model31333 : INotifyPropertyChanged
+ {
+ public string Data
+ {
+ get { return _data; }
+ set
+ {
+ _data = value;
+ OnPropertyChanged ();
+ }
+ }
+
+ bool _isFocused = false;
+ string _data;
+
+ public bool IsFocused
+ {
+ get { return _isFocused; }
+ set
+ {
+ _isFocused = value;
+ OnPropertyChanged ();
+ }
+ }
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ protected virtual void OnPropertyChanged ([CallerMemberName] string propertyName = null)
+ {
+ PropertyChanged?.Invoke (this, new PropertyChangedEventArgs (propertyName));
+ }
+ }
+
+ [Preserve (AllMembers=true)]
+ public interface IHaveControlFocusedProperty
+ {
+ void SetBinding ();
+ }
+
+ [Preserve (AllMembers=true)]
+ public class ExtendedEntry : Entry, IHaveControlFocusedProperty
+ {
+ public static readonly BindableProperty IsControlFocusedProperty =
+ BindableProperty.Create ("IsControlFocused", typeof(bool), typeof(ExtendedEntry), false);
+
+ public bool IsControlFocused
+ {
+ get { return (bool)GetValue (IsControlFocusedProperty); }
+ set { SetValue (IsControlFocusedProperty, value); }
+ }
+
+ protected override void OnPropertyChanged (string propertyName = null)
+ {
+ base.OnPropertyChanged (propertyName);
+ if (propertyName == IsControlFocusedProperty.PropertyName) {
+ if (IsControlFocused) {
+ Focus ();
+ } else {
+ Unfocus ();
+ }
+ }
+ }
+
+ public void SetBinding ()
+ {
+ this.SetBinding (IsControlFocusedProperty, "IsFocused");
+ }
+ }
+
+ [Preserve (AllMembers=true)]
+ public class ExtendedEditor : Editor, IHaveControlFocusedProperty
+ {
+ public static readonly BindableProperty IsControlFocusedProperty =
+ BindableProperty.Create ("IsControlFocused", typeof(bool), typeof(ExtendedEditor), false);
+
+ public bool IsControlFocused
+ {
+ get { return (bool)GetValue (IsControlFocusedProperty); }
+ set { SetValue (IsControlFocusedProperty, value); }
+ }
+
+ protected override void OnPropertyChanged (string propertyName = null)
+ {
+ base.OnPropertyChanged (propertyName);
+ if (propertyName == IsControlFocusedProperty.PropertyName) {
+ if (IsControlFocused) {
+ Focus ();
+ } else {
+ Unfocus ();
+ }
+ }
+ }
+
+ public void SetBinding ()
+ {
+ this.SetBinding (IsControlFocusedProperty, "IsFocused");
+ }
+ }
+
+ [Preserve (AllMembers=true)]
+ public class ExtendedCell<T> : ViewCell where T : View, IHaveControlFocusedProperty
+ {
+ public ExtendedCell ()
+ {
+ var control = (T)Activator.CreateInstance (typeof(T));
+ control.SetBinding ();
+ control.HorizontalOptions = LayoutOptions.FillAndExpand;
+
+ View = new StackLayout {
+ Orientation = StackOrientation.Horizontal,
+ HorizontalOptions = LayoutOptions.StartAndExpand,
+ Children = {
+ control
+ }
+ };
+ }
+ }
+
+ StackLayout CreateListViewTestSection (Type controlType)
+ {
+ var name = controlType.GenericTypeArguments[0].Name;
+ name = name.Replace ("Extended", "");
+
+ var button = new Button () { Text = $"Focus {name} in ListView" };
+
+ var data = new ObservableCollection<Model31333> { new Model31333 () };
+
+ var listView = new ListView {
+ VerticalOptions = LayoutOptions.Start,
+ ItemsSource = data,
+ ItemTemplate = new DataTemplate (controlType)
+ };
+
+ button.Clicked += (sender, args) => {
+ var item = data[0];
+ if (item != null) {
+ item.IsFocused = !item.IsFocused;
+ }
+ };
+
+ return new StackLayout () { Children = { button, listView } };
+ }
+
+ StackLayout CreateTableViewTestSection<T> () where T : View, IHaveControlFocusedProperty
+ {
+ var name = typeof(T).Name;
+ name = name.Replace ("Extended", "");
+
+ var button = new Button () { Text = $"Focus {name} in Table" };
+
+ var data = new Model31333 ();
+
+ var tableView = new TableView {
+ VerticalOptions = LayoutOptions.Start
+ };
+
+ var tableRoot = new TableRoot();
+ var tableSection = new TableSection();
+
+ var cell = new ExtendedCell<T> ();
+
+ cell.BindingContext = data;
+
+ tableSection.Add(cell);
+ tableRoot.Add (tableSection);
+ tableView.Root = tableRoot;
+
+ button.Clicked += (sender, args) => {
+ var item = data;
+ if (item != null) {
+ item.IsFocused = !item.IsFocused;
+ }
+ };
+
+ return new StackLayout () { Children = { button, tableView } };
+ }
+
+ protected override void Init ()
+ {
+ var entrySection = CreateListViewTestSection (typeof(ExtendedCell<ExtendedEntry>));
+ var editorSection = CreateListViewTestSection (typeof(ExtendedCell<ExtendedEditor>));
+
+ var entryTableSection = CreateTableViewTestSection<ExtendedEntry> ();
+ var editorTableSection = CreateTableViewTestSection<ExtendedEditor> ();
+
+ Content = new StackLayout () { Children = { entrySection, editorSection, entryTableSection, editorTableSection } };
+ }
+
+#if UITEST
+ [Test]
+ [UiTest (typeof(NavigationPage))]
+ public void Issue31333FocusEntryInListViewCell ()
+ {
+ RunningApp.Tap (q => q.Marked ("Focus Entry in ListView"));
+ RunningApp.Screenshot ("Entry control in ListView cell is focused");
+ RunningApp.EnterText ("Entry in ListView Success");
+ Assert.True(RunningApp.Query(query => query.Text("Entry in ListView Success")).Length > 0);
+ RunningApp.Screenshot ("Entry in ListView Success");
+ }
+
+ [Test]
+ [UiTest (typeof(NavigationPage))]
+ public void Issue31333FocusEditorInListViewCell ()
+ {
+ RunningApp.Tap (q => q.Marked ("Focus Editor in ListView"));
+ RunningApp.Screenshot ("Editor control in ListView cell is focused");
+ RunningApp.EnterText ("Editor in ListView Success");
+ Assert.True(RunningApp.Query(query => query.Text("Editor in ListView Success")).Length > 0);
+ RunningApp.Screenshot ("Editor in ListView Success");
+ }
+
+
+ [Test]
+ [UiTest (typeof(NavigationPage))]
+ public void Issue31333FocusEntryInTableViewCell ()
+ {
+ RunningApp.Tap (q => q.Marked ("Focus Entry in Table"));
+ RunningApp.Screenshot ("Entry control in TableView cell is focused");
+ RunningApp.EnterText ("Entry in TableView Success");
+ Assert.True(RunningApp.Query(query => query.Text("Entry in TableView Success")).Length > 0);
+ RunningApp.Screenshot ("Entry in TableView Success");
+ }
+
+ [Test]
+ [UiTest (typeof(NavigationPage))]
+ public void Issue31333FocusEditorInTableViewCell ()
+ {
+ RunningApp.Tap (q => q.Marked ("Focus Editor in Table"));
+ RunningApp.Screenshot ("Editor control in TableView cell is focused");
+ RunningApp.EnterText ("Editor in TableView Success");
+ Assert.True(RunningApp.Query(query => query.Text("Editor in TableView Success")).Length > 0);
+ RunningApp.Screenshot ("Editor in TableView Success");
+ }
+#endif
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31366.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31366.cs
new file mode 100644
index 00000000..75853f1d
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31366.cs
@@ -0,0 +1,85 @@
+using System;
+using System.Threading.Tasks;
+using Xamarin.Forms.CustomAttributes;
+#if UITEST
+using NUnit.Framework;
+using Xamarin.UITest;
+
+#endif
+
+namespace Xamarin.Forms.Controls.TestCasesPages
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 31366, "Pushing and then popping a page modally causes ArgumentOutOfRangeException",
+ PlatformAffected.All)]
+ public class Bugzilla31366 : TestNavigationPage
+ {
+ protected override void Init ()
+ {
+ var page1 = new ContentPage () { Title = "Page1" };
+
+ var successLabel = new Label ();
+ var startPopOnAppearing = new Button () { Text = "Start PopOnAppearing Test" };
+ var startModalStack = new Button () { Text = "Start ModalStack Test" };
+
+ page1.Content = new StackLayout () {
+ Children = { startPopOnAppearing, startModalStack, successLabel }
+ };
+
+ var popOnAppearing = new ContentPage () {
+ Title = "PopOnAppearing",
+ Content = new StackLayout ()
+ };
+
+ popOnAppearing.Appearing += async (sender, args) => {
+ await Task.Yield ();
+ await popOnAppearing.Navigation.PopModalAsync ();
+ };
+
+ startPopOnAppearing.Clicked += async (sender, args) => {
+ successLabel.Text = string.Empty;
+
+ await page1.Navigation.PushModalAsync (popOnAppearing);
+
+ successLabel.Text = "If this is visible, the PopOnAppearing test has passed.";
+ };
+
+ startModalStack.Clicked += async (sender, args) => {
+ successLabel.Text = string.Empty;
+
+ var intermediatePage = new ContentPage () {
+ Content = new StackLayout () {
+ Children = {
+ new Label () { Text = "If this is visible, the modal stack test has passed." }
+ }
+ }
+ };
+
+ await intermediatePage.Navigation.PushModalAsync (popOnAppearing);
+
+ await page1.Navigation.PushModalAsync (intermediatePage);
+ };
+
+ PushAsync (page1);
+ }
+
+
+#if UITEST
+ [Test]
+ [UiTest (typeof (NavigationPage))]
+ public void Issue31366PushingAndPoppingModallyCausesArgumentOutOfRangeException ()
+ {
+ RunningApp.Tap (q => q.Marked ("Start PopOnAppearing Test"));
+ RunningApp.WaitForElement (q => q.Marked ("If this is visible, the PopOnAppearing test has passed."));
+ }
+
+ [Test]
+ [UiTest (typeof (NavigationPage))]
+ public void Issue31366PushingWithModalStackCausesIncorrectStackOrder ()
+ {
+ RunningApp.Tap (q => q.Marked ("Start ModalStack Test"));
+ RunningApp.WaitForElement (q => q.Marked ("If this is visible, the modal stack test has passed."));
+ }
+#endif
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31395.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31395.cs
new file mode 100644
index 00000000..57b9b98c
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31395.cs
@@ -0,0 +1,54 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ // don't forget to update C:\Users\chrisk\Documents\git\DuploBuddy\Xamarin.Forms.ControlGallery.Android\LinkerRoots.cs
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 31395, "Crash when switching MainPage and using a Custom Render")]
+ public class Bugzilla31395 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ protected override void Init ()
+ {
+ Content = new CustomContentView { // Replace with ContentView and everything works fine
+ Content = new StackLayout {
+ VerticalOptions = LayoutOptions.Center,
+ Children = {
+ new Button {
+ Text = "Switch Main Page",
+ Command = new Command (() => SwitchMainPage ())
+ }
+ }
+ }
+ };
+ }
+
+ void SwitchMainPage ()
+ {
+ Application.Current.MainPage = new ContentPage { Content = new Label { Text = "Hello" } };
+ }
+
+ public class CustomContentView : ContentView
+ {
+
+ }
+
+ #if UITEST
+ [Test]
+ public void Bugzilla31395Test ()
+ {
+ RunningApp.WaitForElement (q => q.Marked ("Switch Main Page"));
+ Assert.DoesNotThrow (() => {
+ RunningApp.Tap (c => c.Marked ("Switch Main Page"));
+ });
+ RunningApp.WaitForElement (q => q.Marked ("Hello"));
+ }
+ #endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31602.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31602.cs
new file mode 100644
index 00000000..86e8bcb4
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31602.cs
@@ -0,0 +1,130 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+using System.ComponentModel;
+using System.Runtime.CompilerServices;
+using System.Windows.Input;
+
+#if UITEST
+using Xamarin.UITest;
+using Xamarin.UITest.iOS;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 31602, "not possible to programmatically open master page after iPad landscape -> portrait rotation, also tests 31664")]
+ public class Bugzilla31602 : TestMasterDetailPage
+ {
+ protected override void Init ()
+ {
+ BindingContext = new MasterViewModel1 ();
+ ((MasterViewModel1)BindingContext).MasterPage = this;
+
+ Master = new SidemenuPage ();
+ Detail = new NavigationPage (new DetailPage1 (Master as SidemenuPage));
+ }
+
+ public class SidemenuPage : ContentPage
+ {
+ public SidemenuPage ()
+ {
+ Title = "Side";
+ Icon = "menuIcon.png";
+ var lbl = new Label { Text = "SideMenu" };
+ var btn = new Button { Text = "Menu Opener" };
+
+ btn.SetBinding (Button.CommandProperty, new Binding ("OpenSideMenuCommand"));
+
+ var stackpanel = new StackLayout { VerticalOptions = LayoutOptions.Center };
+
+ stackpanel.Children.Add (btn);
+ stackpanel.Children.Add (lbl);
+ Content = stackpanel;
+ }
+
+ public void ChangeIcon() {
+ Icon = "bank.png";
+ }
+ }
+
+ public class DetailPage1 : ContentPage
+ {
+ SidemenuPage _sideMenu;
+
+ public DetailPage1 (SidemenuPage menu)
+ {
+ _sideMenu = menu;
+ Title = "Detail";
+ var btns = new Button { Text = "Change Icon" };
+ btns.Clicked += (object sender, EventArgs e) => {
+ _sideMenu.ChangeIcon();
+ };
+ var btn = new Button { Text = "Sidemenu Opener" };
+ btn.SetBinding (Button.CommandProperty, new Binding ("OpenSideMenuCommand"));
+ Content = new StackLayout { Children = { btns, btn} };
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class MasterViewModel1 : INotifyPropertyChanged
+ {
+ public MasterDetailPage MasterPage;
+
+ public event PropertyChangedEventHandler PropertyChanged = delegate { };
+
+ protected void OnPropertyChanged ([CallerMemberName] string propertyName = null)
+ {
+ if (PropertyChanged != null) {
+ PropertyChanged (this, new PropertyChangedEventArgs (propertyName));
+ }
+ }
+
+ bool _isMenuOpen;
+
+ public bool IsMenuOpen {
+ get { return _isMenuOpen; }
+ private set {
+ if (_isMenuOpen != value) {
+ System.Diagnostics.Debug.WriteLine ("setting new sidemenu visibility flag to: " + value);
+ _isMenuOpen = value;
+ OnPropertyChanged ();
+ }
+ }
+ }
+
+ public ICommand OpenSideMenuCommand { get; private set; }
+
+ public MasterViewModel1 ()
+ {
+ IsMenuOpen = true;
+ OpenSideMenuCommand = new Command (OpenSideMenu);
+ }
+
+ void OpenSideMenu ()
+ {
+ IsMenuOpen = true;
+ MasterPage.IsPresented = IsMenuOpen;
+ }
+ }
+
+ #if UITEST
+ [Test]
+ public void Bugzilla31602Test ()
+ {
+ var appAs = RunningApp as iOSApp;
+ if (appAs != null && appAs.Device.IsTablet) {
+ RunningApp.Tap (q => q.Marked ("Sidemenu Opener"));
+ RunningApp.WaitForElement (q => q.Marked ("SideMenu"));
+ RunningApp.SetOrientationLandscape ();
+ RunningApp.WaitForElement (q => q.Marked ("SideMenu"));
+ RunningApp.SetOrientationPortrait ();
+ RunningApp.WaitForNoElement (q => q.Marked ("SideMenu"));
+ RunningApp.Tap (q => q.Marked ("Sidemenu Opener"));
+ RunningApp.WaitForElement (q => q.Marked ("SideMenu"));
+ }
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31964.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31964.cs
new file mode 100644
index 00000000..da673f8f
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31964.cs
@@ -0,0 +1,116 @@
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 31964, "[Xamarin.Forms SwitchCell]OnChange() did not work for Windows platform",
+ PlatformAffected.WinRT)]
+ public class Bugzilla31964 : TestContentPage
+ {
+ protected override void Init ()
+ {
+ var listView = new ListView ();
+
+ var selection = new Selection ();
+ listView.SetBinding (ListView.ItemsSourceProperty, "Items");
+
+ listView.ItemTemplate = new DataTemplate (() => {
+ var cell = new SwitchCell ();
+ cell.SetBinding (SwitchCell.TextProperty, "Name");
+ cell.SetBinding (SwitchCell.OnProperty, "IsSelected", BindingMode.TwoWay);
+ return cell;
+ });
+
+ var instructions = new Label {
+ FontSize = 16,
+ Text =
+ "The label at the bottom should equal the number of switches which are in the 'on' position. Flip some of the switches. If the number at the bottom does not equal the number of 'on' switches, the test has failed."
+ };
+
+ var label = new Label { FontSize = 24 };
+ label.SetBinding (Label.TextProperty, "SelectedCount");
+
+ Content = new StackLayout {
+ VerticalOptions = LayoutOptions.Fill,
+ Children = {
+ instructions,
+ listView,
+ label
+ }
+ };
+
+ BindingContext = selection;
+ }
+
+ [Preserve (AllMembers = true)]
+ public class SelectionItem : INotifyPropertyChanged
+ {
+ bool _isSelected;
+
+ public string Name { get; set; }
+
+ public bool IsSelected
+ {
+ get { return _isSelected; }
+ set
+ {
+ _isSelected = value;
+ OnPropertyChanged ();
+ }
+ }
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ void OnPropertyChanged ([CallerMemberName] string propertyName = null)
+ {
+ PropertyChanged?.Invoke (this, new PropertyChangedEventArgs (propertyName));
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class Selection : INotifyPropertyChanged
+ {
+ int _selectedCount;
+
+ public Selection ()
+ {
+ Items = new List<SelectionItem> {
+ new SelectionItem { Name = "Item1" },
+ new SelectionItem { Name = "Item2" },
+ new SelectionItem { Name = "Item3", IsSelected = true },
+ new SelectionItem { Name = "Item4" },
+ new SelectionItem { Name = "Item5" }
+ };
+
+ SelectedCount = Items.Count (i => i.IsSelected);
+
+ foreach (SelectionItem selectionItem in Items) {
+ selectionItem.PropertyChanged += (sender, args) => SelectedCount = Items.Count (i => i.IsSelected);
+ }
+ }
+
+ public List<SelectionItem> Items { get; }
+
+ public int SelectedCount
+ {
+ get { return _selectedCount; }
+ set
+ {
+ _selectedCount = value;
+ OnPropertyChanged ();
+ }
+ }
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ void OnPropertyChanged ([CallerMemberName] string propertyName = null)
+ {
+ PropertyChanged?.Invoke (this, new PropertyChangedEventArgs (propertyName));
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31967.xaml b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31967.xaml
new file mode 100644
index 00000000..3cc33841
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31967.xaml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
+ xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+ x:Class="Xamarin.Forms.Controls.Bugzilla31967">
+ <Grid VerticalOptions="Start"
+ Padding = "20">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="auto" />
+ <RowDefinition Height="{Binding Path=ToolbarHeight,Mode=TwoWay}" />
+ </Grid.RowDefinitions>
+ <Button Text="Click"
+ Command="{Binding Fire}"/>
+ <Label Grid.Row="1"
+ Text="Hello there"
+ BackgroundColor="Red"
+ VerticalOptions="FillAndExpand"/>
+ </Grid>
+</ContentPage> \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31967.xaml.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31967.xaml.cs
new file mode 100644
index 00000000..acb8230e
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla31967.xaml.cs
@@ -0,0 +1,47 @@
+using System;
+using System.Collections.Generic;
+
+using Xamarin.Forms.CustomAttributes;
+
+using Xamarin.Forms;
+using System.ComponentModel;
+
+namespace Xamarin.Forms.Controls
+{
+#if APP
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 31967, "Grid Layout on Bound RowDefinition")]
+ public partial class Bugzilla31967 : ContentPage
+ {
+ public Bugzilla31967 ()
+ {
+ InitializeComponent ();
+ BindingContext = new Bugzilla31967Vm ();
+ }
+
+ public class Bugzilla31967Vm: INotifyPropertyChanged {
+ public Command Fire {
+ get { return new Command (() => ToolbarHeight = 50); }
+ }
+
+ GridLength _toolbarHeight;
+ public GridLength ToolbarHeight {
+ get { return _toolbarHeight; }
+ set {
+ _toolbarHeight = value;
+ OnPropertyChanged ("ToolbarHeight");
+ }
+ }
+
+ protected void OnPropertyChanged (string propertyName)
+ {
+ var handler = PropertyChanged;
+ if (handler != null)
+ handler (this, new PropertyChangedEventArgs (propertyName));
+ }
+
+ public event PropertyChangedEventHandler PropertyChanged;
+ }
+ }
+#endif
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32034.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32034.cs
new file mode 100644
index 00000000..97ccad1a
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32034.cs
@@ -0,0 +1,31 @@
+using System.Collections.Generic;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Bugzilla, 32034, "MissingMethodException while pushing and popping pages",PlatformAffected.Android, NavigationBehavior.PushModalAsync)]
+ public class Bugzilla32034 : NavigationPage
+ {
+ public class ButtonPage : ContentPage
+ {
+ public ButtonPage ()
+ {
+ Content = new StackLayout {
+ Children = {
+ new Button {
+ Text = "Push", Command = new Command (o => ((NavigationPage) Parent).PushAsync (new ButtonPage ()))
+ },
+ new Button {
+ Text = "Pop", Command = new Command (o => ((NavigationPage) Parent).Navigation.PopAsync ())
+ },
+ },
+ };
+ }
+ }
+
+ public Bugzilla32034 () : base (new ButtonPage ())
+ {
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32040.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32040.cs
new file mode 100644
index 00000000..a6d9c830
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32040.cs
@@ -0,0 +1,59 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 32040, "EntryCell.Tapped or SwitchCell.Tapped does not fire when within a TableView ")]
+ public class Bugzilla32040 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ protected override void Init ()
+ {
+ var switchCell = new SwitchCell { Text = "blahblah" };
+ switchCell.Tapped += (s, e) =>
+ {
+ switchCell.Text = "Tapped";
+ };
+ switchCell.OnChanged += (sender, e) => {
+ switchCell.Text = "Switched";
+ };
+
+ var entryCell = new EntryCell { Text = "yaddayadda" };
+ entryCell.XAlign = TextAlignment.End;
+ entryCell.Label = "Click Here";
+ entryCell.Tapped += (s, e) =>
+ {
+ entryCell.Text = "Tapped";
+ };
+ entryCell.Completed += (sender, e) => {
+ entryCell.Text = "Completed";
+ };
+
+ // The root page of your application
+ Content = new TableView {
+ Intent = TableIntent.Form,
+ Root = new TableRoot ("Table Title") {
+ new TableSection ("Section 1 Title") {
+ switchCell,
+ entryCell
+ }
+ }
+ };
+ }
+#if UITEST
+ [Test]
+ public void TappedWorksForEntryAndSwithCellTest ()
+ {
+ RunningApp.Tap (q => q.Marked ("blahblah"));
+ RunningApp.Tap (q => q.Marked ("Click Here"));
+ Assert.GreaterOrEqual (RunningApp.Query (q => q.Marked ("Tapped")).Length, 2);
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32148.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32148.cs
new file mode 100644
index 00000000..76e3819b
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32148.cs
@@ -0,0 +1,240 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+using System.Linq.Expressions;
+using System.Threading.Tasks;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Collections.Generic;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 32148, " Pull to refresh hides the first item on a list view")]
+ public class Bugzilla32148 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ Button _searchBtn;
+ ListView _contactsListView;
+ ObservableCollection<Grouping1<string, ContactViewModel1>> _listViewItemSource;
+
+ protected override void Init ()
+ {
+ Title = "Contacts";
+ Content = CreateContent();
+ // Disable the await warning
+ #pragma warning disable 4014
+ LoadContactsAsync();
+ #pragma warning restore 4014
+ }
+
+ Layout CreateContent()
+ {
+ _listViewItemSource = new ObservableCollection<Grouping1<string, ContactViewModel1>>();
+
+ _contactsListView = new ListView()
+ {
+ ItemsSource = _listViewItemSource,
+ IsPullToRefreshEnabled = true,
+ IsGroupingEnabled = true,
+ GroupShortNameBinding = new Binding("Key"),
+ GroupHeaderTemplate = new DataTemplate(typeof(HeaderCell)),
+ HasUnevenRows = true,
+ ItemTemplate = new DataTemplate(typeof(ContactItemTemplate))
+ };
+
+ _contactsListView.Refreshing += contactsListView_Refreshing;
+ _searchBtn = new Button() { Text = "Search" };
+ _searchBtn.Clicked += (object sender, EventArgs e) => _contactsListView.BeginRefresh ();
+
+ Grid grd = new Grid ();
+ grd.RowDefinitions.Add (new RowDefinition () { Height = GridLength.Auto } );
+ grd.RowDefinitions.Add (new RowDefinition ());
+ grd.Children.Add (_searchBtn);
+ grd.Children.Add (_contactsListView);
+ Grid.SetRow (_contactsListView, 1);
+ return grd;
+ }
+
+ async void contactsListView_Refreshing(object sender, EventArgs e)
+ {
+ await Task.Delay (1000);
+ await LoadContactsAsync(true);
+ }
+
+ async Task LoadContactsAsync(bool isPullToRefresh = false)
+ {
+ await ReadFromDbAsync();
+ _contactsListView.IsRefreshing &= !isPullToRefresh;
+ }
+
+ async Task ReadFromDbAsync(Expression<Func<Contact1, bool>> searchExpression = null)
+ {
+ await Task.Run(() =>
+ {
+ Device.BeginInvokeOnMainThread(() =>
+ {
+ // If we want to filter the data, GetItems by expression
+ IList<Contact1> contactEntities = new List<Contact1>();
+ List<ContactViewModel1> data = new List<ContactViewModel1>();
+
+ if (contactEntities == null || contactEntities.Count == 0)
+ {
+ // Fill with dummy contacts
+ for (int i = 0; i < 20; i++)
+ {
+ Contact1 contact = new Contact1()
+ {
+ FirstName = "Contact" + i,
+ LastName = "LastName",
+ Company = "Company" + i
+ } ;
+ contactEntities.Add(contact);
+ }
+ }
+
+ // Create Contact items for the listView
+ foreach (Contact1 contact in contactEntities)
+ {
+ ContactViewModel1 contactItem = new ContactViewModel1()
+ {
+ FirstName = contact.FirstName,
+ LastName = contact.LastName,
+ FullName = contact.FirstName + " " + contact.LastName,
+ Company = contact.Company,
+ } ;
+
+ data.Add(contactItem);
+ }
+
+ // Sort, order and group the contacts
+ var contacts = from contact in data
+ orderby contact.LastName, contact.FirstName
+ group contact by contact.FirstNameSort into contactGroup
+ select new Grouping1<string, ContactViewModel1>(contactGroup.Key, contactGroup);
+
+ // Create a new collection of groups
+ var grouppedContacts = new ObservableCollection<Grouping1<string, ContactViewModel1>>(contacts);
+
+ _contactsListView.ItemsSource = grouppedContacts;
+ } );
+ } );
+ }
+
+ public class Grouping1<K, T> : ObservableCollection<T>
+ {
+ public K Key { get; private set; }
+
+ public Grouping1(K key, IEnumerable<T> items)
+ {
+ Key = key;
+ foreach (T item in items)
+ {
+ Items.Add(item);
+ }
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class ContactViewModel1
+ {
+ public string FirstName { get; set; }
+ public string LastName { get; set; }
+ public string FullName { get; set; }
+ public string Company { get; set; }
+ public ImageSource IconSource { get; set; }
+
+ public string FirstNameSort
+ {
+ get
+ {
+ if (string.IsNullOrWhiteSpace(FirstName) || FirstName.Length == 0)
+ {
+ return "?";
+ }
+
+ return FirstName[0].ToString().ToUpper();
+ }
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class Contact1
+ {
+ public string FirstName { get; set; }
+ public string LastName { get; set; }
+ public string Company { get; set; }
+ public byte[] ProfilePicture { get; set; }
+ public string Email { get; set; }
+ public string Mobile { get; set; }
+ public string RoomNumber { get; set; }
+ public string Street { get; set; }
+ public string Zip { get; set; }
+ public string City { get; set; }
+ public string CountryCode { get; set; }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class HeaderCell : ViewCell
+ {
+ public HeaderCell()
+ {
+ Height = 23;
+
+ Label title = new Label
+ {
+ TextColor = Color.White,
+ VerticalOptions = LayoutOptions.Center
+ } ;
+
+ title.SetBinding(Label.TextProperty, "Key");
+
+ View = new StackLayout
+ {
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ HeightRequest = 23,
+ BackgroundColor = Color.Pink,
+ Orientation = StackOrientation.Horizontal,
+ Padding = new Thickness(Sizes.GroupingSidePadding, 0, 0, 0),
+ Children = { title }
+ };
+ }
+
+ struct Sizes
+ {
+ public static readonly double GroupingSidePadding = 5;
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class ContactItemTemplate : ImageCell
+ {
+ public ContactItemTemplate()
+ : base()
+ {
+
+ SetBinding(TextProperty, new Binding("FullName"));
+ SetBinding(DetailProperty, new Binding("Company"));
+ SetBinding(ImageSourceProperty, new Binding("IconSource"));
+
+ Height = 50;
+ }
+ }
+
+ #if UITEST
+ [Test]
+ public void Bugzilla32148Test ()
+ {
+ RunningApp.WaitForElement (q => q.Marked ("Contact0 LastName"));
+ RunningApp.Tap (q => q.Marked("Search"));
+ RunningApp.WaitForElement (q => q.Marked ("Contact0 LastName"));
+ RunningApp.Screenshot ("For manual review, is the first cell visible?");
+ }
+ #endif
+ }
+
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32230.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32230.cs
new file mode 100644
index 00000000..e7d99b06
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32230.cs
@@ -0,0 +1,59 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 32230, "isPresentedChanged raises multiple times")]
+ public class Bugzilla32230 : TestMasterDetailPage // or TestMasterDetailPage, etc ...
+ {
+ Label _lblCount;
+ Button _btnOpen;
+ Button _btnClose;
+ int _count;
+
+ protected override void Init ()
+ {
+ _lblCount = new Label { Text = _count.ToString (), AutomationId = "lblCount" };
+ _btnOpen = new Button { Text = "Open", AutomationId = "btnOpen",
+ Command = new Command (() => {
+ IsPresented = true;
+ })
+ };
+ _btnClose = new Button { Text = "Close", AutomationId = "btnClose",
+ Command = new Command (() => {
+ IsPresented = false;
+ })
+ };
+
+ Master = new ContentPage {
+ Title = "Master",
+ Content = new StackLayout { Children = { _lblCount, _btnClose } }
+ };
+
+ Detail = new NavigationPage (new ContentPage { Content = _btnOpen });
+ IsPresentedChanged += (object sender, EventArgs e) => {
+ _count++;
+ _lblCount.Text = _count.ToString();
+ };
+ }
+
+#if UITEST
+ [Test]
+ public void Bugzilla32230Test ()
+ {
+ RunningApp.Tap (q => q.Marked ("btnOpen"));
+ Assert.AreEqual ("1", RunningApp.Query (q => q.Marked ("lblCount"))[0].Text);
+ RunningApp.Tap (q => q.Marked ("btnClose"));
+ RunningApp.Tap (q => q.Marked ("btnOpen"));
+ Assert.AreEqual ("3", RunningApp.Query (q => q.Marked ("lblCount"))[0].Text);
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32447.xaml b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32447.xaml
new file mode 100644
index 00000000..654cf820
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32447.xaml
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<local:TestContentPage xmlns="http://xamarin.com/schemas/2014/forms"
+ xmlns:local="clr-namespace:Xamarin.Forms.Controls"
+xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Xamarin.Forms.Controls.Bugzilla32447">
+ <local:TestContentPage.Content>
+ <TableView HasUnevenRows="true" Intent="Form" BackgroundColor="#DADEE3">
+ <TableRoot>
+ <TableSection Title="Section 1">
+ <ViewCell >
+ <Label Text="Sample" />
+ </ViewCell>
+ <ViewCell >
+ <Picker Title = "Gender" HorizontalOptions="Start">
+ <Picker.Items>
+ <x:String>Male</x:String>
+ <x:String>Female</x:String>
+ <x:String>N/A</x:String>
+ </Picker.Items>
+ </Picker>
+ </ViewCell>
+
+ <ViewCell >
+ <Label Text="Sample" />
+ </ViewCell>
+
+ <ViewCell >
+ <Picker Title = "Gender" HorizontalOptions="Start">
+ <Picker.Items>
+ <x:String>Male</x:String>
+ <x:String>Female</x:String>
+ <x:String>N/A</x:String>
+ </Picker.Items>
+ </Picker>
+ </ViewCell>
+ <ViewCell >
+ <Picker Title = "Gender" HorizontalOptions="Start">
+ <Picker.Items>
+ <x:String>Male</x:String>
+ <x:String>Female</x:String>
+ <x:String>N/A</x:String>
+ </Picker.Items>
+ </Picker>
+ </ViewCell>
+
+ <ViewCell >
+ <Label Text="Sample" />
+ </ViewCell>
+
+ <ViewCell >
+ <Picker Title = "Gender" HorizontalOptions="Start">
+ <Picker.Items>
+ <x:String>Male</x:String>
+ <x:String>Female</x:String>
+ <x:String>N/A</x:String>
+ </Picker.Items>
+ </Picker>
+ </ViewCell>
+ </TableSection>
+
+ <TableSection Title="Section 2">
+ <ViewCell >
+ <Picker x:Name="genderPicker" Title = "Gender" HorizontalOptions="Start">
+ <Picker.Items>
+ <x:String>Male</x:String>
+ <x:String>Female</x:String>
+ <x:String>N/A</x:String>
+ </Picker.Items>
+ </Picker>
+ </ViewCell>
+ <ViewCell >
+ <Picker Title = "Gender" HorizontalOptions="Start">
+ <Picker.Items>
+ <x:String>Male</x:String>
+ <x:String>Female</x:String>
+ <x:String>N/A</x:String>
+ </Picker.Items>
+ </Picker>
+ </ViewCell>
+
+ <ViewCell >
+ <Label Text="Sample" />
+ </ViewCell>
+
+ <ViewCell >
+ <Picker Title = "Gender" HorizontalOptions="Start">
+ <Picker.Items>
+ <x:String>Male</x:String>
+ <x:String>Female</x:String>
+ <x:String>N/A</x:String>
+ </Picker.Items>
+ </Picker>
+ </ViewCell>
+ <ViewCell >
+ <Label Text="Sample" />
+ </ViewCell>
+
+ <ViewCell >
+ <Picker Title = "Gender" HorizontalOptions="Start">
+ <Picker.Items>
+ <x:String>Male</x:String>
+ <x:String>Female</x:String>
+ <x:String>N/A</x:String>
+ </Picker.Items>
+ </Picker>
+ </ViewCell>
+
+ <ViewCell >
+ <Label Text="Sample" />
+ </ViewCell>
+ </TableSection>
+
+ <TableSection Title="Section 2">
+ <ViewCell >
+ <Picker Title = "Gender" HorizontalOptions="Start">
+ <Picker.Items>
+ <x:String>Male</x:String>
+ <x:String>Female</x:String>
+ <x:String>N/A</x:String>
+ </Picker.Items>
+ </Picker>
+ </ViewCell>
+
+ <ViewCell >
+ <Label Text="Sample" />
+ </ViewCell>
+
+ <ViewCell >
+ <Label Text="Sample" />
+ </ViewCell>
+ <ViewCell >
+ <Picker Title = "Gender" HorizontalOptions="Start">
+ <Picker.Items>
+ <x:String>Male</x:String>
+ <x:String>Female</x:String>
+ <x:String>N/A</x:String>
+ </Picker.Items>
+ </Picker>
+ </ViewCell>
+ <ViewCell >
+ <Picker Title = "Gender" HorizontalOptions="Start">
+ <Picker.Items>
+ <x:String>Male</x:String>
+ <x:String>Female</x:String>
+ <x:String>N/A</x:String>
+ </Picker.Items>
+ </Picker>
+ </ViewCell>
+
+ <ViewCell >
+ <Label Text="Sample" />
+ </ViewCell>
+ <ViewCell >
+ <Label Text="Sample" />
+ </ViewCell>
+ </TableSection>
+
+ </TableRoot>
+ </TableView>
+ </local:TestContentPage.Content>
+</local:TestContentPage>
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32447.xaml.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32447.xaml.cs
new file mode 100644
index 00000000..719b10d0
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32447.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+
+using Xamarin.Forms;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 32447, "[iOS] App crash when scrolling quickly through a TableView that has Pickers in the cells.", PlatformAffected.iOS)]
+ public partial class Bugzilla32447 : TestContentPage
+ {
+ public Bugzilla32447 ()
+ {
+ #if APP
+
+ InitializeComponent ();
+
+ #endif
+ }
+
+ protected override void Init ()
+ {
+
+ }
+ }
+}
+
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32462.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32462.cs
new file mode 100644
index 00000000..86d75e99
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32462.cs
@@ -0,0 +1,57 @@
+using System;
+using System.Linq;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 32462, "Crash after a page disappeared if a ScrollView is in the HeaderTemplate property of a ListView", PlatformAffected.Android)]
+ public class Bugzilla32462 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ [Preserve (AllMembers = true)]
+ public class ListViewPage : ContentPage
+ {
+ public ListViewPage ()
+ {
+ var scrollview = new ScrollView {
+ Orientation = ScrollOrientation.Horizontal,
+ Content = new Label { Text = "some looooooooooooooooooooooooooooooooooooooooooooooooooooooog text" }
+ };
+ var stacklayout = new StackLayout ();
+ stacklayout.Children.Add (scrollview);
+ string[] list = Enumerable.Range (0, 40).Select (c => $"some text {c}").ToArray ();
+ var listview = new ListView { AutomationId = "listview", Header = stacklayout, ItemsSource = list };
+ Content = listview;
+
+ listview.ScrollTo (list[39], ScrollToPosition.Center, false);
+ }
+ }
+
+ protected override void Init ()
+ {
+ var button = new Button {
+ Text = "Click!",
+ };
+ button.Clicked += (object sender, EventArgs e) => Navigation.PushAsync (new ListViewPage ());
+ Content = button;
+ }
+
+#if UITEST
+ [Test]
+ public void Bugzilla36729Test ()
+ {
+ RunningApp.WaitForElement (q => q.Marked ("Click!"));
+ RunningApp.Tap (q => q.Marked ("Click!"));
+ RunningApp.WaitForElement (q => q.Marked ("listview"));
+ RunningApp.WaitForElement (q => q.Marked ("some text 35"));
+ RunningApp.Back ();
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32487.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32487.cs
new file mode 100644
index 00000000..2cccc574
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32487.cs
@@ -0,0 +1,50 @@
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 32487, " webview in tabbedpage has black margin")]
+ public class Bugzilla32487 : TestTabbedPage
+ {
+ protected override void Init ()
+ {
+ var cp = new ContentPage ();
+ cp.Title = "bugzila 30047";
+ Children.Add (cp);
+
+ var cp1 = new ContentPage ();
+ cp1.Title = "bugzila 32487";
+ var sl = new StackLayout ();
+ var wv = new WebView ();
+
+ var htmlSource = new HtmlWebViewSource ();
+ htmlSource.Html = "<h3>Welcome to the real-time HTML editor!</h3>\n<p>Try scroll this page, you will see black margins if it isn't working ok</p>";
+ wv.Source = htmlSource;
+ sl.Children.Add (wv);
+ cp1.Content = wv;
+
+ var btn = new Button { Text = "tap and rotate device after ", Command = new Command (async () => {
+ ContentPage cp2 = new ContentPage ();
+ cp.Title = "rotation";
+ var grd = new Grid ();
+ grd.RowDefinitions.Add (new RowDefinition { Height = GridLength.Auto });
+ grd.RowDefinitions.Add (new RowDefinition ());
+ WebView wv1 = new WebView { Source = "http://xamarin.com" };
+ Grid.SetRow (wv1, 1);
+ grd.Children.Add (wv1);
+ grd.Children.Add (new Button {
+ Text = "Back",
+ BackgroundColor = Color.Red,
+ Command = new Command (() => Navigation.PopModalAsync ())
+ });
+ cp2.Content = grd;
+ await Navigation.PushModalAsync (cp2);
+ })
+ };
+ cp.Content = btn;
+
+ Children.Add (cp);
+ Children.Add (cp1);
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32615.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32615.cs
new file mode 100644
index 00000000..405133e0
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32615.cs
@@ -0,0 +1,70 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+using System.Threading.Tasks;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 32615, "OnAppearing is not called on previous page when modal page is popped")]
+ public class Bugzilla32615 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ int _counter;
+ Label _textField;
+ protected override void Init ()
+ {
+ var btnModal = new Button { AutomationId = "btnModal", Text = "open", HorizontalOptions = LayoutOptions.FillAndExpand, VerticalOptions = LayoutOptions.FillAndExpand };
+ btnModal.Clicked += async (sender, e) => await Navigation.PushModalAsync (new Bugzilla32615Page2 ());
+ _textField = new Label { AutomationId = "lblCount"};
+ var layout = new StackLayout ();
+ layout.Children.Add (btnModal);
+ layout.Children.Add (_textField);
+ // Initialize ui here instead of ctor
+ Content = layout;
+ }
+
+ protected override void OnAppearing()
+ {
+ _textField.Text = _counter++.ToString();
+ }
+
+ class Bugzilla32615Page2 : ContentPage
+ {
+ public Bugzilla32615Page2 ()
+ {
+ var btnPop = new Button { AutomationId = "btnPop", Text = "pop", HorizontalOptions = LayoutOptions.FillAndExpand, VerticalOptions = LayoutOptions.FillAndExpand };
+ btnPop.Clicked += async (sender, e) => await Navigation.PopModalAsync ();
+ Content = btnPop;
+ }
+
+ protected override void OnDisappearing ()
+ {
+ System.Diagnostics.Debug.WriteLine ("Disappearing Modal");
+ base.OnDisappearing ();
+ }
+
+ protected override void OnAppearing ()
+ {
+ System.Diagnostics.Debug.WriteLine ("Appearing Modal");
+ base.OnAppearing ();
+ }
+ }
+
+#if UITEST
+ [Test]
+ public async void Bugzilla32615Test ()
+ {
+ RunningApp.Tap (q => q.Marked ("btnModal"));
+ RunningApp.Tap (q => q.Marked ("btnPop"));
+ await Task.Delay (1000);
+ var lbl = RunningApp.WaitForElement (c => c.Marked("lblCount"));
+ Assert.AreEqual ("1", lbl [0].Text);
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32691.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32691.cs
new file mode 100644
index 00000000..7277f606
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32691.cs
@@ -0,0 +1,60 @@
+using System;
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ public interface ICacheService
+ {
+ void ClearImageCache ();
+ }
+
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 32691, "Clearing an image by setting Image.Source to null, while Image.IsLoading is true, doesn't work.")]
+ public class Bugzilla32691 : TestContentPage
+ {
+ const string KSetImageSource = "SET IMAGE SOURCE";
+ const string KClearImageSource = "CLEAR IMAGE SOURCE";
+
+ protected override void Init ()
+ {
+ var label = new Label () { XAlign = TextAlignment.Center };
+ var image = new Image ();
+
+ image.PropertyChanged += (sender, e) => {
+ if (e.PropertyName == "IsLoading")
+ label.Text = image.IsLoading ? "Loading" : "Done";
+ };
+
+ var btnSetOrClear = new Button () { Text = KSetImageSource, AutomationId = "btnLoad" };
+
+ btnSetOrClear.Clicked += delegate {
+ if (btnSetOrClear.Text == KSetImageSource) {
+ ClearImageCache ();
+ image.Source =
+ "http://www.public-domain-image.com/free-images/miscellaneous/big-high-border-fence.jpg";
+ btnSetOrClear.Text = KClearImageSource;
+ } else {
+ image.Source = null;
+ btnSetOrClear.Text = KSetImageSource;
+ }
+ };
+
+ Content = new StackLayout {
+ Orientation = StackOrientation.Vertical,
+ Padding = new Thickness (10),
+ Children = { btnSetOrClear, image, label }
+ };
+ }
+
+ void ClearImageCache ()
+ {
+ var cacheService = DependencyService.Get<ICacheService> ();
+ cacheService?.ClearImageCache ();
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32776.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32776.cs
new file mode 100644
index 00000000..f6d0b4c4
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32776.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls.Issues
+{
+ [Issue (IssueTracker.Bugzilla, 32776, "MasterDetail page - page title not showing for Windows Phone 8.1 (any orientation) or in Windows 8.1 (portrait orientation).", PlatformAffected.WinRT, NavigationBehavior.PushModalAsync)]
+ public class Bugzilla32776
+ : MasterDetailPage
+ {
+ public Bugzilla32776 ()
+ {
+ Master = new ContentPage { Title = "Content page" };
+ Detail = new NavigationPage (new ContentPage {
+ Title = "Test"
+ });
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32801.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32801.cs
new file mode 100644
index 00000000..c285aeff
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32801.cs
@@ -0,0 +1,92 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+using Xamarin.UITest.iOS;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 32801, "Memory Leak in TabbedPage + NavigationPage")]
+ public class Bugzilla32801 : TestTabbedPage // or TestMasterDetailPage, etc ...
+ {
+ protected override void Init ()
+ {
+ Children.Add (new NavigationPage (new TestDemoPage (1)) { Title = "Tab", Icon = "bank.png" });
+ Children.Add (new NavigationPage (new TestDemoPage (1)) { Title = "Tab 1", Icon = "bank.png" });
+
+ }
+
+ public class TestDemoPage : ContentPage
+ {
+ int _level = 0;
+
+ public TestDemoPage (int level)
+ {
+ _level = level;
+
+ System.Diagnostics.Debug.WriteLine ("Page Level {0} : Created", _level);
+
+ Title = string.Format ("Level {0}", level);
+
+ var lblStack = new Label ();
+
+ var buttonAdd = new Button {
+ Text = "Add Level",
+ AutomationId = "btnAdd",
+ BackgroundColor = Color.Aqua
+ };
+
+ buttonAdd.Clicked += (sender, e) => Navigation.PushAsync (new TestDemoPage (_level + 1));
+
+ var buttonStack = new Button {
+ Text = "Show Navigation Stack",
+ AutomationId = "btnStack",
+ BackgroundColor = Color.Aqua
+ };
+
+ buttonStack.Clicked += (object sender, EventArgs e) => {
+ lblStack.Text = "Stack " + Navigation.NavigationStack.Count.ToString ();
+ System.Diagnostics.Debug.WriteLine ("------------------------------------------------------------");
+ foreach (TestDemoPage page in Navigation.NavigationStack)
+ System.Diagnostics.Debug.WriteLine ("Items On Navigation Stack =====> Level {0}", page._level);
+ System.Diagnostics.Debug.WriteLine ("------------------------------------------------------------");
+ };
+
+ Content = new StackLayout {
+ Padding = new Thickness (20.0),
+ Spacing = 20.0,
+ Children = {
+ buttonAdd, buttonStack, lblStack
+ }
+ };
+ }
+
+ ~TestDemoPage ()
+ {
+ System.Diagnostics.Debug.WriteLine ("Page Level {0} : Destroyed", _level);
+ }
+ }
+
+ #if UITEST
+ [Test]
+ public void Bugzilla32801Test ()
+ {
+ if (RunningApp is iOSApp) {
+ RunningApp.Tap (c => c.Marked ("btnAdd"));
+ RunningApp.Tap (c => c.Marked ("btnAdd"));
+ RunningApp.Tap (c => c.Marked ("btnStack"));
+ RunningApp.WaitForElement (c => c.Marked ("Stack 3"));
+ RunningApp.Tap (c => c.Marked ("Tab"));
+ RunningApp.Tap (c => c.Marked ("btnStack"));
+ RunningApp.WaitForElement (c => c.Marked ("Stack 1"));
+ }
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32842.xaml b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32842.xaml
new file mode 100644
index 00000000..c38aea00
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32842.xaml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
+ xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+ x:Class="Xamarin.Forms.Controls.Issues.Bugzilla32842">
+
+
+ <StackLayout VerticalOptions="Fill">
+ <Label x:Name="Instructions" Text="Tap on a box in the list below. The Box Taps number should equal 1 and the List Item Selections number should equal 0. If either number is incorrect, this test has failed."></Label>
+
+ <ListView x:Name="MainList" VerticalOptions="Fill">
+ <ListView.ItemTemplate>
+ <DataTemplate>
+ <ViewCell>
+ <StackLayout Orientation="Horizontal" Padding="5" HeightRequest="75" BackgroundColor="Red">
+ <BoxView Color="Teal" WidthRequest="75" HeightRequest="75">
+ <BoxView.GestureRecognizers>
+ <TapGestureRecognizer
+ Tapped="BoxTapped"
+ NumberOfTapsRequired="1"/>
+ </BoxView.GestureRecognizers>
+ </BoxView>
+ </StackLayout>
+ </ViewCell>
+ </DataTemplate>
+ </ListView.ItemTemplate>
+ </ListView>
+
+ <StackLayout Orientation="Horizontal">
+ <Label Text="">List Item Selections: </Label>
+ <Label x:Name="ListResults" Text=""></Label>
+ </StackLayout>
+ <StackLayout Orientation="Horizontal">
+ <Label Text="">Box Taps: </Label>
+ <Label x:Name="BoxResults" Text=""></Label>
+ </StackLayout>
+
+
+
+ </StackLayout>
+
+
+</ContentPage> \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32842.xaml.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32842.xaml.cs
new file mode 100644
index 00000000..ec73ea6a
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32842.xaml.cs
@@ -0,0 +1,46 @@
+using System;
+using System.Collections.Generic;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls.Issues
+{
+#if APP
+ [Preserve(AllMembers = true)]
+ [Issue(IssueTracker.Bugzilla, 32842,
+ "[WinRT] ItemSelected Not Ignored When a ListView Item Contains a TapGestureRecognizer", PlatformAffected.WinRT)]
+ public partial class Bugzilla32842 : ContentPage
+ {
+ public Bugzilla32842 ()
+ {
+
+ List<string> items = new List<string> { "item1", "item2", "item3" };
+
+ InitializeComponent ();
+
+ MainList.ItemsSource = items;
+ MainList.ItemSelected += MainListSelectionChanged;
+ }
+
+ int _boxTaps;
+ int _listSelections;
+
+ void MainListSelectionChanged(object sender, SelectedItemChangedEventArgs e)
+ {
+ if (e.SelectedItem == null) {
+ return;
+ }
+
+ _listSelections += 1;
+
+ ListResults.Text = $"Selections = {_listSelections}";
+ }
+
+ void BoxTapped(object sender, EventArgs args)
+ {
+ _boxTaps += 1;
+
+ BoxResults.Text = $"Box Taps = {_boxTaps}";
+ }
+ }
+#endif
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32847.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32847.cs
new file mode 100644
index 00000000..7014cf35
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32847.cs
@@ -0,0 +1,119 @@
+using System;
+using System.Collections.Generic;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 32847,
+ "Picker text is cleared after selecting an item, whether Picker, DatePicker, or TimePicker (when in a TableView (or ListView))", PlatformAffected.WinRT)]
+ public class Bugzilla32847 : TestContentPage
+ {
+ protected override void Init ()
+ {
+ var instructions =
+ @"In the picker below, select the option labeled 'Two'. If the selection immediately disappears, the test has failed.
+In the TimePicker below, change the time to 5:21 PM. If the selection immediately disappears, the test has failed.
+In the DatePicker below, change the date to May 25, 1977. If the selection immediately disappears, the test has failed.";
+
+ var tableInstructions = new Label {
+ Text = instructions
+ };
+
+ var picker = new Picker ();
+
+ var pickerItems = new List<string> { "One", "Two", "Three" };
+
+ foreach(string item in pickerItems)
+ {
+ picker.Items.Add(item);
+ }
+
+ var datePicker = new DatePicker ();
+ var timePicker = new TimePicker ();
+
+ var tableView = new TableView() { BackgroundColor = Color.Green };
+
+ var tableSection = new TableSection();
+
+ var pickerCell = new ViewCell { View = picker };
+ var datepickerCell = new ViewCell { View = datePicker };
+ var timepickerCell = new ViewCell { View = timePicker };
+
+ tableSection.Add(pickerCell);
+ tableSection.Add(timepickerCell);
+ tableSection.Add(datepickerCell);
+
+ var tableRoot = new TableRoot() {
+ tableSection
+ };
+
+ tableView.Root = tableRoot;
+
+ var listItems = new List<string> { "One" };
+
+ var listView = new ListView
+ {
+ Header = instructions,
+ BackgroundColor = Color.Pink,
+ ItemTemplate = new DataTemplate(typeof(CustomCell)),
+ ItemsSource = listItems
+ };
+
+ var nonListDatePicker = new DatePicker();
+ var nonListTimePicker = new TimePicker();
+ var nonListPicker = new Picker();
+
+ foreach(string item in pickerItems)
+ {
+ nonListPicker.Items.Add(item);
+ }
+
+ Content = new StackLayout {
+ VerticalOptions = LayoutOptions.Fill,
+ HorizontalOptions = LayoutOptions.Fill,
+ Children = {
+ new Label { Text = instructions },
+ nonListPicker,
+ nonListDatePicker,
+ nonListTimePicker,
+ tableInstructions,
+ tableView,
+ listView
+ }
+ };
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class CustomCell : ViewCell
+ {
+ public CustomCell()
+ {
+ StackLayout cellWrapper = new StackLayout();
+ StackLayout stack = new StackLayout();
+
+ var picker = new Picker();
+ var datePicker = new DatePicker ();
+ var timePicker = new TimePicker ();
+
+ var items = new List<string> { "One", "Two", "Three" };
+
+ foreach(string item in items)
+ {
+ picker.Items.Add(item);
+ }
+
+ cellWrapper.BackgroundColor = Color.FromHex("#eee");
+ stack.Orientation = StackOrientation.Vertical;
+
+ stack.Children.Add(picker);
+ stack.Children.Add(timePicker);
+ stack.Children.Add(datePicker);
+
+ cellWrapper.Children.Add(stack);
+ View = cellWrapper;
+ }
+
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32898.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32898.cs
new file mode 100644
index 00000000..ceb91e2b
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32898.cs
@@ -0,0 +1,74 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+using System.Threading.Tasks;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 32898, "Memory leak when TabbedPage is popped out ")]
+ public class Bugzilla32898 : TestContentPage
+ {
+ WeakReference _page2Tracker;
+ WeakReference _tabTracker;
+
+ protected override void Init ()
+ {
+ var stack = new StackLayout () { VerticalOptions = LayoutOptions.Center };
+
+ stack.Children.Add (new Label () {
+ VerticalOptions = LayoutOptions.Center,
+ XAlign = TextAlignment.Center,
+ Text = "Page 1"
+ });
+
+ Content = stack;
+ }
+
+ protected override async void OnAppearing ()
+ {
+ base.OnAppearing ();
+
+ if (_page2Tracker == null) {
+ var page2 = new TabbedPage () { Children = { new ContentPage () { Title = "tab" } } };
+ page2.Appearing += async delegate {
+ await Task.Delay (1000);
+ await page2.Navigation.PopModalAsync ();
+ };
+
+ _page2Tracker = new WeakReference (page2, false);
+ _tabTracker = new WeakReference (page2.Children [0], false);
+
+ await Task.Delay (1000);
+ await Navigation.PushModalAsync (page2);
+
+ StartTrackPage2 ();
+ }
+ }
+
+ async void StartTrackPage2 ()
+ {
+ while (true) {
+ ((Label)((StackLayout)Content).Children [0]).Text =
+ $"Page1. But Page2 IsAlive = {_page2Tracker.IsAlive}, tab IsAlive = {_tabTracker.IsAlive}";
+
+ await Task.Delay (1000);
+ GC.Collect ();
+ }
+ }
+
+ #if UITEST
+ [Test]
+ public async void Issu32898Test ()
+ {
+ await Task.Delay (5000);
+ RunningApp.WaitForElement (q => q.Marked ("Page1. But Page2 IsAlive = False, tab IsAlive = False"));
+ }
+ #endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32902.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32902.cs
new file mode 100644
index 00000000..e3bfccff
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32902.cs
@@ -0,0 +1,131 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+
+#if UITEST
+using Xamarin.UITest.iOS;
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 32902, "[iOS | iPad] App Crashes (without debug log) when Master Detail isPresented and navigation being popped")]
+ public class Bugzilla32902 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ ContentPage FirstContentPage { get; set; }
+
+ MasterDetailPage HomePage { get; set; }
+
+ NavigationPage DetailPage { get; set; }
+
+ ContentPage MasterPage { get; set; }
+
+ protected override void Init ()
+ {
+ var rootContentPageLayout = new StackLayout();
+ var rootContentPageButton = new Button()
+ {
+ Text = "PushAsync to next page",
+ AutomationId = "btnNext",
+ BackgroundColor = Color.FromHex("#ecf0f1"),
+ TextColor = Color.Black
+ };
+ rootContentPageButton.Clicked += async (sender, args) =>
+ {
+ await Navigation.PushAsync(FirstContentPage);
+ };
+
+ rootContentPageLayout.Children.Add(rootContentPageButton);
+ Content = rootContentPageLayout;
+
+ Title = "RootPage";
+ BackgroundColor = Color.FromHex ("#2c3e50");
+
+ //MASTER PAGE
+ MasterPage = new ContentPage()
+ {
+ Title = "Master",
+ BackgroundColor = Color.FromHex("#1abc9c")
+ };
+ var masterPageLayout = new StackLayout();
+ var masterPageButton = new Button()
+ {
+ Text = "Pop Modal and Pop Root",
+ AutomationId = "btnPop",
+ BackgroundColor = Color.FromHex("#ecf0f1"),
+ TextColor = Color.Black
+ };
+ masterPageButton.Clicked += async (sender, args) =>
+ {
+ await Navigation.PopModalAsync();
+ await Navigation.PopToRootAsync();
+ };
+ masterPageLayout.Children.Add(masterPageButton);
+ MasterPage.Content = masterPageLayout;
+
+
+ //DETAIL PAGE
+ DetailPage = new NavigationPage (new ContentPage () {
+ Title = "RootNavigationDetailPage",
+ BackgroundColor = Color.FromHex ("#2980b9"),
+ Content = new Button {
+ Text = "PopModal",
+ TextColor = Color.White,
+ Command = new Command (async () => {
+ await Navigation.PopModalAsync ();
+ })
+ }
+ });
+
+ //MASTERDETAIL PAGE
+ HomePage = new MasterDetailPage()
+ {
+ Master = MasterPage,
+ Detail = DetailPage
+ };
+
+ //FIRST CONTENT PAGE
+ FirstContentPage = new ContentPage()
+ {
+ Title = "First Content Page",
+ BackgroundColor = Color.FromHex("#e74c3c")
+ };
+ var firstContentPageLayout = new StackLayout();
+ var firstContentPageButton = new Button()
+ {
+ Text = "Push Modal To Master-Detail Page",
+ AutomationId = "btnPushModal",
+ BackgroundColor = Color.FromHex("#ecf0f1"),
+ TextColor = Color.Black
+ };
+ firstContentPageButton.Clicked += async (sender, args) =>
+ {
+ await Navigation.PushModalAsync(HomePage);
+ };
+ firstContentPageLayout.Children.Add(firstContentPageButton);
+ FirstContentPage.Content = firstContentPageLayout;
+
+
+ }
+
+#if UITEST
+ [Test]
+ public void Bugzilla32902Test ()
+ {
+ var appIos = RunningApp as iOSApp;
+ if (appIos != null) {
+ if(appIos.Device.IsTablet)
+ {
+ RunningApp.Tap (q => q.Marked ("btnNext"));
+ RunningApp.Tap (q => q.Marked ("btnPushModal"));
+ RunningApp.Tap (q => q.Marked ("Master"));
+ RunningApp.Tap (q => q.Marked ("btnPop"));
+ }
+ }
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33268.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33268.cs
new file mode 100644
index 00000000..96cdc464
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33268.cs
@@ -0,0 +1,143 @@
+using System.Collections.Generic;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls.Issues
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 33268, "Picker is broken on Windows Phone 8.1", PlatformAffected.WinRT)]
+ public class Bugzilla33268 : TestTabbedPage
+ {
+ protected override void Init ()
+ {
+ Children.Add (new Bugzilla33268ListView ());
+ Children.Add (new Simple ());
+ Children.Add (new Bugzilla33268NoListView ());
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class Simple : TestContentPage
+ {
+ protected override void Init ()
+ {
+ Title = "Simple";
+
+ var fiveItemPicker = new Picker { Title = "Picker With 4 Items" };
+ for (var i = 1; i <= 4; i++) {
+ fiveItemPicker.Items.Add ("Sample Option " + i);
+ }
+
+ Content = new StackLayout {
+ BackgroundColor = Color.Green,
+ VerticalOptions = LayoutOptions.Start,
+ Children = {
+ fiveItemPicker
+ }
+ };
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class Bugzilla33268NoListView : TestContentPage
+ {
+ protected override void Init ()
+ {
+ Title = "No ListView";
+
+ var fiveItemLabel = new Label {
+ Text =
+ "The picker below should display four items when opened. If you open it and all four items are not visible, this test has failed."
+ };
+
+ var fiveItemPicker = new Picker { Title = "Picker With 4 Items" };
+ for (var i = 1; i <= 4; i++) {
+ fiveItemPicker.Items.Add ("Sample Option " + i);
+ }
+
+ var sixItemLabel = new Label {
+ Text =
+ "The picker below should display full screen when opened. If you open it and it's not full screen, this test has failed."
+ };
+
+ var sixItemPicker = new Picker { Title = "Picker With 6 Items" };
+ for (var i = 1; i <= 6; i++) {
+ sixItemPicker.Items.Add ("Sample Option " + i);
+ }
+
+ Content = new StackLayout {
+ Children = {
+ fiveItemLabel,
+ fiveItemPicker,
+ sixItemLabel,
+ sixItemPicker
+ }
+ };
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class Bugzilla33268ListView : TestContentPage
+ {
+ protected override void Init ()
+ {
+ Title = "ListView";
+
+ var listItems = new List<string> { "One" };
+
+ var listView = new ListView {
+ Header = "Pickers in a ListView",
+ ItemTemplate = new DataTemplate (typeof(PickerCell)),
+ ItemsSource = listItems
+ };
+
+ Content = new StackLayout {
+ Children = {
+ listView
+ }
+ };
+ }
+
+ [Preserve (AllMembers = true)]
+ internal class PickerCell : ViewCell
+ {
+ public PickerCell ()
+ {
+ var cellWrapper = new StackLayout ();
+ var stack = new StackLayout ();
+
+ var fiveItemLabel = new Label {
+ Text =
+ "The picker below should display five items when opened. If you open it and all five items are not visible, this test has failed."
+ };
+
+ var fiveItemPicker = new Picker { Title = "Picker With 5 Items" };
+ for (var i = 1; i <= 5; i++) {
+ fiveItemPicker.Items.Add ("Sample Option " + i);
+ }
+
+ var sixItemLabel = new Label {
+ Text =
+ "The picker below should display full screen when opened. If you open it and it's not full screen, this test has failed."
+ };
+
+ var sixItemPicker = new Picker { Title = "Picker With 6 Items" };
+ for (var i = 1; i <= 6; i++) {
+ sixItemPicker.Items.Add ("Sample Option " + i);
+ }
+
+ stack.Orientation = StackOrientation.Vertical;
+
+ stack.Children.Add (fiveItemLabel);
+ stack.Children.Add (fiveItemPicker);
+ stack.Children.Add (sixItemLabel);
+ stack.Children.Add (sixItemPicker);
+
+ cellWrapper.VerticalOptions = LayoutOptions.StartAndExpand;
+
+ cellWrapper.Children.Add (stack);
+
+ View = cellWrapper;
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33450.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33450.cs
new file mode 100644
index 00000000..e92a7d9f
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33450.cs
@@ -0,0 +1,47 @@
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 33450, "[iOS] Cell with ContextAction has a different layout")]
+ public class Bugzilla33450 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ protected override void Init ()
+ {
+ var list = new ListView { ItemTemplate = new DataTemplate (typeof(MyImageCell)) };
+
+ list.ItemsSource = new[] {
+ "One",
+ "Two",
+ "Three",
+ "Four",
+ "Five",
+ "Six",
+ "Seven",
+ "Eight",
+ "Nine",
+ "Ten",
+ };
+
+ Content = list;
+ }
+
+ [Preserve (AllMembers = true)]
+ public class MyImageCell : ImageCell
+ {
+ static bool s_addContextAction = false;
+
+ public MyImageCell()
+ {
+ ImageSource = "bank.png";
+ SetBinding(TextProperty, new Binding("."));
+
+ if(s_addContextAction)
+ {
+ ContextActions.Add(new MenuItem() { Text = "Delete" });
+ }
+ s_addContextAction = !s_addContextAction;
+ }
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33578.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33578.cs
new file mode 100644
index 00000000..0df73ddb
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33578.cs
@@ -0,0 +1,99 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using Xamarin.UITest.iOS;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 33578, "TableView EntryCell shows DefaultKeyboard, but after scrolling down and back a NumericKeyboard (")]
+ public class Bugzilla33578 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ protected override void Init ()
+ {
+ Content = new TableView {
+ Root = new TableRoot {
+ new TableSection {
+ new EntryCell {
+ Placeholder = "Enter text here 1",
+ AutomationId = "entryNormal"
+ },
+ new EntryCell {
+ Placeholder = "Enter text here 2"
+ },
+ new EntryCell {
+ Placeholder = "Enter text here"
+ },
+ new EntryCell {
+ Placeholder = "Enter text here"
+ },
+ new EntryCell {
+ Placeholder = "Enter text here"
+ },
+ new EntryCell {
+ Placeholder = "Enter text here"
+ },
+ new EntryCell {
+ Placeholder = "Enter text here"
+ },
+ new EntryCell {
+ Placeholder = "Enter text here"
+ },
+ new EntryCell {
+ Placeholder = "Enter text here"
+ },
+ new EntryCell {
+ Placeholder = "Enter text here"
+ },
+ new EntryCell {
+ Placeholder = "Enter text here"
+ },
+ new EntryCell {
+ Placeholder = "Enter text here"
+ },
+ new EntryCell {
+ Placeholder = "Enter text here"
+ },
+ new EntryCell {
+ Placeholder = "Enter text here",
+ AutomationId = "entryPreviousNumeric"
+ },
+ new EntryCell {
+ Keyboard = Keyboard.Numeric,
+ Placeholder = "0",
+ AutomationId = "entryNumeric"
+ }
+ }
+ }
+ };
+ }
+
+#if UITEST
+ [Test]
+ [Ignore("Needs Xamarin.UITest 0.18")]
+ public void Bugzilla33578Test ()
+ {
+ if (RunningApp is iOSApp) {
+ RunningApp.ScrollDown ();
+ RunningApp.ScrollDown ();
+ RunningApp.Tap (x => x.Marked ("0"));
+ var e = RunningApp.Query (c => c.Marked ("0").Parent ("UITextField").Index (0).Invoke ("keyboardType")) [0];
+ //8 DecimalPad
+ Assert.AreEqual (8, e);
+ RunningApp.DismissKeyboard ();
+ RunningApp.Tap (x => x.Marked ("Enter text here").Index (0).Parent ());
+ RunningApp.ScrollUp ();
+ RunningApp.Tap (x => x.Marked ("Enter text here 1"));
+ RunningApp.Tap (x => x.Marked ("Enter text here 2").Index (0).Parent ());
+ var e1 = RunningApp.Query (c => c.Marked ("Enter text here 2").Parent ("UITextField").Index (0).Invoke ("keyboardType")) [0];
+ Assert.AreEqual (0, e1);
+ }
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33612.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33612.cs
new file mode 100644
index 00000000..95c0b30c
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33612.cs
@@ -0,0 +1,159 @@
+using System;
+using System.Linq;
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using NUnit.Framework;
+using Xamarin.UITest;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 33612,
+ "(A) Removing a page from the navigation stack causes an 'Object reference' exception in Android only",
+ PlatformAffected.Android)]
+ public class Bugzilla33612 : TestNavigationPage
+ {
+ class Page1 : ContentPage
+ {
+ public Page1()
+ {
+ var button = new Button { Text = "Go To Page 2" };
+ button.Clicked += (sender, args) => Navigation.PushAsync(new Page2());
+
+ Content = new StackLayout()
+ {
+ Children = {
+ new Label { Text = "This is Page 1 - the root page" },
+ button
+ }
+ };
+ }
+ }
+
+ class FakePage : ContentPage
+ {
+ public FakePage()
+ {
+ Content = new StackLayout()
+ {
+ Children = {
+ new Label { Text = "This is a fake page. It will never show up." }
+ }
+ };
+ }
+ }
+
+ class Page2 : ContentPage
+ {
+ public Page2()
+ {
+ var button = new Button { Text = "Go to Page 3" };
+ button.Clicked += async (sender, args) =>
+ {
+ int numPagesToRemove = Navigation.NavigationStack.Count;
+
+ Page3 page3 = new Page3();
+ await Navigation.PushAsync(page3);
+
+ var fake = new FakePage();
+ Navigation.InsertPageBefore(fake, page3);
+
+ // Remove all the previous pages on the stack (i.e., Page 1)
+ // This should work fine
+ for (int i = 0; i < numPagesToRemove; i++)
+ {
+ Page p = Navigation.NavigationStack.ElementAt(0);
+ Navigation.RemovePage(p);
+ }
+ };
+
+ Content = new StackLayout()
+ {
+ Children = {
+ new Label { Text = "This is Page 2" },
+ button
+ }
+ };
+ }
+ }
+
+ class SuccessPage : ContentPage
+ {
+ public SuccessPage()
+ {
+ Content = new StackLayout()
+ {
+ Children = {
+ new Label { Text = "If you're seeing this, nothing crashed. Yay!" }
+ }
+ };
+ }
+ }
+
+ class Page3 : ContentPage
+ {
+ public Page3()
+ {
+ var button = new Button { AutomationId = "btn", Text = "Return To Page 2" };
+ button.Clicked += (sender, args) =>
+ {
+ int numPagesToRemove = Navigation.NavigationStack.Count;
+
+ // Remove all the previous pages on the stack
+ // Originally this would fail (and crash the app), because FakePage
+ // was never actually run through SwitchContentAsync
+ // which means that it never had its renderer set.
+ // But now it should work just fine
+ for (int i = 0; i < numPagesToRemove - 1; i++)
+ {
+ Page p = Navigation.NavigationStack.ElementAt(0);
+ Navigation.RemovePage(p);
+ }
+
+ var success = new SuccessPage();
+ Navigation.PushAsync(success);
+ };
+
+ Content = new StackLayout()
+ {
+ Children = {
+ new Label { Text = "This is Page 3" },
+ button
+ }
+ };
+ }
+ }
+
+ protected override void Init ()
+ {
+ var page1 = new Page1 ();
+
+ PushAsync (page1);
+ }
+
+#if UITEST
+ [Test]
+ [UiTest (typeof(NavigationPage))]
+ public void Issue33612RemovePagesWithoutRenderers ()
+ {
+ RunningApp.WaitForElement (q => q.Marked ("Go To Page 2"));
+ RunningApp.Tap (q => q.Marked("Go To Page 2"));
+
+ RunningApp.WaitForElement (q => q.Marked("This is Page 2"));
+ RunningApp.Screenshot ("At Page 2");
+ RunningApp.Tap (q => q.Marked("Go to Page 3"));
+
+ RunningApp.WaitForElement ("This is Page 3");
+ RunningApp.WaitForElement (q => q.Marked ("Return To Page 2"),
+ timeout: TimeSpan.FromSeconds (15));
+ RunningApp.Screenshot("At Page 3");
+ RunningApp.Tap (q => q.Marked("Return To Page 2"));
+
+ RunningApp.WaitForElement ("If you're seeing this, nothing crashed. Yay!");
+ RunningApp.Screenshot ("Success Page");
+ }
+#endif
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33714.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33714.cs
new file mode 100644
index 00000000..6fce942d
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33714.cs
@@ -0,0 +1,86 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls.Issues
+{
+
+ [Issue (IssueTracker.Bugzilla, 33714, "[WP] Navigating Back Within MasterDetailPage.Detail Causes Crash", NavigationBehavior.PushModalAsync)]
+ public class Bugzilla33714 : MasterDetailPage
+ {
+ public Bugzilla33714 ()
+ {
+ Master = new MasterPage (this);
+ Detail = new NavigationPage (new ContentPage
+ {
+ Title = "Home",
+ Content = new StackLayout
+ {
+ Children = {
+ new Label { Text = "This is the home detail page"}
+ }
+ }
+ });
+ }
+
+ public class MoreDetail : ContentPage
+ {
+ public MoreDetail ()
+ {
+ Content = new StackLayout {
+ Children = {
+ new Label { Text = "More details" },
+ new Button { Text = "Go to more detail page", Command = new Command(async () => await Navigation.PushAsync(new MoreDetail()))},
+ new Button { Text = "Go back", Command = new Command(async () => await Navigation.PopAsync())}
+ }
+ };
+ }
+ }
+
+ public class DetailPage : ContentPage
+ {
+ public DetailPage ()
+ {
+ Title = "Detail";
+ Content = new StackLayout {
+ Children = {
+ new Label { Text = "This is a Detail ContentPage" },
+ new Button { Text = "Go to more detail page", Command = new Command(async () => await Navigation.PushAsync(new MoreDetail()))}
+ }
+ };
+ }
+ }
+
+ public class MasterPage : ContentPage
+ {
+ readonly MasterDetailPage _masterPage;
+ List<string> _items;
+
+ public MasterPage (MasterDetailPage masterPage)
+ {
+ _masterPage = masterPage;
+ Title = "Menu";
+
+ for (int i = 0; i < 5; i++ )
+ {
+ if (i == 0) _items = new List<string>();
+
+ _items.Add("Menu Items");
+ }
+
+ var list = new ListView { ItemsSource = _items, RowHeight = 100, HasUnevenRows = true };
+ list.ItemSelected += list_ItemSelected;
+
+ Content = list;
+ }
+
+ void list_ItemSelected(object sender, SelectedItemChangedEventArgs e)
+ {
+ var listView = (ListView) sender;
+
+ _masterPage.Detail = new NavigationPage(new DetailPage());
+ }
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33870.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33870.cs
new file mode 100644
index 00000000..d0d9bbc6
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33870.cs
@@ -0,0 +1,71 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Runtime.CompilerServices;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 33870, "[W] Crash when the ListView Selection is set to null", PlatformAffected.WinRT)]
+ public class Bugzilla33870 : TestContentPage
+ {
+ public class Section : ObservableCollection<string>
+ {
+ public Section (string title, IEnumerable<string> items = null)
+ : this (items ?? new List<string> ())
+ {
+ Title = title;
+ }
+
+ public Section (IEnumerable<string> items)
+ : base (items)
+ { }
+
+ public string Title { get; set; }
+ }
+
+ protected override void Init ()
+ {
+ var source = new ObservableCollection<Section> {
+ new Section("SECTION 1") {
+ "ITEM 1",
+ "ITEM 2",
+ },
+ new Section("SECTION 2") {
+ "ITEM 3",
+ "CLEAR SELECTION",
+ }
+ };
+
+ var listview = new ListView {
+ ItemsSource = source,
+ IsGroupingEnabled = true,
+ GroupDisplayBinding = Binding.Create<Section> (x => x.Title),
+ };
+
+ var label = new Label { Text = "Tap CLEAR SELECTION. If the app does not crash and no item is selected, the test has passed." };
+
+ listview.ItemSelected += (sender, args) =>
+ {
+ string selecteditem = args.SelectedItem?.ToString ();
+ label.Text = selecteditem;
+ if (selecteditem == "CLEAR SELECTION") {
+ label.Text = "cleared";
+ ((ListView) sender).SelectedItem = null;
+ }
+ };
+
+ var stack = new StackLayout {
+ Children = {
+ label,
+ listview
+ }
+ };
+
+ Content = stack;
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33890.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33890.cs
new file mode 100644
index 00000000..bb3a3765
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33890.cs
@@ -0,0 +1,38 @@
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls.Issues
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 33890, "Setting CancelButtonColor does not have any effect", PlatformAffected.iOS)]
+ public class Bugzilla33890 : TestContentPage
+ {
+ protected override void Init ()
+ {
+ Label header = new Label {
+ Text = "Search Bar",
+ FontAttributes = FontAttributes.Bold,
+ FontSize = 50,
+ HorizontalOptions = LayoutOptions.Center
+ };
+
+ SearchBar searchBar = new SearchBar {
+ Placeholder = "Enter anything",
+ CancelButtonColor = Color.Red
+ };
+
+ Label reproSteps = new Label {
+ Text =
+ "Tap on the search bar and enter some text. The 'Cancel' button should appear. If the 'Cancel' button is not red, this is broken.",
+ HorizontalOptions = LayoutOptions.Center
+ };
+
+ Content = new StackLayout {
+ Children = {
+ header,
+ searchBar,
+ reproSteps
+ }
+ };
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34007.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34007.cs
new file mode 100644
index 00000000..cc490e4c
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34007.cs
@@ -0,0 +1,91 @@
+using System;
+using System.Xml.Linq;
+using Xamarin.Forms.CustomAttributes;
+#if UITEST
+using NUnit.Framework;
+using Xamarin.UITest;
+
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 34007, "Z order drawing of children views are different on Android, iOS, Win", PlatformAffected.Android | PlatformAffected.iOS)]
+ public class Bugzilla34007 : TestContentPage
+ {
+ protected override void Init ()
+ {
+ var grid = new Grid ();
+
+ var button0 = new Button {
+ Text = "Button 0",
+ HorizontalOptions = LayoutOptions.Fill,
+ VerticalOptions = LayoutOptions.Fill
+ };
+
+ var button1 = new Button {
+ Text = "Button 1",
+ HorizontalOptions = LayoutOptions.Fill,
+ VerticalOptions = LayoutOptions.Fill
+ };
+
+ var lastButtonTappedLabel = new Label ();
+
+ Action reorder = () => {
+ // Get the last item in the grid
+ var item = grid.Children[1];
+
+ // Remove it
+ grid.Children.RemoveAt(1);
+
+ // And put it back as the 0th item
+ grid.Children.Insert(0, item);
+ };
+
+ button0.Clicked += (sender, args) => {
+ lastButtonTappedLabel.Text = "Button 0 was tapped last";
+ };
+
+ button1.Clicked += (sender, args) => {
+ lastButtonTappedLabel.Text = "Button 1 was tapped last";
+
+ reorder ();
+ };
+
+ grid.Children.Add(button0, 0, 0);
+ grid.Children.Add(button1, 0, 0);
+
+ Content = new StackLayout {
+ Children = { grid, lastButtonTappedLabel }
+ };
+ }
+
+#if UITEST
+ [Test]
+ [UiTest (typeof (Grid))]
+ public void Issue34007TestFirstElementHasLowestZOrder ()
+ {
+ var buttonLocations = RunningApp.WaitForElement (q => q.Marked ("Button 0"));
+
+ var x = buttonLocations [0].Rect.CenterX;
+ var y = buttonLocations [0].Rect.CenterY;
+
+ // Button 1 was the last item added to the grid; it should be tappable
+ RunningApp.Tap (q => q.Button ("Button 1"));
+
+ // The label should indicate that Button 1 was the last button tapped
+ RunningApp.WaitForElement(q => q.Marked("Button 1 was tapped last"));
+
+ RunningApp.Screenshot("Buttons Reordered");
+
+ // Tapping Button1 1 reordered the buttons in the grid; Button 0 should
+ // now be on top. Tapping at the Button 1 location should actually tap
+ // Button 0, and the label should indicate that
+ RunningApp.TapCoordinates(x, y);
+ RunningApp.WaitForElement(q => q.Marked("Button 0 was tapped last"));
+
+ RunningApp.Screenshot("Button 0 Tapped");
+ }
+#endif
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34061.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34061.cs
new file mode 100644
index 00000000..6af8fb6f
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34061.cs
@@ -0,0 +1,76 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 34061, "RelativeLayout - First child added after page display does not appear")]
+ public class Bugzilla34061 : TestContentPage
+ {
+ readonly RelativeLayout _layout = new RelativeLayout ();
+
+ protected override void Init ()
+ {
+ var label = new Label { Text = "Some content goes here", HorizontalOptions = LayoutOptions.Center };
+
+ var addButton = new Button{ Text = "Add Popover", AutomationId = "btnAdd" };
+ addButton.Clicked += (s, ea) => AddPopover ();
+
+ var stack = new StackLayout {
+ Orientation = StackOrientation.Vertical,
+ Children = {
+ label,
+ addButton
+ },
+ };
+
+ _layout.Children.Add (stack,
+ Forms.Constraint.Constant (0),
+ Forms.Constraint.Constant (0),
+ Forms.Constraint.RelativeToParent (p => p.Width),
+ Forms.Constraint.RelativeToParent (p => p.Height));
+
+ Content = _layout;
+ }
+
+ void AddPopover ()
+ {
+ var newView = new Button {
+ BackgroundColor = Color.FromRgba (64, 64, 64, 64),
+ Text = "Remove Me",
+ AutomationId = "btnRemoveMe"
+ };
+ newView.Clicked += (s, ea) => RemovePopover (newView);
+
+ _layout.Children.Add (
+ newView,
+ Forms.Constraint.Constant (0),
+ Forms.Constraint.RelativeToParent (p => p.Height / 2),
+ Forms.Constraint.RelativeToParent (p => p.Width),
+ Forms.Constraint.RelativeToParent (p => p.Height / 2));
+ }
+
+ void RemovePopover (View view)
+ {
+ _layout.Children.Remove (view);
+ }
+
+ #if UITEST
+ [Test]
+ public void Bugzilla34061Test ()
+ {
+ RunningApp.Screenshot ("I am at Bugzilla34061 ");
+ RunningApp.WaitForElement (q => q.Marked ("btnAdd"));
+ RunningApp.Tap (q => q.Marked ("btnAdd"));
+ RunningApp.WaitForElement (q => q.Marked ("Remove Me"));
+ RunningApp.Screenshot ("I see the button");
+ }
+ #endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34072.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34072.cs
new file mode 100644
index 00000000..d08b2f36
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34072.cs
@@ -0,0 +1,54 @@
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls.TestCasesPages
+{
+ [Preserve (AllMembers = true)]
+ [Issue(IssueTracker.Bugzilla, 34072, "Inconsistent Disabled Button behavior between Forms for Android & iOS")]
+ public class Bugzilla34072 : TestContentPage
+ {
+ Button _testButton;
+ Label _reproStepsLabel;
+
+ protected override void Init ()
+ {
+ _testButton = new Button () {
+ Text = "Enabled",
+ TextColor = Color.Yellow,
+ IsEnabled = true
+ };
+
+ var switchStateButton = new Button {
+ Text = "Switch Enabled State",
+ Command = new Command (SwitchState),
+ };
+
+ _reproStepsLabel = new Label () {
+ Text = "Tap the 'Switch Enabled State' button. The top button text should be grayed out when the button is Disabled. If the text remains the same color in both states, this is broken."
+ };
+
+ Content = new StackLayout {
+ Padding = 10,
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ VerticalOptions = LayoutOptions.FillAndExpand,
+ Orientation = StackOrientation.Vertical,
+ Children = {
+ _testButton,
+ switchStateButton,
+ _reproStepsLabel
+ }
+ };
+ }
+
+ public void SwitchState ()
+ {
+ if (_testButton.IsEnabled) {
+ _testButton.IsEnabled = false;
+ _testButton.Text = "Disabled";
+ return;
+ }
+
+ _testButton.IsEnabled = true;
+ _testButton.Text = "Enabled";
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34561.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34561.cs
new file mode 100644
index 00000000..3bce1e75
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34561.cs
@@ -0,0 +1,89 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Collections.Generic;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+using Xamarin.UITest.iOS;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 34561, "[A] Navigation.PushAsync crashes when used in Context Actions (legacy)", PlatformAffected.Android)]
+ public class Bugzilla34561 : TestContentPage
+ {
+ protected override void Init ()
+ {
+ var listView = new ListView () {
+ ItemsSource = new List<string> { "item" },
+ ItemTemplate = new DataTemplate (typeof(ContextActionTemplate))
+ };
+
+ Content = listView;
+ }
+
+ [Preserve (AllMembers = true)]
+ public class NextPage : TestContentPage
+ {
+ protected override void Init ()
+ {
+ Content = new Label {
+ AutomationId = "NextPageLabel",
+ Text = "See if I'm here"
+ };
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class ContextActionTemplate : ViewCell
+ {
+ public ContextActionTemplate ()
+ {
+ MenuItem newMenuItem = new MenuItem { Text = "Click" };
+ newMenuItem.Clicked += NewMenuItem_Clicked;
+ ContextActions.Add (newMenuItem);
+
+ View = new StackLayout {
+ Children = {
+ new Label {
+ Text = "Click and hold",
+ AutomationId = "ListViewItem",
+ VerticalOptions = LayoutOptions.Center,
+ HorizontalOptions = LayoutOptions.Center
+ }
+ }
+ };
+ }
+
+ void NewMenuItem_Clicked (object sender, EventArgs e)
+ {
+ ParentView.Navigation.PushAsync (new NextPage (), false);
+ }
+ }
+
+#if UITEST
+ [Test]
+ public void Bugzilla34561Test ()
+ {
+ RunningApp.WaitForElement (q => q.Marked ("ListViewItem"));
+
+ if(RunningApp is iOSApp) {
+ var listItem = RunningApp.Query (q => q.Marked ("ListViewItem"))[0].Rect;
+ RunningApp.DragCoordinates(listItem.CenterX, listItem.CenterY, 0, listItem.CenterY);
+ } else {
+ RunningApp.TouchAndHold (q => q.Marked ("ListViewItem"));
+ }
+
+ RunningApp.WaitForElement (q => q.Marked ("Click"));
+ RunningApp.Tap (q => q.Marked ("Click"));
+ RunningApp.WaitForElement (q => q.Marked ("NextPageLabel"));
+ RunningApp.Screenshot ("I see the next page");
+ }
+#endif
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34632.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34632.cs
new file mode 100644
index 00000000..d75f4792
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34632.cs
@@ -0,0 +1,79 @@
+using System;
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+using Xamarin.UITest.iOS;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 34632, "Can't change IsPresented when setting SplitOnLandscape ")]
+ public class Bugzilla34632 : TestMasterDetailPage
+ {
+ protected override void Init ()
+ {
+ if (Device.OS == TargetPlatform.Windows)
+ MasterBehavior = MasterBehavior.Split;
+ else
+ MasterBehavior = MasterBehavior.SplitOnLandscape;
+
+ Master = new ContentPage { Title = "Main Page",
+ Content = new Button { Text = "Master", AutomationId = "btnMaster",
+ Command = new Command (() => {
+ //If we're in potrait toggle hide the menu on click
+ if (Width < Height || Device.Idiom == TargetIdiom.Phone) {
+ IsPresented = false;
+ }
+ })
+ }
+ };
+
+ Detail = new NavigationPage (new ModalRotationIssue ());
+ NavigationPage.SetHasBackButton (Detail, false);
+ }
+
+ [Preserve (AllMembers = true)]
+ public class ModalRotationIssue : ContentPage
+ {
+ public ModalRotationIssue ()
+ {
+ var btn = new Button { Text = "Open Modal", AutomationId = "btnModal" };
+ btn.Clicked += OnButtonClicked;
+ Content = btn;
+ }
+
+ async void OnButtonClicked (object sender, EventArgs e)
+ {
+ var testButton = new Button { Text = "Rotate Before Clicking", AutomationId = "btnDismissModal" };
+ testButton.Clicked += (async (snd, args) => await Navigation.PopModalAsync ());
+
+ var testModal = new ContentPage () {
+ Content = testButton
+ };
+
+ await Navigation.PushModalAsync (testModal);
+ }
+ }
+
+ #if UITEST
+ [Test]
+ public void Bugzilla34632Test ()
+ {
+ var app = RunningApp as iOSApp;
+ if (app != null && app.Device.IsTablet) {
+ RunningApp.SetOrientationPortrait ();
+ RunningApp.Tap (q => q.Marked ("btnModal"));
+ RunningApp.SetOrientationLandscape ();
+ RunningApp.Tap (q => q.Marked ("btnDismissModal"));
+ RunningApp.Tap (q => q.Marked ("btnModal"));
+ RunningApp.SetOrientationPortrait ();
+ RunningApp.Tap (q => q.Marked ("btnDismissModal"));
+ RunningApp.Tap (q => q.Marked ("btnMaster"));
+ }
+ }
+ #endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34720.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34720.cs
new file mode 100644
index 00000000..9d74e8e4
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34720.cs
@@ -0,0 +1,352 @@
+using Xamarin.Forms.CustomAttributes;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Threading.Tasks;
+using System;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 34720, "Incorrect iOS button IsEnabled when scrolling ListView with command binding ")]
+ public class Bugzilla34720 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ protected override void Init ()
+ {
+ Title = "Test Command Binding";
+ _list = new ListView () {
+ ClassId = "SampleList",
+ // Note: Turning on and off row height does not effect the issue,
+ // but with row heights on there is a visual glitch with the recyclyed row spacing
+ //RowHeight = SampleViewCell.RowHeight,
+ HasUnevenRows = true,
+ ItemTemplate = new DataTemplate (typeof(SampleViewCell)),
+ BackgroundColor = Color.FromHex ("E0E0E0"),
+ VerticalOptions = LayoutOptions.FillAndExpand,
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ };
+ _list.SetBinding (ListView.ItemsSourceProperty, Binding.Create<TestListViewModel> (r => r.Items));
+ _list.SetBinding (ListView.RefreshCommandProperty, Binding.Create<TestListViewModel> (r => r.RefreshCommand));
+ _list.SetBinding (ListView.IsRefreshingProperty, Binding.Create<TestListViewModel> (r => r.IsRefreshing));
+
+ var listViewModel = new TestListViewModel ();
+ listViewModel.AddTestData ();
+ BindingContext = listViewModel;
+
+
+ _list.ItemTapped += (sender, e) =>
+ {
+ DisplayAlert("hello", "You tapped " + e.Item.ToString(), "OK", "Cancel");
+ };
+
+ var btnDisable = new Button () {
+ Text = "Disable ListView",
+ };
+
+ btnDisable.Clicked += (object sender, EventArgs e) => {
+ if (_list.IsEnabled == true){
+ _list.IsEnabled = false;
+ btnDisable.Text = "Enable ListView";
+ }
+ else {
+ _list.IsEnabled = true;
+ btnDisable.Text = "Disable ListView";
+ }
+ };
+
+ Content = new StackLayout
+ {
+ VerticalOptions = LayoutOptions.FillAndExpand,
+ Children = { btnDisable, _list }
+ };
+ }
+
+ ListView _list;
+
+ [Preserve (AllMembers = true)]
+ public class SampleViewCell : ViewCell
+ {
+ public static int RowHeight = 120;
+ static int s_idSeed;
+ int id;
+
+ public SampleViewCell ()
+ {
+ id = s_idSeed++;
+ var grid = new Grid {
+ ClassId = "SampleCard",
+ Padding = new Thickness (7, 10),
+ RowSpacing = 0,
+ ColumnSpacing = 0,
+ RowDefinitions = {
+ new RowDefinition{ Height = new GridLength (80, GridUnitType.Absolute) },
+ new RowDefinition{ Height = new GridLength (40, GridUnitType.Absolute) },
+ },
+
+ };
+
+ var head = new SampleHeaderView ();
+ grid.Children.Add (head);
+
+ var foot = new SampleListActionView ();
+ Grid.SetRow (foot, 1);
+ grid.Children.Add (foot);
+
+ View = grid;
+ }
+
+ #region Testing Code
+
+ // Note this block can be removed it is just used to observing the ViewCell creation.
+ int _counter;
+
+
+ protected override void OnAppearing ()
+ {
+
+ base.OnAppearing ();
+ _counter++;
+ System.Diagnostics.Debug.WriteLine ("OnAppearing {0}, {1}", id, _counter);
+ }
+
+ protected override void OnDisappearing ()
+ {
+ base.OnDisappearing ();
+ _counter--;
+ System.Diagnostics.Debug.WriteLine ("OnDisappearing {0}, {1}", id, _counter);
+ }
+
+ #endregion
+
+ public class SampleHeaderView : ContentView
+ {
+
+ public SampleHeaderView ()
+ {
+ //+-----------+----------------+
+ //| 1 | |
+ //+-----------+----------------+
+ //| 2 | |
+ //+-----------+----------------+
+
+
+ var grid = new Grid {
+ Padding = new Thickness (5, 5, 5, 1),
+ RowSpacing = 1,
+ ColumnSpacing = 1,
+ BackgroundColor = Color.FromHex ("FAFAFA"),
+ RowDefinitions = {
+ new RowDefinition{ Height = new GridLength (1.25, GridUnitType.Star) },
+ new RowDefinition{ Height = new GridLength (0.8, GridUnitType.Star) },
+ },
+ ColumnDefinitions = {
+ new ColumnDefinition{ Width = new GridLength (1, GridUnitType.Star) },
+ new ColumnDefinition{ Width = new GridLength (1, GridUnitType.Star) },
+ }
+ };
+ //1 number
+ var materialNumber = new Label () {
+ VerticalOptions = LayoutOptions.StartAndExpand,
+ HorizontalOptions = LayoutOptions.StartAndExpand
+ };
+ Grid.SetColumnSpan (materialNumber, 2);
+ materialNumber.SetBinding (Label.TextProperty, Binding.Create<TestViewModel> (vm => vm.Number));
+ grid.Children.Add (materialNumber);
+
+ //2 Description
+ var materialDescription = new Label () {
+ VerticalOptions = LayoutOptions.StartAndExpand,
+ HorizontalOptions = LayoutOptions.StartAndExpand
+ };
+ Grid.SetColumnSpan (materialDescription, 2);
+ Grid.SetRow (materialDescription, 1);
+ materialDescription.SetBinding (Label.TextProperty, Binding.Create<TestViewModel> (vm => vm.Description));
+ //grid.Children.Add (materialDescription);
+
+ //3 Approve Label
+ var canApprove = new Label () {
+ VerticalOptions = LayoutOptions.StartAndExpand,
+ HorizontalOptions = LayoutOptions.StartAndExpand
+ };
+ Grid.SetColumn (canApprove, 1);
+ Grid.SetRow (canApprove, 1);
+ canApprove.SetBinding (Label.TextProperty, Binding.Create<TestViewModel> (vm => vm.CanApprove, stringFormat: "Can Approve: {0}"));
+ grid.Children.Add (canApprove);
+
+ //3 Approve Label
+ var canDeny = new Label () {
+ VerticalOptions = LayoutOptions.StartAndExpand,
+ HorizontalOptions = LayoutOptions.StartAndExpand
+ };
+ Grid.SetColumn (canDeny, 0);
+ Grid.SetRow (canDeny, 1);
+ canDeny.SetBinding (Label.TextProperty, Binding.Create<TestViewModel> (vm => vm.CanDeny, stringFormat: "Can Deny: {0}"));
+ grid.Children.Add (canDeny);
+
+ Content = grid;
+
+ }
+ }
+
+ public class SampleListActionView : ContentView
+ {
+ public SampleListActionView ()
+ {
+ var overallGrid = new Grid {
+ BackgroundColor = Color.FromHex ("FAFAFA"),
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ VerticalOptions = LayoutOptions.CenterAndExpand,
+ ColumnDefinitions = {
+ new ColumnDefinition{ Width = new GridLength (1, GridUnitType.Star) },
+ new ColumnDefinition{ Width = new GridLength (1, GridUnitType.Star) },
+ }
+ };
+
+ var grid = new Grid {
+ VerticalOptions = LayoutOptions.FillAndExpand,
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ ColumnDefinitions = {
+ new ColumnDefinition{ Width = new GridLength (1, GridUnitType.Star) },
+ new ColumnDefinition{ Width = new GridLength (1, GridUnitType.Star) },
+ }
+ };
+ // 1 Deny
+ var denyBtn = new Button {
+ ClassId = "btnReject",
+ Text = "DENY",
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ VerticalOptions = LayoutOptions.FillAndExpand
+ };
+
+ denyBtn.SetBinding (Button.CommandProperty, Binding.Create<TestViewModel> (r => r.DenyCommand));
+
+ grid.Children.Add (denyBtn);
+
+ // 2 Approve
+ var approveBtn = new Button {
+ ClassId = "btnApprove",
+ Text = "Approve",
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ VerticalOptions = LayoutOptions.FillAndExpand,
+
+ };
+ Grid.SetColumn (approveBtn, 1);
+ approveBtn.SetBinding (Button.CommandProperty, Binding.Create<TestViewModel> (r => r.ApproveCommand));
+ grid.Children.Add (approveBtn);
+
+
+ Grid.SetColumn (grid, 1);
+ overallGrid.Children.Add (grid);
+ Content = overallGrid;
+ }
+
+ }
+
+
+ }
+
+ [Preserve (AllMembers = true)]
+ public class TestListViewModel : INotifyPropertyChanged
+ {
+ Collection<TestViewModel> _items = new ObservableCollection<TestViewModel> ();
+
+ public void AddTestData ()
+ {
+ for (int i = 0; i < 20; i++) {
+ _items.Add (new TestViewModel () {
+ Description = string.Format ("Sample Description {0}", i),
+ Number = (i + 1).ToString (),
+ CanApprove = i % 2 == 0,
+ CanDeny = i % 2 == 0
+ });
+ }
+ RaisePropertyChanged ("Items");
+ }
+
+ public Collection<TestViewModel> Items { get { return _items; } set { _items = value; } }
+
+ public Command RefreshCommand {
+ get {
+ return new Command (OnRefresh);
+ }
+ }
+
+ public bool IsRefreshing { get; set; }
+
+ async void OnRefresh ()
+ {
+ IsRefreshing = true;
+ RaisePropertyChanged ("IsRefreshing");
+ _items.Clear ();
+ await Task.Delay (1000);
+ AddTestData ();
+ IsRefreshing = false;
+ RaisePropertyChanged ("IsRefreshing");
+ }
+
+ #region INotifyPropertyChanged implementation
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ #endregion
+
+ protected virtual void RaisePropertyChanged (string propertyName)
+ {
+ PropertyChangedEventHandler propertyChanged = PropertyChanged;
+ if (propertyChanged != null) {
+ propertyChanged (this, new PropertyChangedEventArgs (propertyName));
+ }
+ }
+ }
+
+ [Preserve (AllMembers = true)]
+ public class TestViewModel
+ {
+
+ public string Number { get; set; }
+
+ public string Description { get; set; }
+
+ bool _canApprove;
+
+ public bool CanApprove {
+ get{ return _canApprove; }
+ set {
+ _canApprove = value;
+ ApproveCommand.ChangeCanExecute ();
+ }
+ }
+
+ bool _canDeny;
+
+ public bool CanDeny {
+ get { return _canDeny; }
+ set {
+ _canDeny = value;
+ DenyCommand.ChangeCanExecute ();
+ }
+ }
+
+ public Command ApproveCommand {
+ get {
+ return new Command (OnApprove, () => CanApprove);
+ }
+ }
+
+ public Command DenyCommand {
+ get {
+ return new Command (OnDeny, () => CanDeny);
+ }
+ }
+
+ async void OnApprove ()
+ {
+ await Application.Current.MainPage.DisplayAlert ("Approve", string.Format ("Can Approve {0} {1}", Number, CanApprove), "Ok");
+ }
+
+ async void OnDeny ()
+ {
+ await Application.Current.MainPage.DisplayAlert ("Deny", string.Format ("Can Deny {0} {1}", Number, CanDeny), "Ok");
+ }
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34727.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34727.cs
new file mode 100644
index 00000000..fa17a728
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34727.cs
@@ -0,0 +1,30 @@
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 34727, "(A) Cannot browse files from WebView on Android", PlatformAffected.Android)]
+ public class Bugzilla34727 : TestContentPage
+ {
+ protected override void Init ()
+ {
+ var webView = new WebView ();
+
+ var htmlSource = new HtmlWebViewSource { Html = @"
+<h3>Test Web View File Chooser</h3>
+<ol>
+ <li>Open the camera app.</li>
+ <li>Take a picture.</li>
+ <li>Return to this page.</li>
+ <li>Tap the 'Choose File' button; a file picker should appear.</li>
+ <li>Select the picture you just took.</li>
+ <li>The text 'No file chosen' should change to the name of your image file.</li>
+</ol>
+<br/>
+<input type='file' name='file' id='chooser' accept='image/*'>" };
+
+ webView.Source = htmlSource;
+ Content = webView;
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34912.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34912.cs
new file mode 100644
index 00000000..5042bc58
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla34912.cs
@@ -0,0 +1,106 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+using System.Collections.ObjectModel;
+using System.Linq;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 34912, "ListView.IsEnabled has no effect on iOS")]
+ public class Bugzilla34912 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ protected override void Init ()
+ {
+ Padding = new Thickness (0, 20, 0, 0);
+
+ var source = SetupList ();
+
+ var list = new ListView
+ {
+ ItemTemplate = new DataTemplate(typeof(TextCell))
+ {
+ Bindings = {
+ { TextCell.TextProperty, new Binding ("Name") }
+ }
+ },
+
+ GroupDisplayBinding = new Binding("LongTitle"),
+ GroupShortNameBinding = new Binding("Title"),
+ Header = "HEADER",
+ Footer = "FOOTER",
+ IsGroupingEnabled = true,
+ ItemsSource = SetupList(),
+ };
+
+ list.ItemTapped += (sender, e) =>
+ {
+ var listItem = (Issue2777.ListItemValue)e.Item;
+ DisplayAlert(listItem.Name, "You tapped " + listItem.Name, "OK", "Cancel");
+ };
+
+ var btnDisable = new Button () {
+ Text = "Disable ListView",
+ AutomationId = "btnDisable"
+ };
+ btnDisable.Clicked += (object sender, EventArgs e) => {
+ if (list.IsEnabled == true){
+ list.IsEnabled = false;
+ btnDisable.Text = "Enable ListView";
+ }
+ else {
+ list.IsEnabled = true;
+ btnDisable.Text = "Disable ListView";
+ }
+ };
+
+ Content = new StackLayout
+ {
+ VerticalOptions = LayoutOptions.FillAndExpand,
+ Children = { btnDisable, list }
+ };
+ }
+
+ ObservableCollection<Issue2777.ListItemCollection> SetupList()
+ {
+ var allListItemGroups = new ObservableCollection<Issue2777.ListItemCollection>();
+
+ foreach (var item in Issue2777.ListItemCollection.GetSortedData())
+ {
+ // Attempt to find any existing groups where theg group title matches the first char of our ListItem's name.
+ var listItemGroup = allListItemGroups.FirstOrDefault(g => g.Title == item.Label);
+
+ // If the list group does not exist, we create it.
+ if (listItemGroup == null)
+ {
+ listItemGroup = new Issue2777.ListItemCollection(item.Label);
+ listItemGroup.Add(item);
+ allListItemGroups.Add(listItemGroup);
+ }
+ else
+ { // If the group does exist, we simply add the demo to the existing group.
+ listItemGroup.Add(item);
+ }
+ }
+ return allListItemGroups;
+ }
+
+#if UITEST
+ [Test]
+ public void Bugzilla34912Test ()
+ {
+ RunningApp.Tap (q => q.Marked ("Allen"));
+ RunningApp.WaitForElement (q => q.Marked ("You tapped Allen"));
+ RunningApp.Tap (q => q.Marked ("OK"));
+ RunningApp.Tap (q => q.Marked ("btnDisable"));
+ RunningApp.Tap (q => q.Marked ("Allen"));
+ RunningApp.WaitForNoElement (q => q.Marked ("You tapped Allen"));
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35078.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35078.cs
new file mode 100644
index 00000000..054aca0f
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35078.cs
@@ -0,0 +1,34 @@
+using System.Threading.Tasks;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Issue (IssueTracker.Bugzilla, 35078,
+ "Checking IsInvokeRequired on WinRT when off the dispatcher thread causes a null reference exception",
+ PlatformAffected.WinRT)]
+ public class Bugzilla35078 : TestContentPage
+ {
+ protected override void Init ()
+ {
+ var button = new Button { Text = "Go" };
+
+ var instructions = new Label {
+ Text =
+ "Click the 'Go' button. If the application crashes or a label with the text 'Sucess' does not appear, the test has failed."
+ };
+
+ var success = new Label ();
+
+ button.Clicked += (sender, args) => {
+ Task.Run (() => {
+ bool invokeRequired = Device.IsInvokeRequired;
+ if (invokeRequired) {
+ Device.BeginInvokeOnMainThread (() => success.Text = "Success");
+ }
+ });
+ };
+
+ Content = new StackLayout { Children = { instructions, button, success } };
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35127.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35127.cs
new file mode 100644
index 00000000..f5c338ab
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35127.cs
@@ -0,0 +1,22 @@
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 35127, "It is possible to craft a page such that it will never display on Windows")]
+ public class Bugzilla35127 : TestContentPage
+ {
+ protected override void Init ()
+ {
+ Content = new StackLayout {
+ Children = {
+ new Label { Text = "See me?" },
+ new ScrollView {
+ IsVisible = false,
+ Content = new Button { Text = "Click Me?" }
+ }
+ }
+ };
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35157.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35157.cs
new file mode 100644
index 00000000..cd4721e3
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35157.cs
@@ -0,0 +1,58 @@
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 35157, "CarouselPage inside NavPage inside TabbedPage gets laid out incorrectly", NavigationBehavior.PushModalAsync)]
+ public class Bugzilla35157 : TestTabbedPage
+ {
+ protected override void Init ()
+ {
+ var button = new Button {
+ Text = "Go",
+ AutomationId = "firstButton"
+ };
+
+
+ button.Clicked += (sender, args) => {
+ Button button2 = null;
+ button.Navigation.PushAsync (new CarouselPage {
+ Children = {
+ new ContentPage {
+ Content = button2 = new Button {
+ AutomationId = "secondButton",
+ VerticalOptions = LayoutOptions.EndAndExpand,
+ Text = "Click Me"
+ }
+ }
+ }
+ });
+
+ button2.Clicked += (s, a) => button2.Text = "Button Clicked!";
+ };
+
+ var tab = new NavigationPage(new ContentPage {Content = button});
+ tab.Title = "Tab";
+ Children.Add (tab);
+
+
+ }
+
+#if UITEST
+ [Test]
+ public void ButtonCanBeClicked ()
+ {
+ RunningApp.WaitForElement (q => q.Marked ("firstButton"));
+ RunningApp.Tap (q => q.Marked ("firstButton"));
+ RunningApp.WaitForElement (q => q.Marked ("secondButton"));
+ RunningApp.Tap (q => q.Marked ("secondButton"));
+ RunningApp.WaitForElement (q => q.Button ("Button Clicked!"));
+ }
+#endif
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35294.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35294.cs
new file mode 100644
index 00000000..036b7a91
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35294.cs
@@ -0,0 +1,45 @@
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 35294, "Certain pages do not align properly in RT Desktop")]
+ public class Bugzilla35294 : TestContentPage
+ {
+ public static Label LblMsg = new Label
+ {
+ FontSize = 16,
+ Text = "This is an example.... what is wrong with this? ",
+ HorizontalOptions = LayoutOptions.Center,
+ TextColor = Color.Black,
+ };
+
+ protected override void Init ()
+ {
+ Label header = new Label
+ {
+ Text = "Should not see blue",
+ Font = Font.BoldSystemFontOfSize(40),
+ HorizontalOptions = LayoutOptions.Center,
+ TextColor = Color.Black
+ };
+
+ StackLayout stack = new StackLayout
+ {
+ BackgroundColor = Color.White,
+ VerticalOptions = LayoutOptions.FillAndExpand,
+ Spacing = 10,
+
+ Children = { header, LblMsg, }
+ };
+
+ Content = new ScrollView
+ {
+ BackgroundColor = Color.Blue,
+ VerticalOptions = LayoutOptions.FillAndExpand,
+ Orientation = ScrollOrientation.Vertical,
+ Content = stack
+ };
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35472.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35472.cs
new file mode 100644
index 00000000..1513463c
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35472.cs
@@ -0,0 +1,88 @@
+using System;
+using System.Diagnostics;
+using Xamarin.Forms.CustomAttributes;
+#if UITEST
+using Xamarin.Forms.Core.UITests;
+using NUnit.Framework;
+using Xamarin.UITest;
+
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 35472, "PopAsync during ScrollToAsync throws NullReferenceException")]
+ public class Bugzilla35472 : TestNavigationPage
+ {
+ protected override void Init ()
+ {
+ // Set up the scroll viewer page
+ var scrollToButton = new Button () { Text = "Now push this button" };
+
+ var stackLayout = new StackLayout ();
+
+ stackLayout.Children.Add (scrollToButton);
+
+ for (int n = 0; n < 100; n++) {
+ stackLayout.Children.Add (new Label () { Text = n.ToString () });
+ }
+
+ var scrollView = new ScrollView () {
+ Content = stackLayout
+ };
+
+ var pageWithScrollView = new ContentPage () {
+ Content = scrollView
+ };
+
+ // Set up the start page
+ var goButton = new Button () {
+ Text = "Push this button"
+ };
+
+ var successLabel = new Label () { Text = "The test has passed", IsVisible = false };
+
+ var startPage = new ContentPage () {
+ Content = new StackLayout {
+ VerticalOptions = LayoutOptions.Center,
+ Children = {
+ goButton,
+ successLabel
+ }
+ }
+ };
+
+ PushAsync (startPage);
+
+ goButton.Clicked += (sender, args) => Navigation.PushAsync (pageWithScrollView);
+
+ scrollToButton.Clicked += async (sender, args) => {
+ try {
+ // Deliberately not awaited so we can simulate a user navigating back
+ scrollView.ScrollToAsync (0, 1500, true);
+ await Navigation.PopAsync ();
+ successLabel.IsVisible = true;
+ } catch (Exception ex) {
+ Debug.WriteLine (ex);
+ }
+ };
+ }
+
+#if UITEST
+ [Test]
+ [UiTest (typeof(NavigationPage))]
+ public void Issue35472PopAsyncDuringAnimatedScrollToAsync ()
+ {
+ RunningApp.WaitForElement (q => q.Marked ("Push this button"));
+ RunningApp.Tap (q => q.Marked ("Push this button"));
+
+ RunningApp.WaitForElement (q => q.Marked ("Now push this button"));
+ RunningApp.Screenshot ("On Page With ScrollView");
+ RunningApp.Tap (q => q.Marked ("Now push this button"));
+
+ RunningApp.WaitForElement ("The test has passed");
+ RunningApp.Screenshot ("Success");
+ }
+#endif
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35477.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35477.cs
new file mode 100644
index 00000000..8c1e7a69
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35477.cs
@@ -0,0 +1,49 @@
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using NUnit.Framework;
+using Xamarin.UITest.Queries;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 35477, "Tapped event does not fire when added to Frame in Android AppCompat",
+ PlatformAffected.Android)]
+ public class Bugzilla35477 : TestContentPage
+ {
+ protected override void Init ()
+ {
+ var instructions = new Label {
+ Text = "Tap the frame below. The label with the text 'No taps yet' should change its text to 'Frame was tapped'."
+ };
+ var frame = new Frame () {};
+ var frameLabel = new Label() {Text = "Tap here" };
+
+ frame.Content = new StackLayout() {Children = { frameLabel }};
+
+ var label = new Label { Text = "No taps yet" };
+
+ var rec = new TapGestureRecognizer { NumberOfTapsRequired = 1 };
+ rec.Tapped += (s, e) => { label.Text = "Frame was tapped"; };
+ frame.GestureRecognizers.Add (rec);
+
+ Content = new StackLayout {
+ Children = { instructions, frame, label }
+ };
+ }
+
+#if UITEST
+ [Test]
+ public void TapGestureFiresOnFrame ()
+ {
+ RunningApp.WaitForElement ("No taps yet");
+ RunningApp.WaitForElement ("Tap here");
+
+ RunningApp.Tap ("Tap here");
+
+ RunningApp.WaitForElement ("Frame was tapped");
+ }
+#endif
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35490.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35490.cs
new file mode 100644
index 00000000..119d297f
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35490.cs
@@ -0,0 +1,39 @@
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 35490, "Label Text Misaligned in Windows Phone 8.1 and WinRT",
+ PlatformAffected.WinPhone | PlatformAffected.WinRT)]
+ public class Bugzilla35490 : TestContentPage
+ {
+ protected override void Init ()
+ {
+ var instructions = new Label {
+ Text =
+ "The label in the red box below should be centered horizontally and vertically. If it's not, this test has failed."
+ };
+
+
+ var label = new Label {
+ BackgroundColor = Color.Red,
+ TextColor = Color.White,
+ HorizontalTextAlignment = TextAlignment.Center,
+ VerticalTextAlignment = TextAlignment.Center,
+ HeightRequest = 200,
+ HorizontalOptions = LayoutOptions.Fill,
+ Text = "Should be centered horizontally and vertically"
+ };
+
+
+ Content = new StackLayout {
+ HorizontalOptions = LayoutOptions.Fill,
+ VerticalOptions = LayoutOptions.Fill,
+ Children = {
+ instructions,
+ label
+ }
+ };
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35733.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35733.cs
new file mode 100644
index 00000000..5e6c39ca
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35733.cs
@@ -0,0 +1,58 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+using System.Threading.Tasks;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 35733, "iOS WebView crashes when loading an URL with encoded parameters", PlatformAffected.iOS)]
+ public class Bugzilla35733 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ protected override void Init ()
+ {
+ var thisDoesNotWorkButton = new Button {
+ Text = "This will crash",
+ AutomationId = "btnGo"
+
+ };
+ thisDoesNotWorkButton.Clicked += async (object sender, EventArgs e) => await ShowLocation ("KÅRA");
+
+ Content = new StackLayout {
+ VerticalOptions = LayoutOptions.Center,
+ Children = {
+ thisDoesNotWorkButton
+ }
+ };
+ }
+
+ async Task ShowLocation(string locationString)
+ {
+ var stringUri = string.Format("http://m.liu.se/karta/karta?l=en&px_location={0}", Uri.EscapeDataString(locationString));
+ var uri = new Uri(stringUri);
+ var webPage = new ContentPage {
+ Title = "WebViewTest",
+ Content = new WebView {
+ Source = uri
+ }
+ };
+ await Navigation.PushAsync(webPage);
+ }
+
+#if UITEST
+ [Test]
+ public void Bugzilla35733Test ()
+ {
+ RunningApp.WaitForElement (q => q.Marked ("btnGo"));
+ RunningApp.Tap (q => q.Marked ("btnGo"));
+ RunningApp.WaitForElement (q => q.Marked ("WebViewTest"));
+ RunningApp.Screenshot ("I didn't crash");
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35738.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35738.cs
new file mode 100644
index 00000000..e79343b3
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla35738.cs
@@ -0,0 +1,41 @@
+using System;
+using System.Diagnostics;
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ public class CustomButton : Button
+ {
+ // In the Android project, there's a custom renderer set up for this type
+ }
+
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 35738, "ButtonRenderer UpdateTextColor function crash", PlatformAffected.Android)]
+ public class Bugzilla35738 : TestContentPage
+ {
+ protected override void Init ()
+ {
+ var label = new Label () { Text = "If you can see the button, this test has passed" };
+ var customButton = new CustomButton () { Text = "This is a custom button", TextColor = Color.Fuchsia };
+
+ Content = new StackLayout () {
+ Children = { label, customButton }
+ };
+ }
+
+#if UITEST
+ [Test]
+ [UiTest (typeof(TestContentPage))]
+ public void CallingOnElementChangedOnCustomButtonShouldNotCrash ()
+ {
+ RunningApp.WaitForElement (q => q.Marked ("This is a custom button"));
+ }
+#endif
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36009.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36009.cs
new file mode 100644
index 00000000..0e0e470d
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36009.cs
@@ -0,0 +1,56 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 36009, "Children of Layouts with data bound IsVisible are not displayed")]
+ public class Bugzilla36009 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ [Preserve (AllMembers = true)]
+ public class SampleViewModel: ViewModelBase
+ {
+ public bool IsContentVisible {
+ get{ return GetProperty<bool> (); }
+ set{ SetProperty (value); }
+ }
+ }
+
+ protected override void Init ()
+ {
+ var boxview = new BoxView{ BackgroundColor = Color.Aqua, AutomationId = "Victory" };
+
+ var contentView = new ContentView {
+ Content = boxview
+ };
+
+ contentView.SetBinding (IsVisibleProperty, Binding.Create<SampleViewModel> (t => t.IsContentVisible));
+
+ var layout = new AbsoluteLayout {
+ Children = { contentView }
+ };
+
+ Content = layout;
+
+ var vm = new SampleViewModel ();
+
+ BindingContext = vm;
+
+ vm.IsContentVisible = true;
+ }
+
+#if UITEST
+ [Test]
+ public void Bugzilla36009Test ()
+ {
+ RunningApp.WaitForElement(q => q.Marked("Victory"));
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36014.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36014.cs
new file mode 100644
index 00000000..7e6cd390
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36014.cs
@@ -0,0 +1,16 @@
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Issue (IssueTracker.Bugzilla, 36014, "Picker Control Is Not Rendered Correctly", PlatformAffected.WinPhone)]
+ public class Bugzilla36014 : TestContentPage
+ {
+ protected override void Init ()
+ {
+ var picker = new Picker () { Items = {"Leonardo", "Donatello", "Raphael", "Michaelangelo" } };
+ var label = new Label () {Text = "This test is successful if the picker below spans the width of the screen. If the picker is just a sliver on the left edge of the screen, this test has failed." };
+
+ Content = new StackLayout () { Children = {label, picker}};
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36171.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36171.cs
new file mode 100644
index 00000000..6395e28b
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36171.cs
@@ -0,0 +1,107 @@
+using System;
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using NUnit.Framework;
+using Xamarin.UITest.Queries;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 36171, "WinRT Entry UI not updating on TextChanged",
+ PlatformAffected.WinPhone | PlatformAffected.WinRT)]
+ public class Bugzilla36171 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ protected override void Init ()
+ {
+ var entry = new Entry ();
+ var editor = new Editor();
+ var focuseEntryButton = new Button { Text = "Start Entry" };
+ var focuseEditorButton = new Button { Text = "Start Editor" };
+
+ focuseEntryButton.Clicked += (sender, args) => { entry.Focus (); };
+ focuseEditorButton.Clicked += (sender, args) => { editor.Focus (); };
+
+ var entryLabel = new Label { Text = "Type 123A into the Entry below; the entry should display '123'. If the 'A' is displayed, the test has failed. If the cursor resets to the beginning of the Entry after typing 'A', the test has failed." };
+ var editorLabel = new Label { Text = "Type 123A into the Editor below; the entry should display '123'. If the 'A' is displayed, the test has failed. If the cursor resets to the beginning of the Editor after typing 'A', the test has failed." };
+
+ entry.TextChanged += (sender, args) => {
+ var e = sender as Entry;
+
+ int val;
+
+ if(string.IsNullOrEmpty (args.NewTextValue?.Trim ())) {
+ return;
+ }
+
+ // check if this is numeric
+ if(!int.TryParse (args.NewTextValue, out val)) {
+ // put the old value back.
+ e.Text = args.OldTextValue;
+ }
+ };
+
+ editor.TextChanged += (sender, args) => {
+ var e = sender as Editor;
+
+ int val;
+
+ if(string.IsNullOrEmpty (args.NewTextValue?.Trim ())) {
+ return;
+ }
+
+ // check if this is numeric
+ if(!int.TryParse (args.NewTextValue, out val)) {
+ // put the old value back.
+ e.Text = args.OldTextValue;
+ }
+ };
+
+ // Initialize ui here instead of ctor
+ Content = new StackLayout {
+ Children = { focuseEntryButton, entryLabel, entry, focuseEditorButton, editorLabel, editor }
+ };
+ }
+
+#if UITEST
+ [Test]
+ public void EntryTextDoesNotDisplayNonnumericInput ()
+ {
+ RunningApp.WaitForElement ("Start Entry");
+ RunningApp.Tap ("Start Entry");
+
+ RunningApp.EnterText ("123A");
+
+ var entry = RunningApp.Query (q => q.Text("123"));
+ Assert.That(entry.Length >= 1);
+
+ var failedEntry = RunningApp.Query (q => q.Text("123A"));
+ Assert.That(failedEntry.Length == 0);
+
+ RunningApp.EnterText ("4");
+
+ var entry2 = RunningApp.Query (q => q.Text("1234"));
+ Assert.That(entry2.Length >= 1);
+
+ RunningApp.ClearText();
+
+ RunningApp.WaitForElement ("Start Editor");
+ RunningApp.Tap ("Start Editor");
+
+ RunningApp.EnterText ("123A");
+
+ var editor = RunningApp.Query (q => q.Text("123"));
+ Assert.That(editor.Length >= 1);
+
+ var failedEditor = RunningApp.Query (q => q.Text("123A"));
+ Assert.That(failedEditor.Length == 0);
+
+ RunningApp.EnterText ("4");
+
+ var editor2 = RunningApp.Query (q => q.Text("1234"));
+ Assert.That(editor2.Length >= 1);
+ }
+#endif
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36393.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36393.cs
new file mode 100644
index 00000000..6aecc1a8
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36393.cs
@@ -0,0 +1,43 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve(AllMembers = true)]
+ [Issue(IssueTracker.Bugzilla, 36393, "[A] Default Entry/Editor/SearchBar Font Size is 14 instead of 18")]
+ public class Bugzilla36393 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ protected override void Init()
+ {
+ var label = new Label { FontSize = 18 };
+ var entry = new Entry { };
+ var editor = new Editor { };
+ var searchBar = new SearchBar { };
+
+ label.Text = $"I am label. FontSize:{label.FontSize}";
+ entry.Text = $"I am entry. FontSize:{entry.FontSize}";
+ editor.Text = $"I am editor. FontSize:{editor.FontSize}";
+ searchBar.Text = $"I am search bar. FontSize:{searchBar.FontSize}";
+
+ // Initialize ui here instead of ctor
+ Content = new StackLayout
+ {
+ Children = { label, entry, editor, searchBar }
+ };
+ }
+
+#if UITEST
+ [Test]
+ public void Issue1Test()
+ {
+ RunningApp.Screenshot("If all of the font sizes are visibly the same size, this test has passed.");
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36479.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36479.cs
new file mode 100644
index 00000000..bf28ff25
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36479.cs
@@ -0,0 +1,43 @@
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve(AllMembers = true)]
+ [Issue(IssueTracker.Bugzilla, 36479, "[WP8] Picker is not disabled when IsEnabled is set to false", PlatformAffected.WinPhone)]
+ public class Bugzilla36479 : TestContentPage
+ {
+ protected override void Init()
+ {
+ var picker = new Picker
+ {
+ IsEnabled = false
+ };
+ picker.Items.Add("item");
+ picker.Items.Add("item 2");
+
+ Content = new StackLayout
+ {
+ Children =
+ {
+ picker,
+ new Button
+ {
+ Command = new Command(() =>
+ {
+ if (picker.IsEnabled)
+ picker.IsEnabled = false;
+ else
+ picker.IsEnabled = true;
+ }),
+ Text = "Enable/Disable Picker"
+ }
+ }
+ };
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36559.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36559.cs
new file mode 100644
index 00000000..660ad880
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36559.cs
@@ -0,0 +1,54 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve(AllMembers = true)]
+ [Issue(IssueTracker.Bugzilla, 36559, "[WP] Navigating to a ContentPage with a Grid inside a TableView affects Entry heights")]
+ public class Bugzilla36559 : TestContentPage
+ {
+ protected override void Init()
+ {
+ var label = new Label { Text = "Label" };
+ var entry = new Entry { AutomationId = "entry" };
+ var grid = new Grid();
+
+ grid.Children.Add(label, 0, 0);
+ grid.Children.Add(entry, 1, 0);
+ var tableView = new TableView
+ {
+ Root = new TableRoot
+ {
+ new TableSection
+ {
+ new ViewCell
+ {
+ View = grid
+ }
+ }
+ }
+ };
+
+ Content = new StackLayout
+ {
+ Children = { tableView }
+ };
+ }
+
+#if UITEST
+ [Test]
+ public void Bugzilla36559Test()
+ {
+ RunningApp.WaitForElement(q => q.Marked("entry"));
+ var results = RunningApp.Query(q => q.Marked("entry"));
+ Assert.AreNotEqual(results[0].Rect.Height, -1);
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36649.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36649.cs
new file mode 100644
index 00000000..06bca7b0
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36649.cs
@@ -0,0 +1,29 @@
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Issue (IssueTracker.Bugzilla, 36649, "LineBreakMode.NoWrap is handled incorrectly on Windows Phone 8.1 RT",
+ PlatformAffected.WinRT)]
+ public class Bugzilla36649 : TestContentPage
+ {
+ protected override void Init ()
+ {
+ var label = new Label {
+ Style = Device.Styles.BodyStyle,
+ FontSize = 20,
+ Text =
+ "This test is successful if the line below does not wrap and does not have an ellipsis at the end of the visible text."
+ };
+ var testLabel = new Label {
+ TextColor = Color.Red,
+ Style = Device.Styles.BodyStyle,
+ FontSize = 20,
+ LineBreakMode = LineBreakMode.NoWrap,
+ Text =
+ "This text should be long enough that it won't fit on the screen, and since the LineBreakMode is set to NoWrap, there should not be an ellipsis at the end of the visible text."
+ };
+
+ Content = new StackLayout { Children = { label, testLabel } };
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36681.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36681.cs
new file mode 100644
index 00000000..d72b82c7
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36681.cs
@@ -0,0 +1,88 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+using System.Collections.Generic;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 36681, "[A] NRE when Picker Replaces Page Content (pre-AppCompat only)", PlatformAffected.Android)]
+ public class Bugzilla36681 : TestTabbedPage // or TestMasterDetailPage, etc ...
+ {
+ public class PickerPage : ContentPage
+ {
+ public Picker Picker { get; private set; }
+ public Label Label { get; private set; }
+ public PickerPage ()
+ {
+ Picker = new Picker { Title = "Select Item", AutomationId = "picker" };
+
+ var items = new List<string> { "item", "item2", "item3", "item4" };
+ foreach (var i in items)
+ Picker.Items.Add (i);
+
+ Picker.FocusChangeRequested += Picker_FocusChangeRequested;
+ Picker.SelectedIndexChanged += Picker_SelectedIndexChanged;
+
+ StackLayout stack = new StackLayout { Padding = 20 };
+ stack.Children.Add (Picker);
+
+ Content = stack;
+ }
+
+ void Picker_FocusChangeRequested (object sender, FocusRequestArgs e)
+ {
+ SwitchContent ();
+ }
+
+ void Picker_SelectedIndexChanged (object sender, EventArgs e)
+ {
+ SwitchContent ();
+ }
+
+ void SwitchContent ()
+ {
+ var x = Parent as TabbedPage;
+ var y = x.CurrentPage as ContentPage;
+ y.Content = new Label {
+ Text = "Success!"
+ };
+ y.Padding = new Thickness (0, 20, 0, 0);
+ }
+ }
+
+ protected override void Init ()
+ {
+ PickerPage pickerPage = new PickerPage { Title = "Picker Page" };
+ Children.Add (pickerPage);
+ Children.Add (new ContentPage { BackgroundColor = Color.Blue, Title = "Page 2" });
+ }
+
+#if UITEST
+ [Test]
+ public void Bugzilla36681Test ()
+ {
+ if (RunningApp is Xamarin.UITest.Android.AndroidApp) {
+ RunningApp.WaitForElement (q => q.Marked ("picker"));
+ RunningApp.Tap ("picker");
+ var ok = RunningApp.Query ("OK");
+ if (ok.Length > 0 && ok[0].Id == "button1" ) { //only in pre-AppCompat; this is the culprit!
+ // We check that the query has any results and that the first
+ // result matched the id "button1" because the query reports a phantom OK button
+ // on Android >= 6.0
+ RunningApp.Tap ("OK");
+ } else {
+ RunningApp.WaitForElement (q => q.Marked ("item2"));
+ RunningApp.Tap ("item2");
+ }
+ RunningApp.WaitForElement (q => q.Marked ("Success!"));
+ }
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36788.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36788.cs
new file mode 100644
index 00000000..76dbbda7
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla36788.cs
@@ -0,0 +1,122 @@
+using System;
+using System.Threading.Tasks;
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 36788, "Truncation Issues with Relative Layouts")]
+ public class Bugzilla36788 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ Label _resultLabel;
+ Label _testLabel;
+ View _container;
+
+ protected override void Init ()
+ {
+ // Initialize ui here instead of ctor
+ var stackLayout = new StackLayout {
+ Spacing = 8
+ };
+
+ var longString = "Very long text in single line to be truncated at tail. Adding extra text to make sure it gets truncated.";
+
+ var contentView = new ContentView {
+ Padding = 16,
+ BackgroundColor = Color.Gray,
+ Content = new Label {
+ BackgroundColor = Color.Aqua,
+ Text = longString,
+ LineBreakMode = LineBreakMode.TailTruncation
+ }
+ };
+
+ stackLayout.Children.Add (contentView);
+
+ contentView = new ContentView {
+ Padding = 16,
+ BackgroundColor = Color.Gray,
+ Content = new RelativeLayout {
+ BackgroundColor = Color.Navy,
+ Children = {
+ {new Label {
+ BackgroundColor = Color.Blue,
+ Text = longString,
+ LineBreakMode = LineBreakMode.TailTruncation
+ }, Forms.Constraint.Constant (0)},
+ {new Label {
+ BackgroundColor = Color.Fuchsia,
+ Text = longString,
+ LineBreakMode = LineBreakMode.TailTruncation
+ }, Forms.Constraint.Constant (0), Forms.Constraint.Constant (40)},
+ {new Label {
+ BackgroundColor = Color.Fuchsia,
+ Text = longString,
+ LineBreakMode = LineBreakMode.TailTruncation
+ }, Forms.Constraint.Constant (10), Forms.Constraint.Constant (80)},
+ }
+ }
+ };
+
+ stackLayout.Children.Add (contentView);
+
+ contentView = new ContentView {
+ Padding = 16,
+ BackgroundColor = Color.Gray,
+ IsClippedToBounds = true,
+ Content = _container = new RelativeLayout {
+ IsClippedToBounds = true,
+ BackgroundColor = Color.Navy,
+ Children = {
+ {_testLabel = new Label {
+ BackgroundColor = Color.Blue,
+ Text = longString,
+ LineBreakMode = LineBreakMode.TailTruncation
+ }, Forms.Constraint.Constant (0)},
+ {new Label {
+ BackgroundColor = Color.Fuchsia,
+ Text = longString,
+ LineBreakMode = LineBreakMode.TailTruncation
+ }, Forms.Constraint.Constant (0), Forms.Constraint.Constant (40)},
+ {new Label {
+ BackgroundColor = Color.Fuchsia,
+ Text = longString,
+ LineBreakMode = LineBreakMode.TailTruncation
+ }, Forms.Constraint.Constant (10), Forms.Constraint.Constant (80)},
+ }
+ }
+ };
+
+ stackLayout.Children.Add (contentView);
+
+ _resultLabel = new Label ();
+ stackLayout.Children.Add (_resultLabel);
+
+ Content = stackLayout;
+ }
+
+ protected override async void OnAppearing ()
+ {
+ base.OnAppearing ();
+ await Task.Delay (200);
+
+ double fuzzFactor = 15; // labels sometimes overflow slightly, thanks hinting
+
+ if (Math.Abs (_testLabel.Width - _container.Width) < fuzzFactor)
+ _resultLabel.Text = "Passed";
+ }
+
+#if UITEST
+ [Test]
+ public void Bugzilla36788Test ()
+ {
+ RunningApp.WaitForElement (q => q.Marked ("Passed"));
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla37462.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla37462.cs
new file mode 100644
index 00000000..9eebae8b
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla37462.cs
@@ -0,0 +1,88 @@
+using System.Collections.Generic;
+using System.Linq;
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 37462, "Using App Compat/App Compat theme breaks Navigation.RemovePage on Android ",PlatformAffected.Android )]
+ public class Bugzilla37462 : TestNavigationPage
+ {
+ protected override void Init ()
+ {
+ var page1 = new ContentPage { Title = "Page 1" };
+ var button1 = new Button { Text = "Go To 2" };
+ var label1 = new Label { Text = "This is a label on page 1" };
+ page1.Content = new StackLayout { Children = { button1, label1 } };
+ page1.Appearing += (sender, args) => {
+ page1.InvalidateMeasure (InvalidationTrigger.MeasureChanged);
+ };
+
+ var page2 = new ContentPage { Title = "Page 2" };
+ var button2 = new Button { Text = "Go To 3" };
+ var label2 = new Label { Text = "This is a label on page 2" };
+ page2.Content = new StackLayout { Children = { button2, label2 } };
+
+ var page3 = new ContentPage { Title = "Page 3" };
+ var button3 = new Button { Text = "Go To 4" };
+ var label3 = new Label { Text = "This is a label on page 3" };
+ page3.Content = new StackLayout { Children = { button3, label3 } };
+
+ var page4 = new ContentPage { Title = "Page 4" };
+ var button4 = new Button { Text = "Back to 1" };
+ var label4 = new Label { Text = "This is a label on page 4" };
+ page4.Content = new StackLayout { Children = { button4, label4 } };
+
+ button1.Clicked += async (sender, args) => { await Navigation.PushAsync (page2); };
+ button2.Clicked += async (sender, args) => { await Navigation.PushAsync (page3); };
+ button3.Clicked += async (sender, args) => { await Navigation.PushAsync (page4); };
+
+ button4.Clicked += async (sender, args) => {
+ List<Page> existingPages = Navigation.NavigationStack.ToList ();
+
+ // Clear all pages except current and home
+ foreach (Page page in existingPages) {
+ if (page.Title != "Page 1" && page.Title != "Page 4") {
+ Navigation.RemovePage (page);
+ }
+ }
+
+ await Navigation.PopAsync ();
+ };
+
+ Navigation.PushAsync (page1);
+ }
+
+#if UITEST
+ [Test]
+ public void CanRemoveIntermediatePagesAndPopToFirstPage ()
+ {
+ // Start at page 1
+ RunningApp.WaitForElement ("Go To 2");
+ RunningApp.WaitForElement ("This is a label on page 1");
+ RunningApp.Tap ("Go To 2");
+
+ RunningApp.WaitForElement ("Go To 3");
+ RunningApp.Tap ("Go To 3");
+
+ RunningApp.WaitForElement ("Go To 4");
+ RunningApp.Tap ("Go To 4");
+
+ RunningApp.WaitForElement ("Back to 1");
+ RunningApp.Tap ("Back to 1");
+
+ // Clicking "Back to 1" should remove pages 2 and 3 from the stack
+ // Then call PopAsync, which should return to page 1
+ RunningApp.WaitForElement ("Go To 2");
+ RunningApp.WaitForElement ("This is a label on page 1");
+ }
+#endif
+
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla37601.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla37601.cs
new file mode 100644
index 00000000..4d40bd26
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla37601.cs
@@ -0,0 +1,50 @@
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 37601, "ToolbarItem throws error when navigating to TabbedPage ",
+ PlatformAffected.WinPhone)]
+ public class Bugzilla37601 : TestNavigationPage
+ {
+ protected override void Init ()
+ {
+ Navigation.PushAsync (new SelectPage ());
+ }
+ }
+
+ internal class SelectPage : ContentPage
+ {
+ public SelectPage ()
+ {
+ var button = new Button { Text = "Move" };
+
+ var label = new Label {
+ Text =
+ "Click the Move button. If the next page is displayed, the test has passed. If the app crashes, the test has failed."
+ };
+
+ Content = new StackLayout {
+ Children = { label, button }
+ };
+
+ button.Clicked += (sender, args) => { Navigation.PushAsync (new TabbedMain (), true); };
+
+ ToolbarItems.Add (new ToolbarItem { Text = "Log Out" });
+ }
+ }
+
+ internal class TabbedMain : TabbedPage
+ {
+ public TabbedMain ()
+ {
+ var page1 = new ContentPage { Title = "Page1" };
+ page1.Content = new StackLayout {
+ Children = { new Label { Text = "If you can see this, we haven't crashed. Yay!" } }
+ };
+
+ Children.Add (page1);
+ Children.Add (new ContentPage { Title = "Page2" });
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla37625.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla37625.cs
new file mode 100644
index 00000000..dd5f9819
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla37625.cs
@@ -0,0 +1,36 @@
+using System;
+using System.Threading.Tasks;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 37625, "App crashes when quickly adding/removing Image views (Windows UWP)")]
+ public class Bugzilla37625 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ protected override async void Init ()
+ {
+ int retry = 5;
+ while (retry-- >= 0) {
+ var imageUri = new Uri ("https://xamarin.com/content/images/pages/products/platform.png");
+ Content = new Image () { Source = new UriImageSource () { Uri = imageUri }, BackgroundColor = Color.Black, AutomationId = "success" };
+
+ await Task.Delay (50);
+ }
+ }
+
+#if UITEST
+ [Test]
+ public void Bugzilla37625Test ()
+ {
+ RunningApp.WaitForElement (q => q.Marked ("success"));
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla37841.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla37841.cs
new file mode 100644
index 00000000..2a8e236a
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla37841.cs
@@ -0,0 +1,153 @@
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Runtime.CompilerServices;
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve(AllMembers = true)]
+ [Issue(IssueTracker.Bugzilla, 37841, "TableView EntryCells and TextCells cease to update after focus change", PlatformAffected.Android)]
+ public class Bugzilla37841 : TestContentPage
+ {
+ _37841ViewModel _viewModel;
+
+ protected override void Init ()
+ {
+ _viewModel = new _37841ViewModel ();
+
+ var instructions = new Label { FontSize = 16, Text = @"Click on the Generate button.
+The EntryCell should display '12345' and the TextCell should display '6789'.
+Click on the Generate button a second time.
+The EntryCell should display '112358' and the TextCell should display '48151623'." };
+
+ var button = new Button { Text = "Generate" };
+ button.SetBinding (Button.CommandProperty, nameof (_37841ViewModel.GetNextNumbersCommand));
+
+ var random1 = new EntryCell { IsEnabled = false, Label = "Entry Cell" };
+ random1.SetBinding (EntryCell.TextProperty, nameof (_37841ViewModel.Value1));
+
+ var textCell = new TextCell { IsEnabled = false, Detail = "TextCell" };
+ textCell.SetBinding (TextCell.TextProperty, nameof (_37841ViewModel.Value2));
+
+ var buttonViewCell = new ViewCell { View = button };
+
+ var section = new TableSection ("") {
+ random1,
+ textCell,
+ buttonViewCell
+ };
+
+ var root = new TableRoot { section };
+ var tv = new TableView { Root = root };
+
+ Content = new StackLayout {
+ Children = { instructions, tv }
+ };
+
+ BindingContext = _viewModel;
+ }
+
+ [Preserve (AllMembers = true)]
+ public class _37841ViewModel : INotifyPropertyChanged
+ {
+ public int Value1
+ {
+ get { return _value1; }
+ set
+ {
+ if (value != _value1) {
+ _value1 = value;
+ RaisePropertyChanged ();
+ }
+ }
+ }
+
+ public int Value2
+ {
+ get { return _value2; }
+ set
+ {
+ if (value != _value2) {
+ _value2 = value;
+ RaisePropertyChanged ();
+ }
+ }
+ }
+
+ public Command GetNextNumbersCommand
+ => _getNextNumbersCommand ?? (_getNextNumbersCommand = new Command (ExecuteGenerateRandomCommand));
+
+ class SomeNumbers : IEnumerable<int>
+ {
+ public IEnumerator<int> GetEnumerator ()
+ {
+ while (true) {
+ yield return 12345;
+ yield return 6789;
+ yield return 112358;
+ yield return 48151623;
+ }
+ }
+
+ IEnumerator IEnumerable.GetEnumerator ()
+ {
+ return GetEnumerator ();
+ }
+ }
+
+ readonly IEnumerator<int> _numberList = new SomeNumbers ().GetEnumerator ();
+
+ void ExecuteGenerateRandomCommand ()
+ {
+ _numberList.MoveNext ();
+ Value1 = _numberList.Current;
+ _numberList.MoveNext ();
+ Value2 = _numberList.Current;
+ }
+
+ void RaisePropertyChanged ([CallerMemberName] string propertyName = null)
+ {
+ PropertyChangedEventHandler handler = PropertyChanged;
+
+ handler?.Invoke (this, new PropertyChangedEventArgs (propertyName));
+ }
+
+ #region INotifyPropertyChanged implementation
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ #endregion
+
+ Command _getNextNumbersCommand;
+ int _value1;
+ int _value2;
+ }
+
+#if UITEST
+ [Test]
+ public void TextAndEntryCellsDataBindInTableView()
+ {
+ RunningApp.WaitForElement ("Generate");
+ RunningApp.Tap("Generate");
+
+ RunningApp.Screenshot ("First Generate Tap");
+
+ RunningApp.WaitForElement("12345");
+ RunningApp.WaitForElement("6789");
+
+ RunningApp.Tap("Generate");
+
+ RunningApp.Screenshot("Second Generate Tap");
+
+ RunningApp.WaitForElement("112358");
+ RunningApp.WaitForElement("48151623");
+ }
+#endif
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla37863.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla37863.cs
new file mode 100644
index 00000000..4dd635c4
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla37863.cs
@@ -0,0 +1,26 @@
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 37863, "Password is readable when Entry.IsEnabled is false ",
+ PlatformAffected.WinPhone)]
+ public class Bugzilla37863 : TestContentPage
+ {
+ protected override void Init ()
+ {
+ var label = new Label {
+ Text =
+ "Click the button to toggle IsEnabled on the password entry below. The actual password text should never show. If the text shows, the test has failed."
+ };
+ var entry = new Entry { IsPassword = true, Text = "swordfish" };
+ var button = new Button { Text = "Toggle IsEnabled" };
+
+ button.Clicked += (sender, args) => { entry.IsEnabled = !entry.IsEnabled; };
+
+ Content = new StackLayout {
+ Children = { label, entry, button }
+ };
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38105.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38105.cs
new file mode 100644
index 00000000..ebb353f6
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38105.cs
@@ -0,0 +1,59 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 38105, "RemovePage does not cause back arrow to go away on Android",
+ NavigationBehavior.PushModalAsync)]
+ internal class Bugzilla38105 : TestMasterDetailPage
+ {
+ protected override void Init ()
+ {
+ Detail = new NavigationPage (new ViewA ());
+
+ var button = new Button () { Text = "Click me" };
+ button.Clicked += (o, e) => {
+ var navPage = (NavigationPage)Detail;
+
+ var rootPage = navPage.CurrentPage;
+
+ navPage.PopToRootAsync (false);
+
+ navPage.Navigation.PushAsync (new ViewB ());
+
+ navPage.Navigation.RemovePage (rootPage);
+
+ IsPresented = false;
+ };
+
+ Master = new ContentPage () {
+ Title = "test",
+ Content = button
+ };
+ }
+
+ public class ViewA : ContentPage
+ {
+ public ViewA ()
+ {
+ Title = "View A";
+ }
+ }
+
+ public class ViewB : ContentPage
+ {
+ public ViewB ()
+ {
+ Title = "View B";
+ }
+ }
+ }
+}
+
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38112.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38112.cs
new file mode 100644
index 00000000..bab6f2d9
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38112.cs
@@ -0,0 +1,98 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 38112, "Switch becomes reenabled when previous ViewCell is removed from TableView", PlatformAffected.Android)]
+ public class Bugzilla38112 : TestContentPage
+ {
+ bool _removed;
+ protected override void Init ()
+ {
+ var layout = new StackLayout ();
+ var button = new Button { Text = "Click" };
+ var tablesection = new TableSection { Title = "Switches" };
+ var tableview = new TableView { Intent = TableIntent.Form, Root = new TableRoot { tablesection } };
+ var viewcell1 = new ViewCell {
+ View = new StackLayout {
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ Orientation = StackOrientation.Horizontal,
+ Children = {
+ new Label { Text = "Switch 1", HorizontalOptions = LayoutOptions.StartAndExpand },
+ new Switch { AutomationId = "switch1", HorizontalOptions = LayoutOptions.End, IsToggled = true }
+ }
+ }
+ };
+ var viewcell2 = new ViewCell {
+ View = new StackLayout {
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ Orientation = StackOrientation.Horizontal,
+ Children = {
+ new Label { Text = "Switch 2", HorizontalOptions = LayoutOptions.StartAndExpand },
+ new Switch { AutomationId = "switch2", HorizontalOptions = LayoutOptions.End, IsToggled = true }
+ }
+ }
+ };
+ Label label = new Label { Text = "Switch 3", HorizontalOptions = LayoutOptions.StartAndExpand };
+ Switch switchie = new Switch { AutomationId = "switch3", HorizontalOptions = LayoutOptions.End, IsToggled = true, IsEnabled = false };
+ switchie.Toggled += (sender, e) => {
+ label.Text = "FAIL";
+ };
+ var viewcell3 = new ViewCell {
+ View = new StackLayout {
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ Orientation = StackOrientation.Horizontal,
+ Children = {
+ label,
+ switchie,
+ }
+ }
+ };
+
+ tablesection.Add (viewcell1);
+ tablesection.Add (viewcell2);
+ tablesection.Add (viewcell3);
+
+ button.Clicked += (sender, e) => {
+ if (_removed)
+ tablesection.Insert (1, viewcell2);
+ else
+ tablesection.Remove (viewcell2);
+
+ _removed = !_removed;
+ };
+
+ layout.Children.Add (button);
+ layout.Children.Add (tableview);
+
+ Content = layout;
+ }
+
+#if UITEST
+ [Test]
+ public void Bugzilla38112_SwitchIsStillOnScreen ()
+ {
+ RunningApp.WaitForElement (q => q.Marked ("Click"));
+ RunningApp.Tap (q => q.Marked ("Click"));
+ RunningApp.WaitForElement (q => q.Marked ("switch3"));
+ }
+
+ [Test]
+ public void Bugzilla38112_SwitchIsStillDisabled ()
+ {
+ RunningApp.WaitForElement (q => q.Marked ("Click"));
+ RunningApp.Tap (q => q.Marked ("Click"));
+ RunningApp.WaitForElement (q => q.Marked ("switch3"));
+ RunningApp.Tap (q => q.Marked ("switch3"));
+ RunningApp.WaitForNoElement (q => q.Marked ("FAIL"));
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38416.xaml b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38416.xaml
new file mode 100644
index 00000000..4815563a
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38416.xaml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<local:TestContentPage xmlns="http://xamarin.com/schemas/2014/forms"
+ xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+ xmlns:local="clr-namespace:Xamarin.Forms.Controls"
+ x:Class="Xamarin.Forms.Controls.Bugzilla38416">
+ <local:TestContentPage.Content>
+ <StackLayout>
+ <Button Text="Swap Visibility" Clicked="SwapVisibilityClicked" HorizontalOptions="FillAndExpand" />
+ <BoxView x:Name="Box" BackgroundColor="Red" WidthRequest="50" HorizontalOptions="Center" />
+
+ <StackLayout x:Name="FirstLayout" VerticalOptions="FillAndExpand">
+ <ListView x:Name="FirstListView"
+ HasUnevenRows="True"
+ VerticalOptions="FillAndExpand">
+ <ListView.ItemTemplate>
+ <DataTemplate>
+ <!--<ViewCell>
+ <Label Text="{Binding Name}" FontSize="19"/>
+ </ViewCell>-->
+ <TextCell Text="{Binding Name}"/>
+ </DataTemplate>
+ </ListView.ItemTemplate>
+ </ListView>
+ </StackLayout>
+ </StackLayout>
+ </local:TestContentPage.Content>
+</local:TestContentPage> \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38416.xaml.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38416.xaml.cs
new file mode 100644
index 00000000..98012901
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38416.xaml.cs
@@ -0,0 +1,48 @@
+using System;
+using System.Collections.ObjectModel;
+
+using Xamarin.Forms;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 38416, "ListView Sized Incorrectly After Containing Layout's Visibility is Toggled")]
+ public partial class Bugzilla38416 : TestContentPage
+ {
+ [Preserve (AllMembers = true)]
+ public class ListItem
+ {
+ public string Name { get; set; }
+ }
+
+#if !UITEST
+ void SwapVisibilityClicked(object sender, EventArgs e)
+ {
+ Box.IsVisible = !Box.IsVisible;
+ FirstLayout.IsVisible = !FirstLayout.IsVisible;
+ //FirstListView.IsVisible = !FirstListView.IsVisible; //Workaround. Has to be called after the layout's visibility
+ }
+#endif
+
+ protected override void Init ()
+ {
+#if !UITEST
+ InitializeComponent();
+
+ var items = new ObservableCollection<ListItem>();
+ FirstListView.ItemsSource = items;
+
+ for(int i=0; i<70; i++)
+ {
+ items.Add(new ListItem { Name = string.Format("List Item {0}", i+1) });
+ }
+
+ Box.IsVisible = true;
+ //FirstListView.IsVisible = false; //Workaround
+ FirstLayout.IsVisible = false;
+#endif
+ }
+
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38658.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38658.cs
new file mode 100644
index 00000000..b907a658
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38658.cs
@@ -0,0 +1,74 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 38658, "Rotation causes app containing CarouselPage to freeze", PlatformAffected.iOS)]
+ public class Bugzilla38658 : TestTabbedPage // or TestMasterDetailPage, etc ...
+ {
+ public class TestCarouselPage : CarouselPage
+ {
+ public TestCarouselPage ()
+ {
+ Children.Add (new ContentPage () {
+ Content = new StackLayout {
+ Children = {
+ new Label { Text = "Rotate the device to Landscape and back to Portrait. If the app hangs, this test has failed." },
+ new BoxView { Color = Color.Red, HeightRequest = 200, WidthRequest = 200 }
+ }
+ }
+ });
+ Children.Add (new ContentPage () {
+ Content = new StackLayout {
+ Children = {
+ new Label { Text = "Rotate the device to Landscape and back to Portrait. If the app hangs, this test has failed." },
+ new BoxView { Color = Color.Green, HeightRequest = 200, WidthRequest = 200 }
+ }
+ }
+ });
+ }
+ }
+ public class StartPage : ContentPage
+ {
+ public StartPage ()
+ {
+ Button button = new Button {
+ AutomationId = "btn",
+ Text = "Click"
+ };
+ button.Clicked += button_Clicked;
+ Content = button;
+ }
+
+ async void button_Clicked (object sender, EventArgs e)
+ {
+ await Navigation.PushAsync (new TestCarouselPage ());
+ }
+ }
+
+ protected override void Init ()
+ {
+ Children.Add (new NavigationPage (new StartPage () { Title = "Page" }));
+ }
+
+#if UITEST
+ [Test]
+ public void Bugzilla38658Test ()
+ {
+ RunningApp.WaitForElement (q => q.Marked ("btn"));
+ RunningApp.Tap (q => q.Marked ("btn"));
+ RunningApp.SetOrientationLandscape ();
+ RunningApp.SetOrientationPortrait ();
+ RunningApp.Back ();
+ RunningApp.WaitForElement (q => q.Marked ("btn"));
+ }
+#endif
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38827.xaml b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38827.xaml
new file mode 100644
index 00000000..2c0cd86d
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38827.xaml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
+ xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+ x:Class="Xamarin.Forms.Controls.Issues.Bugzilla38827">
+ <ScrollView>
+ <Grid RowSpacing="5"
+ ColumnSpacing="5">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="Auto"/>
+ <RowDefinition Height="*"/>
+ <RowDefinition Height="Auto"/>
+ </Grid.RowDefinitions>
+
+ <StackLayout>
+ <Label HorizontalTextAlignment="Center"
+ HorizontalOptions="FillAndExpand"
+ AutomationId="LoginPageIdentifier"
+ FontSize="Large"
+ Text="Sign in with your Xamarin account to save and sync favorites and session feedback. Sign in with your Xamarin account to save and sync favorites and session feedback. Sign in with your Xamarin account to save and sync favorites and session feedback. Sign in with your Xamarin account to save and sync favorites and session feedback."/>
+
+ </StackLayout>
+ </Grid>
+ </ScrollView>
+</ContentPage> \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38827.xaml.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38827.xaml.cs
new file mode 100644
index 00000000..c686c2bf
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38827.xaml.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Xamarin.Forms;
+
+namespace Xamarin.Forms.Controls.Issues
+{
+ public partial class Bugzilla38827 : ContentPage
+ {
+ public Bugzilla38827 ()
+ {
+#if !UITEST
+ InitializeComponent ();
+#endif
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38978.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38978.cs
new file mode 100644
index 00000000..9d8ce68b
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla38978.cs
@@ -0,0 +1,90 @@
+using System;
+using System.Linq;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 38978, "Cell.ForceUpdateSize issues with row selection/deselection (ViewCell)", PlatformAffected.Android)]
+ public class Bugzilla38978 : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ [Preserve (AllMembers = true)]
+ public class MyViewCell : ViewCell
+ {
+ Image _image;
+ public MyViewCell ()
+ {
+ _image = new Image {
+ Source = ImageSource.FromFile ("oasis.jpg"),
+ HeightRequest = 50
+ };
+
+ Label label = new Label { Text = "Click the image to resize", VerticalOptions = LayoutOptions.Center };
+
+ var tapGestureRecognizer = new TapGestureRecognizer ();
+ tapGestureRecognizer.Tapped += (object sender, EventArgs e) => {
+ if (_image.HeightRequest < 250) {
+ _image.HeightRequest = _image.Height + 100;
+ ForceUpdateSize ();
+ label.Text = "If the tapped image is not larger, this test has failed.";
+ }
+ };
+ _image.GestureRecognizers.Add (tapGestureRecognizer);
+
+ var stackLayout = new StackLayout {
+ Padding = new Thickness (20, 5, 5, 5),
+ Orientation = StackOrientation.Horizontal,
+ Children = {
+ _image,
+ label
+ }
+ };
+
+ View = stackLayout;
+ }
+
+ protected override void OnBindingContextChanged ()
+ {
+ base.OnBindingContextChanged ();
+ var item = BindingContext?.ToString();
+ if (string.IsNullOrWhiteSpace (item))
+ return;
+
+ _image.AutomationId = item;
+ }
+ }
+
+ protected override void Init ()
+ {
+ var listView = new ListView {
+ HasUnevenRows = true,
+ ItemTemplate = new DataTemplate (typeof (MyViewCell)),
+ ItemsSource = Enumerable.Range (0, 10)
+ };
+
+ Content = new StackLayout {
+ Padding = new Thickness (0, 20, 0, 0),
+ Children = {
+ listView
+ }
+ };
+ }
+
+#if UITEST
+ [Test]
+ [Category("ManualReview")]
+ public void Bugzilla38978Test ()
+ {
+ RunningApp.WaitForElement (q => q.Marked ("2"));
+ RunningApp.Tap (q => q.Marked ("2"));
+ RunningApp.Screenshot("If the tapped image is not larger, this test has failed.");
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39331.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39331.cs
new file mode 100644
index 00000000..d58c752b
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39331.cs
@@ -0,0 +1,71 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 39331, "[Android] BoxView Is InputTransparent Even When Set to False")]
+ public class Bugzilla39331 : TestContentPage
+ {
+ View _busyBackground;
+ Button _btnLogin;
+
+ protected override void Init ()
+ {
+ AbsoluteLayout layout = new AbsoluteLayout {
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ VerticalOptions = LayoutOptions.FillAndExpand,
+ };
+
+ BackgroundColor = Color.FromUint (0xFFDBDBDB);
+
+ _btnLogin = new Button {
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+
+ Text = "Press me",
+ BackgroundColor = Color.FromUint (0xFF6E932D),
+ TextColor = Color.White,
+ };
+ _btnLogin.Clicked += BtnLogin_Clicked;
+ layout.Children.Add (_btnLogin, new Rectangle (0.5f, 0.5f, 0.25f, 0.25f), AbsoluteLayoutFlags.All);
+
+ _busyBackground = new BoxView {
+ BackgroundColor = new Color (0, 0, 0, 0.5f),
+ IsVisible = false,
+ InputTransparent = false
+ };
+ layout.Children.Add (_busyBackground, new Rectangle (0, 0, 1, 1), AbsoluteLayoutFlags.SizeProportional);
+
+ Content = layout;
+ }
+
+ void BtnLogin_Clicked (object sender, EventArgs e)
+ {
+
+ if (!_busyBackground.IsVisible) {
+ _btnLogin.Text = "Blocked?";
+ _busyBackground.IsVisible = true;
+ } else {
+ _btnLogin.Text = "Guess Not";
+ _busyBackground.IsVisible = false;
+ }
+ }
+
+#if UITEST
+ [Test]
+ public void Bugzilla34912Test ()
+ {
+ RunningApp.Tap (q => q.Marked ("Press me"));
+ RunningApp.WaitForElement (q => q.Marked ("Blocked?"));
+ RunningApp.Tap (q => q.Marked ("Blocked?"));
+ RunningApp.WaitForNoElement (q => q.Marked ("Guess Not"));
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39395.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39395.cs
new file mode 100644
index 00000000..8abb0445
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39395.cs
@@ -0,0 +1,30 @@
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 39395, "SwitchCell does not take all available place inside ListView",
+ PlatformAffected.WinRT)]
+ public class Bugzilla39395 : TestContentPage
+ {
+ protected override void Init ()
+ {
+ var instructions = new Label {
+ FontSize = 18,
+ Text =
+ "The switch cells below should be aligned with the right edge of the screen. If they are not, this test has failed."
+ };
+
+ Content = new StackLayout {
+ BackgroundColor = Color.Gray,
+ Children = {
+ instructions,
+ new ListView {
+ ItemTemplate = new DataTemplate (typeof(SwitchCell)),
+ ItemsSource = new[] { "Text", "Text" }
+ }
+ }
+ };
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39461.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39461.cs
new file mode 100644
index 00000000..fe896c54
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39461.cs
@@ -0,0 +1,36 @@
+using Xamarin.Forms.CustomAttributes;
+using System.Text;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve(AllMembers = true)]
+ [Issue(IssueTracker.Bugzilla, 39461, "[UWP] Labels within a ScrollView are blurred", PlatformAffected.WinRT)]
+ public class Bugzilla39461 : TestContentPage
+ {
+ protected override void Init()
+ {
+ StringBuilder text = new StringBuilder();
+ for (int i = 0; i < 10000; i++)
+ {
+ text.Append("text ");
+ }
+
+ var top = new ScrollView { Content = new Label { FontSize = 12, TextColor = Color.Red, Text = text.ToString() } };
+ AbsoluteLayout.SetLayoutFlags(top, AbsoluteLayoutFlags.All);
+ AbsoluteLayout.SetLayoutBounds(top, new Rectangle(0, 0, 1, 0.5));
+
+ var bottom = new Label { FontSize = 12, TextColor = Color.Red, Text = text.ToString() };
+ AbsoluteLayout.SetLayoutFlags(bottom, AbsoluteLayoutFlags.All);
+ AbsoluteLayout.SetLayoutBounds(bottom, new Rectangle(0, 1, 1, 0.5));
+
+ var layout = new AbsoluteLayout { Children = { top, bottom } };
+
+ Content = layout;
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39463.xaml b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39463.xaml
new file mode 100644
index 00000000..b1932867
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39463.xaml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
+ xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+ x:Class="Xamarin.Forms.Controls.Issues.Bugzilla39463">
+ <ListView x:Name="lvView" RowHeight="100" >
+ <ListView.ItemTemplate>
+ <DataTemplate>
+ <ViewCell>
+ <ViewCell.View>
+ <ContentView BackgroundColor="Yellow">
+ <Label Text="{Binding }" TextColor="Black" />
+ </ContentView>
+ </ViewCell.View>
+ </ViewCell>
+ </DataTemplate>
+ </ListView.ItemTemplate>
+ </ListView>
+</ContentPage> \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39463.xaml.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39463.xaml.cs
new file mode 100644
index 00000000..05fb4c1d
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39463.xaml.cs
@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Xamarin.Forms;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls.Issues
+{
+ [Preserve(AllMembers = true)]
+ [Issue(IssueTracker.Bugzilla, 39463, "Items not showing in ListView using DataTemplate when there are more items than can fit on screen", PlatformAffected.WinPhone)]
+ public partial class Bugzilla39463 : ContentPage
+ {
+ public Bugzilla39463 ()
+ {
+ #if !UITEST
+ InitializeComponent ();
+
+ var n = 16;
+
+ var listStr = new List<string>();
+ for (int i = 0; i < n; i++)
+ {
+ listStr.Add("Test : " + i);
+ }
+
+ lvView.ItemsSource = listStr;
+#endif
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39483.xaml b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39483.xaml
new file mode 100644
index 00000000..1e81a65e
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39483.xaml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
+ xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+ x:Class="Xamarin.Forms.Controls.Issues.Bugzilla39483">
+
+
+<ListView ItemsSource="{Binding DataList}">
+ <ListView.ItemTemplate>
+ <DataTemplate>
+ <ViewCell >
+ <ViewCell.ContextActions>
+ <MenuItem Text="Menü 1" />
+ <MenuItem Text="Menü 2" />
+ <MenuItem Text="Menü 3" />
+ <MenuItem Text="Menü 4" />
+ </ViewCell.ContextActions>
+ <ViewCell.View>
+ <Label Text="{Binding .}" />
+ </ViewCell.View>
+ </ViewCell>
+ </DataTemplate>
+ </ListView.ItemTemplate>
+</ListView>
+</ContentPage> \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39483.xaml.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39483.xaml.cs
new file mode 100644
index 00000000..2b910b7c
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39483.xaml.cs
@@ -0,0 +1,50 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Xamarin.Forms;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls.Issues
+{
+ [Issue(IssueTracker.Bugzilla, 39483, "ListView Context Menu localization", PlatformAffected.iOS)]
+ public partial class Bugzilla39483 : ContentPage
+ {
+ public Bugzilla39483 ()
+ {
+#if APP
+
+ InitializeComponent ();
+
+ BindingContext = new DemoViewModel();
+
+#endif
+ }
+ }
+
+ public class DemoViewModel : ViewModelBase
+ {
+ public DemoViewModel()
+ {
+ DataList = new List<string>();
+ DataList.Add("Listenelement 1");
+ DataList.Add("Listenelement 2");
+ DataList.Add("Listenelement 3");
+ DataList.Add("Listenelement 4");
+ }
+
+ List<string> _dataList;
+ public List<string> DataList
+ {
+ get
+ {
+ return _dataList;
+ }
+ set { _dataList = value;
+ OnPropertyChanged();
+ }
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39499.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39499.cs
new file mode 100644
index 00000000..44fa2899
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39499.cs
@@ -0,0 +1,134 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Collections.ObjectModel;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 39499, "CarouselViewTest")]
+ public sealed class CarouselViewContentPage : TestContentPage // or TestMasterDetailPage, etc ...
+ {
+ [Preserve (AllMembers = true)]
+ public sealed class Item
+ {
+ static int s_id = 0;
+
+ int id;
+
+ internal Item()
+ {
+ id = s_id++;
+ }
+
+ public int Id => id;
+ }
+
+ [Preserve (AllMembers = true)]
+ public sealed class ItemView : ContentView
+ {
+ public ItemView ()
+ {
+ var idLabel = new Label () { StyleId = "id", TextColor = Color.White };
+ idLabel.SetBinding (Label.TextProperty, nameof(Item.Id));
+
+ var stackLayout = new StackLayout {
+ Children = {
+ new Label { Text = "Target" },
+ new Label { Text = "Stack" }
+ },
+ BackgroundColor = Color.Red
+ };
+
+ var button = CreateButton ("Hide Target Stack", () => {
+ stackLayout.IsVisible = false;
+ });
+
+ Content = new StackLayout {
+ Children = {
+ idLabel,
+ button,
+ stackLayout,
+ }
+ };
+ }
+
+ Button CreateButton(string text, Action clicked)
+ {
+ var button = new Button ();
+ button.Text = text;
+ button.Clicked += (s, e) => {
+ clicked ();
+ };
+ return button;
+ }
+ }
+
+ static readonly IList<Item> Items = new ObservableCollection<Item> () {
+ new Item(),
+ new Item(),
+ };
+
+ Button CreateButton(string text, Action onClicked = null)
+ {
+ var button = new Button {
+ Text = text
+ };
+
+ if (onClicked != null)
+ button.Clicked += (s, e) => onClicked();
+
+ return button;
+ }
+
+ protected override void Init ()
+ {
+ BackgroundColor = Color.Blue;
+
+ var carouselView = new CarouselView {
+ BackgroundColor = Color.Purple,
+ ItemsSource = Items,
+ ItemTemplate = new DataTemplate(typeof(ItemView)),
+ Position = 0
+ };
+
+ var moveBar = new StackLayout {
+ Orientation = StackOrientation.Horizontal,
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ Children = {
+ CreateButton ("<<", () => carouselView.Position = 0),
+ CreateButton ("<", () => { try { carouselView.Position--; } catch { } }),
+ CreateButton (">", () => { try { carouselView.Position++; } catch { } }),
+ CreateButton (">>", () => carouselView.Position = Items.Count - 1)
+ }
+ };
+
+ Content = new StackLayout {
+ Children = {
+ carouselView,
+ moveBar,
+ }
+ };
+ }
+
+#if UITEST
+ //[Test]
+ public void CarouselViewTest ()
+ {
+ var app = RunningApp;
+ app.Screenshot ("I am at Issue 1");
+ app.WaitForElement (q => q.Marked ("Remove"));
+
+ app.Screenshot ("I see the Label");
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39530.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39530.cs
new file mode 100644
index 00000000..7f510ab6
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39530.cs
@@ -0,0 +1,85 @@
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using NUnit.Framework;
+using Xamarin.UITest.Queries;
+using Xamarin.Forms.Core.UITests;
+#endif
+
+namespace Xamarin.Forms.Controls.Issues
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 39530, "Frames do not handle pan or pinch gestures under AppCompat", PlatformAffected.Android)]
+ public class Bugzilla39530 : TestContentPage
+ {
+ protected override void Init ()
+ {
+ var taps = new Label { Text = "Taps: 0" };
+ var pans = new Label ();
+ var pinches = new Label ();
+
+ var pangr = new PanGestureRecognizer ();
+ var tapgr = new TapGestureRecognizer ();
+ var pinchgr = new PinchGestureRecognizer ();
+
+ var frame = new Frame {
+ HasShadow = false,
+ HorizontalOptions = LayoutOptions.Fill,
+ VerticalOptions = LayoutOptions.Fill,
+ BackgroundColor = Color.White,
+ Padding = new Thickness (5),
+ HeightRequest = 300,
+ WidthRequest = 300,
+ AutomationId = "frame"
+ };
+
+ var tapCount = 0;
+
+ tapgr.Command = new Command (() => {
+ tapCount += 1;
+ taps.Text = $"Taps: {tapCount}";
+ });
+
+ pangr.PanUpdated += (sender, args) => pans.Text = $"Panning: {args.StatusType}";
+
+ pinchgr.PinchUpdated += (sender, args) => pinches.Text = $"Pinching: {args.Status}";
+
+ frame.GestureRecognizers.Add (tapgr);
+ frame.GestureRecognizers.Add (pangr);
+ frame.GestureRecognizers.Add(pinchgr);
+
+ Content = new StackLayout {
+ BackgroundColor = Color.Olive,
+ Children = { taps, pans, pinches, frame }
+ };
+ }
+
+#if UITEST
+ [Test]
+ public void Bugzilla39530PanTest()
+ {
+ AppRect frameBounds = RunningApp.Query (q => q.Marked ("frame"))[0].Rect;
+ RunningApp.Pan (new Drag (frameBounds, frameBounds.X + 10, frameBounds.Y + 10, frameBounds.X + 100, frameBounds.Y + 100, Drag.Direction.LeftToRight));
+
+ RunningApp.WaitForElement (q => q.Marked ("Panning: Completed"));
+ }
+
+ [Test]
+ public void Bugzilla39530PinchTest()
+ {
+ RunningApp.PinchToZoomIn ("frame");
+ RunningApp.WaitForElement(q => q.Marked("Pinching: Completed"));
+ }
+
+ [Test]
+ public void Bugzilla39530TapTest()
+ {
+ RunningApp.WaitForElement (q => q.Marked ("frame"));
+ RunningApp.Tap ("frame");
+ RunningApp.WaitForElement (q => q.Marked ("Taps: 1"));
+ RunningApp.Tap ("frame");
+ RunningApp.WaitForElement (q => q.Marked ("Taps: 2"));
+ }
+#endif
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39624.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39624.cs
new file mode 100644
index 00000000..eddd1b06
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39624.cs
@@ -0,0 +1,40 @@
+using System.Diagnostics;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 39624, "CarouselPage.Children Appear Out of Order", PlatformAffected.WinRT)]
+ public class Bugzilla39624 : TestCarouselPage
+ {
+ protected override void Init ()
+ {
+ var instructions =
+ "Flip through each page of the carousel from 1 to 5; the pages should display in order. Then flip backward to page 1; if any of the pages display out of order, the test has failed.";
+
+ Children.Add (GeneratePage ("Page 1", Color.Red, instructions));
+ Children.Add (GeneratePage ("Page 2", Color.Green, instructions));
+ Children.Add (GeneratePage ("Page 3", Color.Blue, instructions));
+ Children.Add (GeneratePage ("Page 4", Color.Purple, instructions));
+ Children.Add (GeneratePage ("Page 5", Color.Black, instructions));
+
+ CurrentPageChanged += (sender, args) => Debug.WriteLine (CurrentPage.Title);
+ }
+
+ ContentPage GeneratePage (string title, Color color, string instructions)
+ {
+ var page = new ContentPage {
+ Content = new StackLayout {
+ Children = {
+ new Label { Text = title, FontSize = 24, TextColor = Color.White },
+ new Label { Text = instructions, TextColor = Color.White }
+ }
+ },
+ BackgroundColor = color,
+ Title = title
+ };
+
+ return page;
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39668.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39668.cs
new file mode 100644
index 00000000..547e39aa
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39668.cs
@@ -0,0 +1,51 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+using System.Linq;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Bugzilla, 39668, "Overriding ListView.CreateDefault Does Not Work on Windows", PlatformAffected.WinRT)]
+ public class Bugzilla39668 : TestContentPage
+ {
+ [Preserve (AllMembers = true)]
+ public class CustomListView : ListView
+ {
+ protected override Cell CreateDefault (object item)
+ {
+ var cell = new ViewCell ();
+
+ cell.View = new StackLayout {
+ BackgroundColor = Color.Green,
+ Children = {
+ new Label { Text = "Success" }
+ }
+ };
+
+ return cell;
+ }
+ }
+
+ protected override void Init ()
+ {
+ CustomListView lv = new CustomListView () {
+ ItemsSource = Enumerable.Range (0, 10)
+ };
+ Content = new StackLayout { Children = { new Label { Text = "If the ListView does not have green Cells, this test has failed." }, lv } };
+ }
+
+#if UITEST
+ [Test]
+ public void Bugzilla39668Test ()
+ {
+ RunningApp.WaitForElement (q => q.Marked ("Success"));
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/CarouselAsync.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/CarouselAsync.cs
new file mode 100644
index 00000000..d6e9b19a
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/CarouselAsync.cs
@@ -0,0 +1,114 @@
+using System;
+using System.Diagnostics;
+using System.Linq;
+using System.Threading.Tasks;
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using NUnit.Framework;
+using Xamarin.UITest;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.None, 0, "Carousel Async Add Page Issue", PlatformAffected.All, NavigationBehavior.PushModalAsync)]
+ public class CarouselAsync : TestCarouselPage
+ {
+ protected override void Init ()
+ {
+ Children.Add (new ContentPage {
+ BackgroundColor = Color.Red,
+ Content = new Label {
+ Text = "Page One"
+ }
+ });
+ Children.Add (new ContentPage {
+ BackgroundColor = Color.Green,
+ Content = new Label {
+ Text = "Page Two"
+ }
+ });
+ Update (this);
+ }
+
+ static void Update (CarouselPage page)
+ {
+ Device.StartTimer (TimeSpan.FromSeconds (1), () => {
+ page.Children.Remove (page.Children.Skip (1).First () as ContentPage);
+ Device.StartTimer (TimeSpan.FromSeconds (1), () => {
+ page.Children.Add (new ContentPage {
+ BackgroundColor = Color.Blue,
+ Content = new Label {
+ Text = "Page Two - Added"
+ }
+ });
+ page.Children.Add (new ContentPage {
+ BackgroundColor = Color.Gray,
+ Content = new Label {
+ Text = "Page Three - Added"
+ }
+ });
+ return false;
+ });
+ return false;
+ });
+ }
+
+#if UITEST
+ [Test]
+ [Description ("All elements renderered")]
+ public void CarouselAsycTestsAllElementsPresent ()
+ {
+ RunningApp.WaitForElement (q => q.Marked ("Page One"));
+ RunningApp.Screenshot ("All elements present");
+ }
+
+ [Test]
+ [Description ("Async Pages inserted into a CarouselPage")]
+ public void CarouselAsycTestsAllPagesExistAfterAsyncAdding ()
+ {
+ RunningApp.WaitForElement (q => q.Marked ("Page One"));
+
+ var window = RunningApp.Query (q => q.Raw ("*").Index (0));
+ var width = window [0].Rect.Width;
+ var height = window [0].Rect.Height;
+
+ System.Threading.Thread.Sleep (3000);
+
+ // TODO Implement swipe left and swipe right
+ //App.DragFromTo (width - 10.0f, height / 2.0f, 10.0f, height / 2.0f);
+ //App.WaitForElement (q => q.Marked ("Page Two - Added"));
+ //App.Screenshot ("At Page 2");
+
+ //Thread.Sleep (3000);
+
+ //App.DragFromTo (width - 10.0f, height / 2.0f, 10.0f, height / 2.0f);
+ //App.WaitForElement (q => q.Marked ("Page Three - Added"));
+ //App.Screenshot ("At Page 3");
+ }
+
+/*******************************************************/
+/**************** Landscape tests **********************/
+/*******************************************************/
+
+ [Test]
+ [Description ("All elements renderered - landscape")]
+ public void CarouselAsycTestsAllElementsPresentLandscape ()
+ {
+ RunningApp.SetOrientationLandscape ();
+ CarouselAsycTestsAllElementsPresent ();
+ RunningApp.SetOrientationPortrait ();
+ }
+
+ [Test]
+ [Description ("Async Pages inserted into a CarouselPage - landscape")]
+ public void CarouselAsycTestsAllPagesExistAfterAsyncAddingLandscape ()
+ {
+ RunningApp.SetOrientationLandscape ();
+ CarouselAsycTestsAllPagesExistAfterAsyncAdding ();
+ RunningApp.SetOrientationPortrait ();
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/ComplexListView.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/ComplexListView.cs
new file mode 100644
index 00000000..2e2fa690
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/ComplexListView.cs
@@ -0,0 +1,111 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.None, 0, "Complex ListView", PlatformAffected.All)]
+ public class ComplexListView
+ : ContentPage
+ {
+ public ComplexListView()
+ {
+ Performance.Clear();
+
+ var showPerf = new Button { Text = "Performance" };
+ showPerf.Clicked += (sender, args) => {
+ Performance.DumpStats();
+ Performance.Clear();
+ };
+
+ Content = new StackLayout {
+ Orientation = StackOrientation.Vertical,
+ Children = {
+ showPerf,
+ new ListView {
+ ItemTemplate = new DataTemplate (typeof (ComplexViewCell)),
+ ItemsSource =
+ new[] {
+ "a", "b", "c", "a", "b", "c", "a", "b", "c", "a", "b", "c", "a", "b", "c", "a", "b", "c", "a", "b", "c", "a",
+ "b", "c", "a", "b", "c", "a", "b", "c", "a", "b", "c", "a", "b", "c"
+ }
+ }
+ }
+ };
+ }
+ }
+
+ internal class ComplexViewCell
+ : ViewCell
+ {
+ static ImageSource s_mImgProdCount;
+ static ImageSource s_mImgEndTime;
+ static ImageSource s_mImgRenewal;
+
+ public ComplexViewCell()
+ {
+ if (s_mImgProdCount == null)
+ s_mImgProdCount = ImageSource.FromFile ("bank.png");
+ if (s_mImgEndTime == null)
+ s_mImgEndTime = ImageSource.FromFile ("bank.png");
+ if (s_mImgRenewal == null)
+ s_mImgRenewal = ImageSource.FromFile ("bank.png");
+
+ var label1 = new Label { Text = "Label 1", Font = Font.SystemFontOfSize (NamedSize.Small, FontAttributes.Bold) };
+ label1.SetBinding (Label.TextProperty, new Binding ("."));
+
+ var label2 = new Label { Text = "Label 2", Font = Font.SystemFontOfSize (NamedSize.Small) };
+
+ // was ListButton?
+ var button = new Button {
+ Text = "X",
+ BackgroundColor = Color.Gray,
+ HorizontalOptions = LayoutOptions.EndAndExpand
+ };
+ button.SetBinding (Button.CommandParameterProperty, new Binding ("."));
+ button.Clicked += (sender, e) => {
+ var b = (Button) sender;
+ var t = b.CommandParameter;
+ ((ContentPage) ((ListView) ((StackLayout) b.ParentView).ParentView).ParentView).DisplayAlert ("Clicked",
+ t + " button was clicked", "OK");
+ Debug.WriteLine ("clicked" + t);
+ };
+
+ Image imgProdCount = new Image {
+ Aspect = Aspect.AspectFit,
+ Source = s_mImgProdCount,
+ };
+
+ Image imgEndTime = new Image {
+ Aspect = Aspect.AspectFit,
+ Source = s_mImgEndTime,
+ };
+
+ Image imgRenewal = new Image {
+ Aspect = Aspect.AspectFit,
+ Source = s_mImgRenewal,
+ };
+
+ View = new StackLayout {
+ Orientation = StackOrientation.Horizontal,
+ HorizontalOptions = LayoutOptions.StartAndExpand,
+ Padding = new Thickness (15, 5, 5, 15),
+ Children = {
+ new StackLayout {
+ Orientation = StackOrientation.Vertical,
+ Children = { label1, label2 }
+ },
+ button,
+ imgProdCount,
+ imgEndTime,
+ imgRenewal
+ }
+ };
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/DataTemplateGridImageTest.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/DataTemplateGridImageTest.cs
new file mode 100644
index 00000000..75de0ed7
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/DataTemplateGridImageTest.cs
@@ -0,0 +1,55 @@
+using System;
+using System.Collections.Generic;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.None, 0, "Images in DataTemplates with Grids don't show until resize on UWP",
+ PlatformAffected.WinRT)]
+ public class DataTemplateGridImageTest : TestContentPage
+ {
+ protected override void Init ()
+ {
+ var instructions = new Label { FontSize = 24, Text = "The first ListView below should have a Xamarin logo visible in it. The second should have a pink image with white writing. If either image is not displayed, this test has failed." };
+
+ ImageSource remoteSource =
+ ImageSource.FromUri (new Uri ("https://xamarin.com/content/images/pages/branding/assets/xamagon.png"));
+ ImageSource localSource = ImageSource.FromFile ("oasis.jpg");
+
+ var remoteImage = new Image { Source = remoteSource, BackgroundColor = Color.Red };
+ var localImage = new Image { Source = localSource, BackgroundColor = Color.Red };
+
+ var listViewRemoteImage = new ListView {
+ BackgroundColor = Color.Green,
+ ItemTemplate = new DataTemplate (() => new TestCellGridImage (remoteImage)),
+ ItemsSource = new List<string> { "1" }
+ };
+
+ var listViewLocalImage = new ListView {
+ BackgroundColor = Color.Green,
+ ItemTemplate = new DataTemplate (() => new TestCellGridImage (localImage)),
+ ItemsSource = new List<string> { "1" }
+ };
+
+ Content = new StackLayout {
+ Children = {
+ instructions,
+ listViewRemoteImage,
+ listViewLocalImage
+ }
+ };
+ }
+
+ [Preserve (AllMembers = true)]
+ public class TestCellGridImage : ViewCell
+ {
+ public TestCellGridImage (View image)
+ {
+ var grid = new Grid { BackgroundColor = Color.Yellow, WidthRequest = 200, HeightRequest = 200 };
+ grid.Children.Add (image);
+ View = grid;
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/DefaultColorToggleTest.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/DefaultColorToggleTest.cs
new file mode 100644
index 00000000..6f6cec09
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/DefaultColorToggleTest.cs
@@ -0,0 +1,146 @@
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.None, 0, "Default colors toggle test", PlatformAffected.All)]
+ public class DefaultColorToggleTest : ContentPage
+ {
+ Button _buttonColorDefaultToggle;
+ Button _buttonColorInitted;
+ Label _labelColorDefaultToggle;
+ Label _labelColorInitted;
+
+ public DefaultColorToggleTest ()
+ {
+ _buttonColorDefaultToggle = new Button {
+ Text = "Default Button Color"
+ };
+
+ _buttonColorInitted = new Button {
+ Text = "I should be red",
+ TextColor = Color.Red
+ };
+
+ _labelColorDefaultToggle = new Label {
+ Text = "Default Label Color"
+ };
+
+ _labelColorInitted = new Label {
+ Text = "I should be blue",
+ TextColor = Color.Blue
+ };
+
+ _buttonColorDefaultToggle.Clicked += (s, e) => {
+ if (_buttonColorDefaultToggle.TextColor == Color.Default) {
+ _buttonColorDefaultToggle.TextColor = Color.Red;
+ _buttonColorDefaultToggle.Text = "Custom Button Color";
+ } else {
+ _buttonColorDefaultToggle.TextColor = Color.Default;
+ _buttonColorDefaultToggle.Text = "Default Button Color";
+ }
+
+ };
+
+ _labelColorDefaultToggle.GestureRecognizers.Add (new TapGestureRecognizer{Command = new Command (o=>{
+ if (_labelColorDefaultToggle.TextColor == Color.Default) {
+ _labelColorDefaultToggle.TextColor = Color.Green;
+ _labelColorDefaultToggle.Text = "Custom Label Color";
+ } else {
+ _labelColorDefaultToggle.TextColor = Color.Default;
+ _labelColorDefaultToggle.Text = "Default Label Color";
+ }
+ })});
+
+ var entryTextColorDefaultToggle = new Entry () { Text = "Default Entry Text Color" };
+ var entryTextColorInit = new Entry () { Text = "Should Be Red", TextColor = Color.Red };
+ var entryToggleButton = new Button () { Text = "Toggle Entry Color" };
+ entryToggleButton.Clicked += (sender, args) => {
+ if (entryTextColorDefaultToggle.TextColor.IsDefault) {
+ entryTextColorDefaultToggle.TextColor = Color.Fuchsia;
+ entryTextColorDefaultToggle.Text = "Should Be Fuchsia";
+ } else {
+ entryTextColorDefaultToggle.TextColor = Color.Default;
+ entryTextColorDefaultToggle.Text = "Default Entry Text Color";
+ }
+ };
+
+ var entryPlaceholderColorDefaultToggle = new Entry () { Placeholder = "Default Placeholder Color" };
+ var entryPlaceholderColorInit = new Entry () { Placeholder = "Should Be Lime", PlaceholderColor = Color.Lime };
+ var entryPlaceholderToggleButton = new Button () { Text = "Toggle Placeholder Color" };
+ entryPlaceholderToggleButton.Clicked += (sender, args) => {
+ if (entryPlaceholderColorDefaultToggle.PlaceholderColor.IsDefault) {
+ entryPlaceholderColorDefaultToggle.PlaceholderColor = Color.Lime;
+ entryPlaceholderColorDefaultToggle.Placeholder = "Should Be Lime";
+ } else {
+ entryPlaceholderColorDefaultToggle.PlaceholderColor = Color.Default;
+ entryPlaceholderColorDefaultToggle.Placeholder = "Default Placeholder Color";
+ }
+ };
+
+ var passwordColorDefaultToggle = new Entry () { IsPassword = true, Text = "Default Password Color" };
+ var passwordColorInit = new Entry () { IsPassword = true, Text = "Should Be Red", TextColor = Color.Red };
+ var passwordToggleButton = new Button () { Text = "Toggle Password Box (Default)" };
+ passwordToggleButton.Clicked += (sender, args) => {
+ if (passwordColorDefaultToggle.TextColor.IsDefault) {
+ passwordColorDefaultToggle.TextColor = Color.Red;
+ passwordToggleButton.Text = "Toggle Password Box (Red)";
+ } else {
+ passwordColorDefaultToggle.TextColor = Color.Default;
+ passwordToggleButton.Text = "Toggle Password Box (Default)";
+ }
+ };
+
+ var searchbarTextColorDefaultToggle = new Entry () { Text = "Default SearchBar Text Color" };
+ var searchbarTextColorToggleButton = new Button () { Text = "Toggle SearchBar Color" };
+ searchbarTextColorToggleButton.Clicked += (sender, args) => {
+ if (searchbarTextColorDefaultToggle.TextColor.IsDefault) {
+ searchbarTextColorDefaultToggle.TextColor = Color.Fuchsia;
+ searchbarTextColorDefaultToggle.Text = "Should Be Fuchsia";
+ } else {
+ searchbarTextColorDefaultToggle.TextColor = Color.Default;
+ searchbarTextColorDefaultToggle.Text = "Default SearchBar Text Color";
+ }
+ };
+
+ var searchbarPlaceholderColorDefaultToggle = new Entry () { Placeholder = "Default Placeholder Color" };
+ var searchbarPlaceholderToggleButton = new Button () { Text = "Toggle Placeholder Color" };
+ searchbarPlaceholderToggleButton .Clicked += (sender, args) => {
+ if (searchbarPlaceholderColorDefaultToggle.PlaceholderColor.IsDefault) {
+ searchbarPlaceholderColorDefaultToggle.PlaceholderColor = Color.Lime;
+ searchbarPlaceholderColorDefaultToggle.Placeholder = "Should Be Lime";
+ } else {
+ searchbarPlaceholderColorDefaultToggle.PlaceholderColor = Color.Default;
+ searchbarPlaceholderColorDefaultToggle.Placeholder = "Default Placeholder Color";
+ }
+ };
+
+ Title = "Test Color Toggle Page";
+
+ Content = new ScrollView () {
+ Content = new StackLayout {
+ Children = {
+ _buttonColorDefaultToggle,
+ _buttonColorInitted,
+ _labelColorDefaultToggle,
+ _labelColorInitted,
+ entryTextColorDefaultToggle,
+ entryToggleButton,
+ entryTextColorInit,
+ entryPlaceholderColorDefaultToggle,
+ entryPlaceholderToggleButton,
+ entryPlaceholderColorInit,
+ passwordColorDefaultToggle,
+ passwordToggleButton,
+ passwordColorInit,
+ searchbarTextColorDefaultToggle,
+ searchbarTextColorToggleButton,
+ searchbarPlaceholderColorDefaultToggle,
+ searchbarPlaceholderToggleButton
+ }
+ }
+ };
+ }
+
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/DisposedSharedPages.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/DisposedSharedPages.cs
new file mode 100644
index 00000000..ae996383
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/DisposedSharedPages.cs
@@ -0,0 +1,70 @@
+using System;
+
+using Xamarin.Forms;
+
+namespace Xamarin.Forms.Controls
+{
+ public class DisposePage : ContentPage
+ {
+ public event EventHandler RendererDisposed;
+
+ public void SendRendererDisposed ()
+ {
+ var handler = RendererDisposed;
+ if (handler != null)
+ handler (this, EventArgs.Empty);
+ }
+
+ public int DisposedLabelCount { get; private set; }
+
+ public Action PopAction { get; set; }
+ public DisposePage ()
+ {
+ var popButton = new Button {Text = "Pop"};
+ popButton.Clicked += (sender, args) => PopAction ();
+
+ var disposeLabel1 = new DisposeLabel {Text = "Label 1"};
+ var disposeLabel2 = new DisposeLabel {Text = "Label 2"};
+ var disposeLabel3 = new DisposeLabel {Text = "Label 3"};
+ var disposeLabel4 = new DisposeLabel {Text = "Label 4"};
+ var disposeLabel5 = new DisposeLabel {Text = "Label 5"};
+
+ EventHandler disposeHandler = (sender, args) => DisposedLabelCount++;
+ disposeLabel1.RendererDisposed += disposeHandler;
+ disposeLabel2.RendererDisposed += disposeHandler;
+ disposeLabel3.RendererDisposed += disposeHandler;
+ disposeLabel4.RendererDisposed += disposeHandler;
+ disposeLabel5.RendererDisposed += disposeHandler;
+
+ Content = new StackLayout {
+ Children = {
+ popButton,
+ disposeLabel1,
+ disposeLabel2,
+ disposeLabel3,
+ disposeLabel4,
+ new StackLayout {
+ Children = {
+ disposeLabel5,
+ }
+ }
+ }
+ };
+ }
+ }
+
+ public class DisposeLabel : Label
+ {
+ public event EventHandler RendererDisposed;
+
+ public void SendRendererDisposed ()
+ {
+ var handler = RendererDisposed;
+ if (handler != null)
+ handler (this, EventArgs.Empty);
+ }
+ }
+
+}
+
+
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/InputTransparentIssue.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/InputTransparentIssue.cs
new file mode 100644
index 00000000..c6c12a70
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/InputTransparentIssue.cs
@@ -0,0 +1,37 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls.Issues
+{
+
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Github, 30000, "InputTransparentIssue")]
+ public class InputTransparentIssue : TestContentPage
+ {
+ protected override void Init ()
+ {
+ var abs = new AbsoluteLayout();
+ var box = new BoxView { Color = Color.Red };
+ var label = new Label { BackgroundColor = Color.Green , InputTransparent = true };
+ abs.Children.Add(box, new Rectangle(0, 0, 1, 1), AbsoluteLayoutFlags.All);
+ abs.Children.Add(label, new Rectangle(0, 0, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize), AbsoluteLayoutFlags.PositionProportional);
+ label.Text = DateTime.Now.ToString();
+ box.GestureRecognizers.Add(new TapGestureRecognizer
+ {
+ Command = new Command(() =>
+ {
+ label.Text = DateTime.Now.ToString();
+ })
+ });
+ Image img = new Image { Source = ImageSource.FromFile("oasis.jpg"), InputTransparent = true };
+ abs.Children.Add(img, new Rectangle(.5, .5, .5, .5), AbsoluteLayoutFlags.All);
+ Content = abs ;
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/IsPasswordToggleTest.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/IsPasswordToggleTest.cs
new file mode 100644
index 00000000..e3bcfb2d
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/IsPasswordToggleTest.cs
@@ -0,0 +1,38 @@
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.None, 0, "IsPassword toggle test", PlatformAffected.All)]
+ public class IsPasswordToggleTest : TestContentPage
+ {
+ protected override void Init ()
+ {
+ var entry = new Entry {
+ Text = "Setec Astronomy",
+ FontFamily = "Comic Sans MS",
+ HorizontalTextAlignment = TextAlignment.Center,
+ Keyboard = Keyboard.Chat
+ };
+
+ var label = new Label ();
+ var binding = new Binding ("Text") { Source = entry };
+
+ var otherEntry = new Entry ();
+ var otherBinding = new Binding ("Text") { Source = entry, Mode = BindingMode.TwoWay };
+ otherEntry.SetBinding (Entry.TextProperty, otherBinding);
+
+ label.SetBinding (Label.TextProperty, binding);
+
+ var explanation = new Label() {Text = @"The Text value of the entry at the top should appear in the label and entry below, regardless of whether 'IsPassword' is on.
+Changes to the value in the entry below should be reflected in the entry at the top."};
+
+ var button = new Button { Text = "Toggle IsPassword" };
+ button.Clicked += (sender, args) => { entry.IsPassword = !entry.IsPassword; };
+
+ Content = new StackLayout {
+ Children = { entry, button, explanation, label, otherEntry }
+ };
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/IsShowingUserIssue.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/IsShowingUserIssue.cs
new file mode 100644
index 00000000..6c0be388
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/IsShowingUserIssue.cs
@@ -0,0 +1,35 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+using Xamarin.Forms.Maps;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.None, 0, "IsShowingUser renderes as pin instead of dot")]
+ public class IsShowingUserIssue : TestContentPage
+ {
+ protected override void Init ()
+ {
+ var map = new Map (MapSpan.FromCenterAndRadius (new Position(37.79, -122.4), Distance.FromMiles(2))) {
+ AutomationId = "FormsMap",
+ IsShowingUser = true
+ };
+
+ Content = map;
+ }
+
+#if UITEST
+ public void IsShowingUserIssueTest ()
+ {
+ RunningApp.Screenshot ("I should see a map");
+ Assert.Inconclusive ("Verify that user location is visible and a dot");
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1025.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1025.cs
new file mode 100644
index 00000000..65b17e5d
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1025.cs
@@ -0,0 +1,24 @@
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Github, 1025, "StackLayout broken when image missing", PlatformAffected.iOS, NavigationBehavior.PushModalAsync)]
+ public class Issue1025 : ContentPage
+ {
+ public Issue1025 ()
+ {
+ BackgroundColor = Color.FromHex("#dae1eb");
+ Content = new StackLayout {
+ Orientation = StackOrientation.Vertical,
+ Children = {
+ new Image {},
+ new Label {Text = "Lorem ipsum dolor" },
+ new Label {Text = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."},
+ new Button {BackgroundColor = Color.FromHex ("#fec240"), Text = "Create an account" },
+ new Button {BackgroundColor = Color.FromHex ("#04acdb"), Text = "Login" },
+ }
+ };
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1026.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1026.cs
new file mode 100644
index 00000000..58c2b646
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1026.cs
@@ -0,0 +1,91 @@
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1026, "Label cropping", PlatformAffected.iOS | PlatformAffected.WinPhone, NavigationBehavior.PushModalAsync)]
+ public class Issue1026 : ContentPage
+ {
+ public Issue1026 ()
+ {
+ BackgroundColor = Color.FromHex("#dae1eb");
+ Content =
+ new ScrollView {
+ Content =
+ new StackLayout {
+ Padding = new Thickness (0, 18),
+ Spacing = 10,
+ Orientation = StackOrientation.Vertical,
+ Children = {
+ new Button {
+ BackgroundColor = Color.FromHex ("#006599"),
+ TextColor = Color.White,
+ Text = "Subscribe with LinkedIn",
+ WidthRequest = 262,
+ HorizontalOptions = LayoutOptions.Center,
+ BorderRadius = 0,
+ },
+// new Label {
+// Text = "or by email",
+// TextColor = Color.FromHex ("#666"),
+// XAlign = TextAlignment.Center,
+// Font = Font.SystemFontOfSize (NamedSize.Small),
+// WidthRequest = 262,
+// HorizontalOptions = LayoutOptions.Center,
+// },
+ new Entry {
+ Placeholder = "Professional email",
+ WidthRequest = 262,
+ HorizontalOptions = LayoutOptions.Center,
+ Keyboard = Keyboard.Email,
+ },
+ new Entry {
+ Placeholder = "Firstname",
+ WidthRequest = 262,
+ HorizontalOptions = LayoutOptions.Center,
+ },
+ new Entry {
+ Placeholder = "Lastname",
+ WidthRequest = 262,
+ HorizontalOptions = LayoutOptions.Center,
+ },
+ new Entry {
+ Placeholder = "Company",
+ WidthRequest = 262,
+ HorizontalOptions = LayoutOptions.Center,
+ },
+ new Entry {
+ Placeholder = "Password",
+ WidthRequest = 262,
+ IsPassword = true,
+ HorizontalOptions = LayoutOptions.Center,
+ },
+ new Entry {
+ Placeholder = "Confirm password",
+ WidthRequest = 262,
+ IsPassword = true,
+ HorizontalOptions = LayoutOptions.Center,
+ },
+ new Button {
+ BackgroundColor = Color.FromHex ("#05addc"),
+ TextColor = Color.White,
+ Text = "Create an account",
+ WidthRequest = 262,
+ HorizontalOptions = LayoutOptions.Center,
+ BorderRadius = 0,
+ },
+ new Label {
+ Text = "by subscribing, you accept the general conditions.",
+ TextColor = Color.White,
+ XAlign = TextAlignment.Center,
+ Font = Font.SystemFontOfSize (NamedSize.Micro),
+ WidthRequest = 262,
+ HorizontalOptions = LayoutOptions.Center,
+ },
+ },
+ },
+
+ };
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1028.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1028.cs
new file mode 100644
index 00000000..4ef26e78
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1028.cs
@@ -0,0 +1,31 @@
+using System.Diagnostics;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1028, "ViewCell in TableView raises exception - root page is ContentPage, Content is TableView" ,PlatformAffected.WinPhone, NavigationBehavior.PushModalAsync)]
+ public class Issue1028 : ContentPage
+ {
+ // Issue1028, ViewCell with StackLayout causes exception when nested in a table section. This occurs when the app's root page is a ContentPage with a TableView.
+ public Issue1028 ()
+ {
+ Content = new TableView {
+ Root = new TableRoot ("Table Title") {
+ new TableSection ("Section 1 Title") {
+ new ViewCell {
+ View = new StackLayout {
+ Children = {
+ new Label {
+ Text = "Custom Slider View:"
+ },
+ }
+ }
+ }
+ }
+ }
+ };
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1075.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1075.cs
new file mode 100644
index 00000000..54a8eb9a
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1075.cs
@@ -0,0 +1,85 @@
+using System.Diagnostics;
+using System.Reflection;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1075, "Does not update Color", PlatformAffected.Android | PlatformAffected.WinPhone)]
+ public class Issue1075 : ContentPage
+ {
+ // Issue1075
+ // BoxView doesn't update color
+ public Issue1075 ()
+ {
+ Label header = new Label
+ {
+ Text = "Picker",
+ Font = Font.BoldSystemFontOfSize(50),
+ HorizontalOptions = LayoutOptions.Center
+ };
+
+ Picker picker = new Picker
+ {
+ Title = "Color",
+ VerticalOptions = LayoutOptions.CenterAndExpand
+ };
+
+ foreach (string color in new string[]
+ {
+ "Aqua", "Black", "Blue", "Fuschia",
+ "Gray", "Green", "Lime", "Maroon",
+ "Navy", "Olive", "Purple", "Red",
+ "Silver", "Teal", "White", "Yellow"
+ })
+ {
+ picker.Items.Add(color);
+ }
+
+ // Create BoxView for displaying pickedColor
+ BoxView boxView = new BoxView
+ {
+ WidthRequest = 150,
+ HeightRequest = 150,
+ HorizontalOptions = LayoutOptions.Center,
+ VerticalOptions = LayoutOptions.CenterAndExpand
+ };
+
+ var button = new Button {
+ Text = "Change to blue",
+ Command = new Command (() => boxView.BackgroundColor = Color.Aqua)
+ };
+
+ picker.SelectedIndexChanged += (sender, args) =>
+ {
+ if (picker.SelectedIndex == -1)
+ {
+ boxView.Color = Color.Default;
+ }
+ else
+ {
+ string selectedItem = picker.Items[picker.SelectedIndex];
+ FieldInfo colorField = typeof(Color).GetTypeInfo().GetDeclaredField(selectedItem);
+ boxView.Color = (Color)colorField.GetValue(null);
+ }
+ };
+
+ // Accomodate iPhone status bar.
+ Padding = new Thickness(10, Device.OnPlatform(20, 0, 0), 10, 0);
+
+ // Build the page.
+ Content = new StackLayout
+ {
+ Children =
+ {
+ header,
+ picker,
+ boxView,
+ button
+ }
+ };
+ }
+ }
+
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1097.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1097.cs
new file mode 100644
index 00000000..7b67e1e2
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1097.cs
@@ -0,0 +1,60 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1097, "Not resizing elements on rotation", PlatformAffected.iOS)]
+ public class Issue1097 : ContentPage
+ {
+ public Issue1097 ()
+ {
+ Grid grid = new Grid {
+ RowSpacing = 0,
+ ColumnSpacing = 0,
+ };
+
+ grid.AddRowDef(count: 2);
+ grid.AddColumnDef(count : 2);
+
+ grid.Children.Add(new BoxView() { Color = Color.Red });
+
+ var v2 = new BoxView { Color = Color.Blue };
+ Grid.SetColumn(v2, 1);
+ grid.Children.Add(v2);
+
+ var v3 = new BoxView { Color = Color.Green };
+ Grid.SetRow(v3, 1);
+ grid.Children.Add(v3);
+
+ var v4 = new BoxView { Color = Color.Purple };
+ Grid.SetRow(v4, 1);
+ Grid.SetColumn(v4, 1);
+ grid.Children.Add(v4);
+
+ Content = grid;
+ }
+ }
+ public static class GridExtensions
+ {
+ public static void AddRowDef(this Grid grid, double size = 1, GridUnitType type = GridUnitType.Star, int count = 1)
+ {
+ for (int i = 0; i < count; i++) {
+ grid.RowDefinitions.Add(new RowDefinition() {
+ Height = new GridLength(size, type)
+ });
+ }
+ }
+
+ public static void AddColumnDef(this Grid grid, double size = 1, GridUnitType type = GridUnitType.Star, int count = 1)
+ {
+ for (int i = 0; i < count; i++) {
+ grid.ColumnDefinitions.Add(new ColumnDefinition() {
+ Width = new GridLength(size, type)
+ });
+ }
+ }
+ }
+}
+
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1146.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1146.cs
new file mode 100644
index 00000000..a3466229
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1146.cs
@@ -0,0 +1,48 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using NUnit.Framework;
+using Xamarin.UITest;
+#endif
+
+namespace Xamarin.Forms.Controls.TestCasesPages
+{
+ [Preserve (AllMembers=true)]
+ [Issue(IssueTracker.Github, 1146, "Disabled Switch in Button Gallery not rendering on all devices", PlatformAffected.Android)]
+ public class Issue1146 : TestContentPage
+ {
+ protected override void Init ()
+ {
+ Content = new ScrollView
+ {
+ Content = new StackLayout
+ {
+ Padding = new Size(20, 20),
+ Children = {
+ new StackLayout {
+ Orientation = StackOrientation.Horizontal,
+ Children= {
+ new Switch() { IsEnabled = false , AutomationId="switch"},
+ },
+ },
+ }
+ }
+ };
+ }
+
+#if UITEST
+ [Test]
+ public void TestSwitchDisable()
+ {
+ RunningApp.WaitForElement (c => c.Marked ("switch"));
+ RunningApp.Screenshot("Is the button here?");
+ }
+#endif
+
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1219.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1219.cs
new file mode 100644
index 00000000..078682a8
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1219.cs
@@ -0,0 +1,19 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1219, "Setting ToolbarItems in ContentPage constructor crashes app", PlatformAffected.iOS)]
+ public class Issue1219 : ContentPage
+ {
+ public Issue1219 ()
+ {
+ ToolbarItems.Add(new ToolbarItem ("MenuItem", "", () => {
+
+ }));
+ }
+ }
+}
+
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1228.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1228.cs
new file mode 100644
index 00000000..70ba1a74
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1228.cs
@@ -0,0 +1,67 @@
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1228, "ScrollView not auto scrolling with Editor", PlatformAffected.iOS)]
+ public class Issue1228 : ContentPage
+ {
+ public Issue1228 ()
+ {
+ var grd = new Grid ();
+
+ var layout = new StackLayout ();
+
+ var picker = new Picker { BackgroundColor = Color.Pink };
+ picker.Items.Add ("A");
+ picker.Items.Add ("B");
+ picker.Items.Add ("C");
+ picker.Items.Add ("D");
+ picker.Items.Add ("E");
+ layout.Children.Add (picker);
+
+ layout.Children.Add (new Editor { BackgroundColor = Color.Red, VerticalOptions = LayoutOptions.End });
+ layout.Children.Add (new Editor { BackgroundColor = Color.Red, VerticalOptions = LayoutOptions.End });
+ layout.Children.Add (new Editor { BackgroundColor = Color.Red, VerticalOptions = LayoutOptions.End });
+ layout.Children.Add (new Editor { BackgroundColor = Color.Red, VerticalOptions = LayoutOptions.End });
+ layout.Children.Add (new Editor { BackgroundColor = Color.Red, VerticalOptions = LayoutOptions.End });
+ layout.Children.Add (new Editor { BackgroundColor = Color.Red, VerticalOptions = LayoutOptions.End });
+
+ layout.Children.Add (new SearchBar {
+ BackgroundColor = Color.Gray,
+ CancelButtonColor = Color.Red
+ });
+
+ layout.Children.Add (new Editor { BackgroundColor = Color.Red, VerticalOptions = LayoutOptions.End });
+ layout.Children.Add (new Editor { BackgroundColor = Color.Red, VerticalOptions = LayoutOptions.End });
+ layout.Children.Add (new Editor { BackgroundColor = Color.Red, VerticalOptions = LayoutOptions.End });
+ layout.Children.Add (new Editor { BackgroundColor = Color.Red, VerticalOptions = LayoutOptions.End });
+ layout.Children.Add (new Editor { BackgroundColor = Color.Red, VerticalOptions = LayoutOptions.End });
+ layout.Children.Add (new Editor { BackgroundColor = Color.Red, VerticalOptions = LayoutOptions.End });
+ layout.Children.Add (new Editor { BackgroundColor = Color.Red, VerticalOptions = LayoutOptions.End });
+ layout.Children.Add (new Editor { BackgroundColor = Color.Red, VerticalOptions = LayoutOptions.End });
+
+ layout.Children.Add (new Entry { BackgroundColor = Color.Blue });
+ layout.Children.Add (new SearchBar {
+ BackgroundColor = Color.Gray,
+ CancelButtonColor = Color.Red
+ });
+ grd.Children.Add (layout);
+
+
+ Content = new ContentView {
+ Content = new ScrollView {
+ Padding = new Thickness (0, 20, 0, 0),
+ Orientation = ScrollOrientation.Vertical,
+ Content = grd,
+ HeightRequest = 400,
+ VerticalOptions = LayoutOptions.Start
+ },
+ BackgroundColor = Color.Lime,
+ HeightRequest = 400
+
+ };
+ }
+ }
+}
+
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1236.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1236.cs
new file mode 100644
index 00000000..9737fdd6
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1236.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Threading.Tasks;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1236, "Label binding", PlatformAffected.iOS)]
+ public class Issue1236 : ContentPage
+ {
+ public Issue1236 ()
+ {
+ Content = new Label { HeightRequest = 30, WidthRequest = 200, BackgroundColor = Color.Purple.WithLuminosity (.7) };
+ Content.SetBinding (Label.TextProperty, ".");
+
+ DelayUpdatingBindingContext ();
+ }
+
+ async void DelayUpdatingBindingContext ()
+ {
+ await Task.Delay (2000);
+ BindingContext = "Lorem Ipsum Dolor Sit Amet";
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1259.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1259.cs
new file mode 100644
index 00000000..681308ff
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1259.cs
@@ -0,0 +1,112 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1259, "Layout issue with SwitchCell", PlatformAffected.Android)]
+ public class Issue1259
+ : ContentPage
+ {
+ TableView _table;
+ public Issue1259()
+ {
+ StackLayout st = new StackLayout();
+ st.HorizontalOptions = LayoutOptions.FillAndExpand;
+ st.VerticalOptions = LayoutOptions.FillAndExpand;
+
+ _table = new TableView
+ {
+ Intent = TableIntent.Form,
+ Root = new TableRoot("") {
+ new TableSection
+ {
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new SwitchCell
+ {
+ Text = "SwitchCell:"
+ },
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new SwitchCell
+ {
+ Text = "SwitchCell:"
+ },
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new TextCell(),
+ new SwitchCell
+ {
+ Text = "SwitchCell:"
+ }
+ }
+ }
+ };
+
+ st.Children.Add(_table);
+
+ Button next = new Button
+ {
+ Text = "Ok",
+ };
+ next.Clicked +=next_Clicked;
+
+ st.Children.Add(next);
+
+ Content = st;
+ }
+
+ void next_Clicked(object sender, EventArgs e)
+ {
+ var sw = _table.Root[0].OfType<SwitchCell>().First();
+ sw.On = !sw.On;
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1267.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1267.cs
new file mode 100644
index 00000000..f194670d
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1267.cs
@@ -0,0 +1,65 @@
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ public class PersonCell:ViewCell
+ {
+ public PersonCell ()
+ {
+ var grid = new Grid{
+ RowDefinitions = new RowDefinitionCollection {
+ new RowDefinition {Height = new GridLength (1, GridUnitType.Star)},
+ new RowDefinition {Height = GridLength.Auto},
+ },
+ ColumnDefinitions = new ColumnDefinitionCollection {
+ new ColumnDefinition {Width = new GridLength (1, GridUnitType.Star)},
+ new ColumnDefinition {Width = GridLength.Auto},
+ }
+ };
+ Label label;
+ grid.Children.Add (label = new Label {BackgroundColor = Color.Lime});
+ label.SetBinding (Label.TextProperty, "FirstName");
+
+ grid.Children.Add (label = new Label (),0,1);
+ label.SetBinding (Label.TextProperty, "LastName");
+
+ grid.Children.Add (label = new Label {XAlign = TextAlignment.End},1,0);
+ label.SetBinding (Label.TextProperty, "Zip");
+
+ grid.Children.Add (label = new Label {XAlign = TextAlignment.End},1,1);
+ label.SetBinding (Label.TextProperty, "City");
+ View = grid;
+
+
+ }
+ }
+
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1267, "Star '*' in Grid layout throws exception", PlatformAffected.WinPhone)]
+ public class Issue1267 : ContentPage
+ {
+ public Issue1267 ()
+ {
+ var lv = new ListView {
+ ItemsSource = new []{
+ new {FirstName = "foo", LastName="bar", Zip="1234", City="Gotham City"},
+ new {FirstName = "foo", LastName="bar", Zip="1234", City="Gotham City"},
+ new {FirstName = "foo", LastName="bar", Zip="1234", City="Gotham City"},
+ new {FirstName = "foo", LastName="bar", Zip="1234", City="Gotham City"},
+ new {FirstName = "foo", LastName="bar", Zip="1234", City="Gotham City"},
+ new {FirstName = "foo", LastName="bar", Zip="1234", City="Gotham City"},
+ new {FirstName = "foo", LastName="bar", Zip="1234", City="Gotham City"},
+ new {FirstName = "foo", LastName="bar", Zip="1234", City="Gotham City"},
+ new {FirstName = "foo", LastName="bar", Zip="1234", City="Gotham City"},
+ new {FirstName = "foo", LastName="bar", Zip="1234", City="Gotham City"},
+ new {FirstName = "foo", LastName="bar", Zip="1234", City="Gotham City"},
+ new {FirstName = "foo", LastName="bar", Zip="1234", City="Gotham City"},
+ new {FirstName = "foo", LastName="bar", Zip="1234", City="Gotham City"},
+ },
+ ItemTemplate = new DataTemplate (typeof(PersonCell)),
+ };
+ Content = lv;
+ }
+ }
+}
+
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1305.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1305.cs
new file mode 100644
index 00000000..b1c38b10
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1305.cs
@@ -0,0 +1,50 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1305, "ToolbarItems on NavigationPage broken", PlatformAffected.Android, NavigationBehavior.PushModalAsync)]
+ public class Issue1305 : ContentPage
+ {
+ public Issue1305 ()
+ {
+ var settings = new ToolbarItem
+ {
+ Icon = "bank.png",
+ Text = "Settings",
+ Command = new Command(ShowSettingsPage),
+ };
+
+ ToolbarItems.Add(settings);
+
+ Content = new ContentView { Content = new Label { Text = "Testing..." } };
+
+ Title = "Test Page";
+
+ Icon = "Icon.png";
+
+ }
+
+ async void ShowSettingsPage()
+ {
+ await Navigation.PushAsync(new Issue13052());
+ }
+ }
+
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1305, "ToolbarItems on NavigationPage broken", PlatformAffected.Android)]
+ public class Issue13052 : ContentPage
+ {
+ public Issue13052 ()
+ {
+ Content = new ContentView { Content = new Label { Text = "Settings..." } };
+
+ Title = "Settings";
+
+ Icon = "bank.png";
+ }
+ }
+}
+
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1329.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1329.cs
new file mode 100644
index 00000000..b9d133e1
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1329.cs
@@ -0,0 +1,46 @@
+
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1329, "Losing root page with rapidly pushing and popping", PlatformAffected.Android)]
+ public class Issue1329 : NavigationPage
+ {
+ public Issue1329 () : base (GetPage ("root page"))
+ {
+ var navigation = new NavigationPage (GetPage ("root page"));
+ var pageNum = 0;
+
+ MessagingCenter.Subscribe<Button> (
+ navigation,
+ "PushPage",
+ (sender) => navigation.PushAsync (GetPage ("Page #: " + ++pageNum))
+ );
+
+ navigation.Popped += (sender, e) => {
+ pageNum -= 1;
+ };
+ }
+
+ public static Page GetPage (string name) {
+
+ var button = new Button {
+ Text = name
+ };
+
+ button.Clicked += (sender, e) => MessagingCenter.Send<Button> ((Button)sender, "PushPage");
+
+ var page = new ContentPage {
+ Content = button
+ };
+
+ return page;
+ }
+
+ }
+
+}
+
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1384.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1384.cs
new file mode 100644
index 00000000..0bf8aeab
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1384.cs
@@ -0,0 +1,40 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1384, "Image is grid issue", PlatformAffected.Android | PlatformAffected.iOS | PlatformAffected.WinPhone)]
+ public class Issue1384:ContentPage
+ {
+ public Issue1384 ()
+ {
+ var grid = new Grid {BackgroundColor = Color.Red, VerticalOptions=LayoutOptions.Start};
+ grid.Children.Add (new Image {Source = "photo.jpg", Aspect = Aspect.AspectFit});
+ grid.Children.Add (new Label {
+ Opacity =.75,
+ YAlign = TextAlignment.Start,
+ XAlign = TextAlignment.End,
+ Text ="top and flush right",
+ Font = Font.SystemFontOfSize (NamedSize.Large),
+ VerticalOptions=LayoutOptions.Start,
+ HorizontalOptions=LayoutOptions.End,
+ HeightRequest=30,
+ TextColor = Color.White
+ });
+ grid.Children.Add (new Label {
+ Opacity =.75,
+ YAlign = TextAlignment.End,
+ Text ="bottom and flush left",
+ Font = Font.SystemFontOfSize (NamedSize.Large),
+ VerticalOptions=LayoutOptions.End,
+ HeightRequest=40,
+ TextColor = Color.White,
+ BackgroundColor = Color.Green,
+ });
+ Content = grid;
+ }
+ }
+}
+
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1400.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1400.cs
new file mode 100644
index 00000000..b8e4a8ce
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1400.cs
@@ -0,0 +1,153 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Linq;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1400, "Group binding errors", PlatformAffected.Android | PlatformAffected.iOS | PlatformAffected.WinPhone, NavigationBehavior.PushModalAsync)]
+ public class Issue1400 : ContentPage
+ {
+ public static Entry Editfield { get; set; }
+ public static ListView List { get; set; }
+ public static List<MyGroup> Data { get; set; }
+ public Issue1400 ()
+ {
+ Data = new List<MyGroup>();
+ Data.Add(new MyGroup(){Headertitle = "Header 1"});
+ Data.First().Add(new MyData(){Title = "title 1"});
+ Data.First().Add(new MyData() { Title = "title 2" });
+ Data.Add(new MyGroup() { Headertitle = "Header 2" });
+ Data.Last().Add(new MyData() { Title = "title 2a" });
+ Data.Last().Add(new MyData() { Title = "title 2b" });
+
+
+ Editfield = new Entry();
+ Editfield.HorizontalOptions = LayoutOptions.FillAndExpand;
+ Editfield.BindingContext = Data.First().First();
+ Editfield.SetBinding<MyData>(Entry.TextProperty, f => f.Title);
+
+ Editfield.TextChanged += (sender, args) =>
+ {
+
+ AddCell(null);
+ };
+
+ List = new ListView();
+ List.HorizontalOptions = LayoutOptions.FillAndExpand;
+ List.VerticalOptions = LayoutOptions.FillAndExpand;
+ List.BackgroundColor = Color.Yellow;
+ List.ItemTemplate = new DataTemplate(typeof (VCTest));
+ List.GroupHeaderTemplate = new DataTemplate(typeof(VCHeader));
+ List.IsGroupingEnabled = true;
+ List.ItemsSource = Data;
+
+
+
+ Content = new StackLayout () {
+ VerticalOptions = LayoutOptions.StartAndExpand,
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ Children = { Editfield, List },
+ Padding = new Thickness (10, 10, 10, 10)
+
+ };
+ }
+
+ public static List<MyGroup> CopyList(List<MyGroup> data)
+ {
+ var newlist = new List<MyGroup>();
+ foreach (var grp in data)
+ {
+ var grpItem = new MyGroup() { Headertitle = grp.Headertitle };
+ foreach (var subItem in grp)
+ {
+ var item = new MyData() { Title = subItem.Title };
+ grpItem.Add(item);
+ }
+ newlist.Add(grpItem);
+ }
+ return newlist;
+ }
+
+ public static void AddCell(MyData data)
+ {
+ var newlist = CopyList(Data);
+
+ // just make some changes
+ newlist.Last().Add(new MyData() { Title = Editfield.Text });
+ newlist.Last().RemoveAt(0);
+ newlist.Last().Add(new MyData() { Title = "2nd "+Editfield.Text });
+
+ Data = newlist;
+
+ List.ItemsSource = newlist;
+ }
+ }
+
+ public class MyData : INotifyPropertyChanged
+ {
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ string _title;
+
+ public const string PropTitle = "Title";
+
+ public string Title
+ {
+ get { return _title; }
+ set
+ {
+ if (value.Equals(_title, StringComparison.Ordinal)) return;
+ _title = value;
+ OnPropertyChanged(new PropertyChangedEventArgs(PropTitle));
+ }
+ }
+
+ public void OnPropertyChanged(PropertyChangedEventArgs e)
+ {
+ if (PropertyChanged != null) PropertyChanged(this, e);
+ }
+ }
+
+ public class MyGroup : ObservableCollection<MyData>, INotifyPropertyChanged
+ {
+ string _headertitle;
+
+ public const string PropHeadertitle = "Headertitle";
+
+ public string Headertitle
+ {
+ get { return _headertitle; }
+ set
+ {
+ if (value.Equals(_headertitle, StringComparison.Ordinal)) return;
+ _headertitle = value;
+ OnPropertyChanged( new PropertyChangedEventArgs(PropHeadertitle));
+ }
+ }
+ }
+
+ internal class VCTest : ViewCell
+ {
+ public VCTest()
+ {
+ var label = new Label();
+ label.SetBinding<MyData>(Label.TextProperty, f => f.Title);
+ View = label;
+ }
+ }
+
+ internal class VCHeader : ViewCell
+ {
+ public VCHeader()
+ {
+ var label = new Label();
+ label.SetBinding<MyGroup>(Label.TextProperty, f => f.Headertitle);
+ View = label;
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1461.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1461.cs
new file mode 100644
index 00000000..2ad70257
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1461.cs
@@ -0,0 +1,286 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using NUnit.Framework;
+using Xamarin.UITest;
+using Xamarin.UITest.iOS;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+
+#if UITEST
+ public static class Issue1461Helpers
+ {
+ public static bool ShouldRunTest (IApp app)
+ {
+ var appAs = app as iOSApp;
+ return (appAs != null && appAs.Device.IsTablet);
+ }
+ }
+#endif
+
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Github, 1461, "1461 - (Popover in Portrait and Landscape)", PlatformAffected.iOS)]
+ public class Issue1461 : TestContentPage
+ {
+ protected override async void Init ()
+ {
+ await Navigation.PushModalAsync (new Issue1461Page (MasterBehavior.Popover, false));
+ }
+
+#if UITEST
+ [Test]
+ [UiTest (typeof (MasterDetailPage), "IsPresented")]
+ [UiTest (typeof (MasterDetailPage), "Master")]
+ public void Test1 ()
+ {
+ if (Issue1461Helpers.ShouldRunTest (RunningApp)) {
+ RunningApp.SetOrientationLandscape ();
+ var query = RunningApp.Query (q => q.Marked ("Master_Label"));
+ Assert.IsTrue (!query.Any (), "Master should not present");
+ RunningApp.Screenshot ("Master should not present");
+ RunningApp.SetOrientationPortrait ();
+ query = RunningApp.Query (q => q.Marked ("Master_Label"));
+ Assert.IsTrue (!query.Any (), "Master should not present");
+ RunningApp.Screenshot ("Master should not present");
+ RunningApp.Tap (q => q.Marked ("Go Back"));
+ } else {
+ Assert.Inconclusive ("Only run on iOS Tablet");
+ }
+ }
+#endif
+ }
+
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Github, 1461, "1461 - Default", PlatformAffected.iOS)]
+ public class Issue1461A : TestContentPage
+ {
+ protected override async void Init ()
+ {
+ await Navigation.PushModalAsync (new Issue1461Page (MasterBehavior.Default, null));
+ }
+
+#if UITEST
+ [Test]
+ [UiTest (typeof (MasterDetailPage), "IsPresented")]
+ [UiTest (typeof (MasterDetailPage), "Master")]
+ public void Test2 ()
+ {
+ if (Issue1461Helpers.ShouldRunTest(RunningApp)) {
+ RunningApp.SetOrientationLandscape ();
+ var query = RunningApp.Query (q => q.Marked ("Master_Label"));
+ Assert.IsTrue (query.Any (), "Master should be present");
+ RunningApp.Screenshot ("Master should not present");
+ RunningApp.SetOrientationPortrait ();
+ query = RunningApp.Query (q => q.Marked ("Master_Label"));
+ Assert.IsTrue (!query.Any (), "Master should not present");
+ RunningApp.Screenshot ("Master should not present");
+ RunningApp.Tap (q => q.Marked ("Go Back"));
+ } else {
+ Assert.Inconclusive ("Only run on iOS Tablet");
+ }
+ }
+
+ #if UITEST
+ [Test]
+ [UiTest (typeof (MasterDetailPage), "Button")]
+ public void TestButton ()
+ {
+ if (Issue1461Helpers.ShouldRunTest(RunningApp)) {
+ RunningApp.SetOrientationLandscape ();
+ RunningApp.WaitForNoElement (q => q.Marked ("bank"));
+ RunningApp.SetOrientationPortrait ();
+ RunningApp.WaitForElement (q => q.Marked ("bank"));
+ } else {
+ Assert.Inconclusive ("Only run on iOS Tablet");
+ }
+ }
+ #endif
+#endif
+ }
+
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Github, 1461, "1461 - (Splitview in Landscape)", PlatformAffected.iOS)]
+ public class Issue1461B : TestContentPage
+ {
+ protected override async void Init ()
+ {
+ await Navigation.PushModalAsync (new Issue1461Page (MasterBehavior.SplitOnLandscape, null));
+ }
+
+#if UITEST
+ [Test]
+ [UiTest (typeof (MasterDetailPage), "IsPresented")]
+ [UiTest (typeof (MasterDetailPage), "Master")]
+ public void Test3 ()
+ {
+ if (Issue1461Helpers.ShouldRunTest(RunningApp)) {
+ RunningApp.SetOrientationLandscape ();
+ var query = RunningApp.Query (q => q.Marked ("Master_Label"));
+ Assert.IsTrue (query.Any (), "Master should be present");
+ RunningApp.Screenshot ("Master should not present");
+ RunningApp.SetOrientationPortrait ();
+ query = RunningApp.Query (q => q.Marked ("Master_Label"));
+ Assert.IsTrue (!query.Any (), "Master should not present");
+ RunningApp.Screenshot ("Master should not present");
+ RunningApp.Tap (q => q.Marked ("Go Back"));
+ } else {
+ Assert.Inconclusive ("Only run on iOS Tablet");
+ }
+ }
+#endif
+ }
+
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Github, 1461, "1461 - (Splitview in Portrait)", PlatformAffected.iOS)]
+ public class Issue1461C : TestContentPage
+ {
+ protected override async void Init ()
+ {
+ await Navigation.PushModalAsync (new Issue1461Page (MasterBehavior.SplitOnPortrait, null));
+ }
+
+#if UITEST
+ [Test]
+ [UiTest (typeof (MasterDetailPage), "IsPresented")]
+ [UiTest (typeof (MasterDetailPage), "Master")]
+ public void Test4 ()
+ {
+ if (Issue1461Helpers.ShouldRunTest(RunningApp)) {
+ RunningApp.SetOrientationPortrait ();
+ var s = RunningApp.Query (q => q.Marked ("Master_Label"));
+ Assert.IsTrue (s.Any (), "Master should be present");
+ RunningApp.Screenshot ("Master should present");
+
+ RunningApp.SetOrientationLandscape ();
+ s = RunningApp.Query (q => q.Marked ("Master_Label"));
+ Assert.IsTrue (!s.Any (), "Master should not present on landscape");
+ RunningApp.Screenshot ("Master should not present");
+ RunningApp.Tap (q => q.Marked ("Go Back"));
+ } else {
+ Assert.Inconclusive ("Only run on iOS Tablet");
+ }
+ }
+#endif
+ }
+
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Github, 1461, "1461 - (Splitview in Portrait and Landscape)", PlatformAffected.iOS)]
+ public class Issue1461D : TestContentPage
+ {
+ protected override async void Init ()
+ {
+ await Navigation.PushModalAsync (new Issue1461Page (MasterBehavior.Split, null));
+ }
+
+#if UITEST
+ [Test]
+ [UiTest (typeof (MasterDetailPage), "IsPresented")]
+ [UiTest (typeof (MasterDetailPage), "Master")]
+ public void Test5 ()
+ {
+ if (Issue1461Helpers.ShouldRunTest(RunningApp)) {
+ RunningApp.SetOrientationPortrait ();
+ var s = RunningApp.Query (q => q.Marked ("Master_Label"));
+ Assert.IsTrue (s.Any (), "Master should be present");
+ RunningApp.Screenshot ("Master should be present");
+
+ RunningApp.SetOrientationLandscape ();
+ s = RunningApp.Query (q => q.Marked ("Master_Label"));
+
+ Assert.IsTrue (s.Any (), "Master should be present");
+ RunningApp.Screenshot ("Master should be present");
+ RunningApp.Tap (q => q.Marked ("Go Back"));
+ } else {
+ Assert.Inconclusive ("Only run on iOS Tablet");
+ }
+ }
+#endif
+ }
+
+ internal sealed class Issue1461Page : MasterDetailPage
+ {
+ public Issue1461Page ()
+ : this (MasterBehavior.Default,null)
+ { }
+
+ bool? _showButton;
+ public Issue1461Page (MasterBehavior state, bool? initState)
+ {
+
+ var btn = new Button { Text = "hide me" };
+ btn.Clicked += bnToggle_Clicked;
+ Master = new ContentPage {
+ Title = string.Format ("Master sample for {0}", state),
+ Icon = "bank.png",
+ Padding = Device.OnPlatform (new Thickness (5, 60, 5, 5), 5, 5),
+ Content =
+ new StackLayout { Children = {
+ new Label {
+ Text = "Master Label",
+ AutomationId = "Master_Label",
+ BackgroundColor = Color.Gray
+ },
+ btn
+ }
+ },
+ //BackgroundColor = Color.Red
+ };
+
+ if(initState.HasValue)
+ _showButton = initState.Value;
+
+ var lbl = new Label {
+ HorizontalOptions = LayoutOptions.End,
+ BindingContext = this
+ };
+ lbl.SetBinding (Label.TextProperty, "IsPresented");
+
+ var bnToggle = new Button {
+ Text = "Toggle IsPresented",
+ };
+
+ var bnGoBack = new Button {
+ Text = "Go Back",
+ };
+
+ bnGoBack.Clicked += bnGoBack_Clicked;
+ bnToggle.Clicked += bnToggle_Clicked;
+
+ Detail = new NavigationPage( new ContentPage {
+ Title = "Detail Title",
+ Content = new StackLayout{ Spacing=10, Children= { lbl, bnToggle, bnGoBack} }
+ });
+
+ MasterBehavior = state;
+ }
+
+ public override bool ShouldShowToolbarButton ()
+ {
+ if (_showButton.HasValue)
+ return _showButton.Value;
+ return base.ShouldShowToolbarButton ();
+ }
+
+ async void bnGoBack_Clicked (object sender, EventArgs e)
+ {
+ await Navigation.PopModalAsync ();
+ }
+
+ async void bnToggle_Clicked (object sender, EventArgs e)
+ {
+ try {
+ IsPresented = !IsPresented;
+ } catch (InvalidOperationException ex) {
+ DisplayAlert ("Error", ex.Message, "ok");
+ }
+
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1497.xaml b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1497.xaml
new file mode 100644
index 00000000..e7569ed4
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1497.xaml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Xamarin.Forms.Controls.Issue1497">
+ <ContentView
+ Grid.Column="0" Grid.Row="0"
+ VerticalOptions="FillAndExpand"
+ HorizontalOptions="FillAndExpand"
+ BackgroundColor="Silver" Padding="5">
+
+ <Grid x:Name="grid" Grid.Column="0" Grid.Row="0" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" BackgroundColor="Green">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="Auto" />
+ <RowDefinition Height="*" />
+ </Grid.RowDefinitions>
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="*"/>
+ </Grid.ColumnDefinitions>
+ <Label Text="Messages" TextColor="White" HorizontalOptions="FillAndExpand" />
+ <Button
+ Text="GO"
+ TextColor="White"
+ BackgroundColor="Black"
+ Grid.Row="1"
+ HorizontalOptions="FillAndExpand"
+ VerticalOptions="EndAndExpand" />
+ </Grid>
+ </ContentView>
+</ContentPage>
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1497.xaml.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1497.xaml.cs
new file mode 100644
index 00000000..186a8b2d
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1497.xaml.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using Xamarin.Forms;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+#if APP
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Github, 1497, "Grid sizing issue", PlatformAffected.Android | PlatformAffected.iOS | PlatformAffected.WinPhone)]
+ public partial class Issue1497 : ContentPage
+ {
+ public Issue1497 ()
+ {
+ InitializeComponent ();
+ }
+ }
+#endif
+}
+
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1538.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1538.cs
new file mode 100644
index 00000000..0497c519
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1538.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Threading.Tasks;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1538, "Crash measuring empty ScrollView", PlatformAffected.Android | PlatformAffected.WinPhone)]
+ public class Issue1538 : ContentPage
+ {
+ ScrollView _sv;
+ public Issue1538 ()
+ {
+ StackLayout sl = new StackLayout(){VerticalOptions = LayoutOptions.FillAndExpand};
+ sl.Children.Add( _sv = new ScrollView(){HeightRequest=100} );
+ Content = sl;
+
+ AddContentDelayed ();
+ }
+
+ async void AddContentDelayed ()
+ {
+ await Task.Delay (1000);
+ _sv.Content = new Label { Text = "Foo" };
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1545.xaml b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1545.xaml
new file mode 100644
index 00000000..7cfb67ca
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1545.xaml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
+ xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+ x:Class="Xamarin.Forms.Controls.Issue1545"
+ Title="{Binding Title}">
+ <StackLayout>
+ <ActivityIndicator IsVisible="{Binding IsBusy}" IsRunning="{Binding IsBusy}"/>
+ <ListView x:Name="List" ItemsSource="{Binding Artists}">
+ <ListView.ItemTemplate>
+ <DataTemplate>
+ <ImageCell Text="{Binding Name}" ImageSource="{Binding MediumImage}"/>
+ </DataTemplate>
+ </ListView.ItemTemplate>
+ </ListView>
+ </StackLayout>
+</ContentPage> \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1545.xaml.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1545.xaml.cs
new file mode 100644
index 00000000..b00ced62
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1545.xaml.cs
@@ -0,0 +1,129 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+#if APP
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Github, 1545, "Binding instances cannot be reused", PlatformAffected.Android | PlatformAffected.iOS | PlatformAffected.WinPhone)]
+ public partial class Issue1545 : ContentPage
+ {
+ ArtistsViewModel _viewModel;
+ public Issue1545()
+ {
+ InitializeComponent();
+ BindingContext = _viewModel = new ArtistsViewModel();
+ }
+
+ protected override void OnAppearing()
+ {
+ base.OnAppearing();
+ if (_viewModel.IsInitialized)
+ return;
+
+ _viewModel.IsInitialized = true;
+ _viewModel.LoadCommand.Execute(null);
+ }
+ }
+
+ public class BaseViewModel : INotifyPropertyChanged
+ {
+ public string Title { get; set; }
+ public bool IsInitialized { get; set; }
+
+ bool _isBusy;
+
+ /// <summary>
+ /// Gets or sets if VM is busy working
+ /// </summary>
+ public bool IsBusy
+ {
+ get { return _isBusy; }
+ set { _isBusy = value; OnPropertyChanged("IsBusy"); }
+ }
+
+ //INotifyPropertyChanged Implementation
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ protected void OnPropertyChanged(string propertyName)
+ {
+ if (PropertyChanged == null)
+ return;
+
+ PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+ }
+ }
+
+ public class ArtistsViewModel : BaseViewModel
+ {
+ public ArtistsViewModel()
+ {
+ Title = "Artists";
+ Artists = new ObservableCollection<Artist>();
+ }
+
+ /// <summary>
+ /// gets or sets the feed items
+ /// </summary>
+ public ObservableCollection<Artist> Artists
+ {
+ get;
+ private set;
+ }
+
+ Command _loadCommand;
+ /// <summary>
+ /// Command to load/refresh artitists
+ /// </summary>
+ public Command LoadCommand
+ {
+ get { return _loadCommand ?? (_loadCommand = new Command(async () => await ExecuteLoadCommand())); }
+ }
+
+ static readonly Artist[] ArtistsToLoad = new Artist[] {
+ new Artist { Name = "Metallica", ListenerCount = "100", PlayCount = "5000" },
+ new Artist { Name = "Epica", ListenerCount = "50", PlayCount = "1000" }
+ };
+
+ async Task ExecuteLoadCommand()
+ {
+ if (IsBusy)
+ return;
+
+ IsBusy = true;
+
+ Artists.Clear();
+
+ await Task.Delay (3000);
+
+ foreach (Artist a in ArtistsToLoad)
+ Artists.Add (a);
+
+ IsBusy = false;
+ }
+ }
+
+ public class Artist
+ {
+
+ public string Name { get; set; }
+
+ public string PlayCount { get; set; }
+
+ public string ListenerCount { get; set; }
+
+ public string Mbid { get; set; }
+
+ public string Url { get; set; }
+
+ public string Streamable { get; set; }
+ }
+#endif
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1546.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1546.cs
new file mode 100644
index 00000000..8e3fa1c0
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1546.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1546, "Crash when Label.Text is null", PlatformAffected.Android)]
+ public class Issue1546
+ : ContentPage
+ {
+ public Issue1546()
+ {
+ Content = new Label();
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1549.xaml b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1549.xaml
new file mode 100644
index 00000000..16f3945d
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1549.xaml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<local:BaseView
+ xmlns="http://xamarin.com/schemas/2014/forms"
+ xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+ x:Class="Xamarin.Forms.Controls.Issue1549"
+ xmlns:local="clr-namespace:Xamarin.Forms.Controls;assembly=Xamarin.Forms.Controls"
+ Padding="0,40,0,0">
+ <local:BaseView.Resources>
+ <ResourceDictionary>
+ <local:InvertBoolenConverter x:Key="cnvInvert"></local:InvertBoolenConverter>
+ </ResourceDictionary>
+ </local:BaseView.Resources>
+ <local:BaseView.Content>
+ <ListView x:Name="lst" VerticalOptions="FillAndExpand"
+ HorizontalOptions="FillAndExpand"
+
+ ItemsSource="{Binding Items}"
+
+ >
+ <ListView.ItemTemplate >
+ <DataTemplate>
+ <ViewCell >
+ <ViewCell.View>
+ <Grid VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" >
+ <Label IsVisible="{Binding IsLocked}" Text="Show Is Locked" />
+ <Label IsVisible="{Binding IsLocked, Converter={StaticResource cnvInvert}}" Text="Show Is Not locked" />
+ </Grid>
+ </ViewCell.View>
+ </ViewCell>
+ </DataTemplate>
+ </ListView.ItemTemplate>
+ </ListView>
+ </local:BaseView.Content>
+</local:BaseView> \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1549.xaml.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1549.xaml.cs
new file mode 100644
index 00000000..850201de
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1549.xaml.cs
@@ -0,0 +1,74 @@
+using System;
+using System.Collections.Generic;
+using Xamarin.Forms;
+using System.Collections.ObjectModel;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+#if APP
+ public class BaseView : ContentPage
+ {
+ public BaseView()
+ {
+ }
+ }
+
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1549, "XAML converters not invoked", PlatformAffected.Android | PlatformAffected.iOS | PlatformAffected.WinPhone)]
+ public partial class Issue1549 : BaseView
+ {
+ public Issue1549 ()
+ {
+ InitializeComponent ();
+
+ Items = new ObservableCollection<Issue1549Item> ();
+ Items.Add (new Issue1549Item () { IsLocked = true });
+ Items.Add (new Issue1549Item () { IsLocked = true });
+ Items.Add (new Issue1549Item () { IsLocked = true });
+ Items.Add (new Issue1549Item () { IsLocked = true });
+ lst.BindingContext = this;
+ }
+
+ public new ObservableCollection<Issue1549Item> Items {
+ get;
+ set;
+ }
+ }
+
+ public class InvertBoolenConverter : IValueConverter
+ {
+
+ #region IValueConverter implementation
+
+ public object Convert (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
+ {
+ if (value is bool) {
+
+ return !(bool)value;
+ }
+ return value;
+ }
+
+ public object ConvertBack (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
+ {
+ throw new NotImplementedException ();
+ }
+
+ #endregion
+ }
+
+
+ public class Issue1549Item
+ {
+
+ public bool IsLocked {
+ get;
+ set;
+ }
+
+ }
+#endif
+}
+
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1554.xaml b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1554.xaml
new file mode 100644
index 00000000..9db3fa42
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1554.xaml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
+ xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+ x:Class="Xamarin.Forms.Controls.Issue1554">
+ <ListView ItemsSource="{Binding Values}">
+ <ListView.ItemTemplate>
+ <DataTemplate>
+ <ViewCell>
+ <ViewCell.View>
+ <StackLayout>
+ <Label Text="{Binding}"></Label>
+ <Label Text="{Binding}"></Label>
+<!-- <ContentView></ContentView>-->
+ </StackLayout>
+ </ViewCell.View>
+ </ViewCell>
+ </DataTemplate>
+ </ListView.ItemTemplate>
+ </ListView>
+</ContentPage>
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1554.xaml.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1554.xaml.cs
new file mode 100644
index 00000000..0a0c20cb
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1554.xaml.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using Xamarin.Forms;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+#if APP
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Github, 1554, "NRE: NavigationProxy.set_Inner", PlatformAffected.Android | PlatformAffected.iOS | PlatformAffected.WinPhone)]
+ public partial class Issue1554 : ContentPage
+ {
+ public Issue1554 ()
+ {
+ BindingContext = new
+ {
+ Values = new[] { "ABC", "DEF", "GHI" }
+ };
+
+ InitializeComponent ();
+ }
+ }
+#endif
+}
+
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1557.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1557.cs
new file mode 100644
index 00000000..7dc92cc6
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1557.cs
@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1557, "Setting source crashes if view was detached from visual tree", PlatformAffected.iOS)]
+ public class Issue1557
+ : ContentPage
+ {
+ ObservableCollection<string> _items = new ObservableCollection<string> { "foo", "bar" };
+ public Issue1557()
+ {
+ Content = new ListView {
+ ItemsSource = _items
+ };
+
+ Task.Delay (3000).ContinueWith (async t => {
+ var list = (ListView) Content;
+
+ await Navigation.PopAsync();
+
+ list.ItemsSource = new List<string>() { "test" };
+
+ }, TaskScheduler.FromCurrentSynchronizationContext());
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1566.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1566.cs
new file mode 100644
index 00000000..223edb6d
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1566.cs
@@ -0,0 +1,91 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1566, "ListView reuse issue", PlatformAffected.Android)]
+ public class Issue1566
+ : ContentPage
+ {
+ bool _flag = true;
+
+ ObservableCollection<Tuple<string, string>> _collection = new ObservableCollection<Tuple<string, string>>();
+
+ void FillTheList()
+ {
+ _collection.Clear();
+
+ for (int i = 0; i < 100; i++)
+ {
+ var item = new Tuple<string, string>(
+ string.Format("{0} {0} {0} {0} {0} {0}", _flag ? i : 100-i),
+ string.Format("---- i ----{0} {0} {0} {0} {0} {0}", _flag ? i : 100-i)
+ );
+
+
+ _collection.Add(item);
+ }
+
+ //flag = !flag;
+ }
+
+ public Issue1566()
+ {
+ SearchBar search = new SearchBar();
+ search.SearchButtonPressed += (sender, e) => FillTheList();
+
+ ListView list = new ListView() {
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ VerticalOptions = LayoutOptions.FillAndExpand,
+ HasUnevenRows = true,
+ ItemsSource = _collection,
+ ItemTemplate = new DataTemplate(typeof(CellTemplate))
+ };
+
+ Label info = new Label() {
+ Text = "Type something into searchbox and press search. Then swipe the list. Rows are mixed. It's important to have keyboard visible!!!"
+ };
+
+ StackLayout root = new StackLayout() {
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ VerticalOptions = LayoutOptions.FillAndExpand,
+ Children =
+ {
+ search,
+ list,
+ info,
+ }
+ };
+
+ Content = root;
+ }
+
+ class CellTemplate : ViewCell
+ {
+ public CellTemplate()
+ {
+ Label cellLabel = new Label() {
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ };
+
+ cellLabel.SetBinding(Label.TextProperty, new Binding("Item1", BindingMode.OneWay));
+
+ StackLayout root = new StackLayout() {
+ Children =
+ {
+ cellLabel
+ }
+ };
+
+ View = root;
+ }
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1567.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1567.cs
new file mode 100644
index 00000000..0b67d092
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1567.cs
@@ -0,0 +1,37 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1567, "NRE in NavigationProxy.set_Inner", PlatformAffected.iOS)]
+ public class Issue1567
+ : ContentPage
+ {
+ public Issue1567()
+ {
+ Title = "Test";
+ var label = new Label { Text = "Whatever" };
+
+ ToolbarItems.Add (new ToolbarItem ("Modal", null, async () => {
+ var cp2 = new ContentPage () {
+ Title = "Modal",
+ Content = new Label (){ Text = "Second screen" },
+ };
+ var np2 = new NavigationPage(cp2) { Title = "Modal" };
+ try {
+ await Navigation.PushModalAsync (cp2);
+ } catch (InvalidOperationException ex) {
+ label.Text = "Exception properly thrown: " + ex.Message;
+ }
+ }));
+
+ Content = label;
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1568.xaml b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1568.xaml
new file mode 100644
index 00000000..00a5a08e
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1568.xaml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
+ xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+ x:Class="Xamarin.Forms.Controls.TestCasesPages.Issue1568">
+ <StackLayout Orientation="Vertical">
+ <StackLayout
+ x:Name="_stackToolbar"
+ Orientation="Horizontal">
+ <Button
+ x:Name="_btnExit"
+ Text="&lt; Exit"
+ Command="{Binding ExitCommand}" />
+ <Button
+ x:Name="_btnSelectOrg"
+ Text="Select Org"
+ Command="{Binding SelectOrgCommand}" />
+ <Button
+ x:Name="_btnSelectStartInterval"
+ Text="Select Start Date"
+ Command="{Binding SelectStartIntervalCommand}" />
+ <Button
+ x:Name="_btnReload"
+ Text="Reload Schedule"
+ Command="{Binding ReloadScheduleCommand}" />
+ <Button
+ x:Name="_btnSave"
+ Text="Save Schedule"
+ Command="{Binding SaveScheduleCommand}" />
+ </StackLayout>
+
+ <Grid>
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="*" />
+ <ColumnDefinition Width="Auto" />
+ </Grid.ColumnDefinitions>
+
+ <BoxView
+ x:Name="_scheduleGrid"
+ Grid.Column="0"
+ Color="Red"
+ HorizontalOptions="Fill"
+ VerticalOptions="Fill" />
+
+ <BoxView
+ x:Name="_shiftEditor"
+ Grid.Column="1"
+ Color="Blue"
+ WidthRequest="300"
+ HorizontalOptions="Fill"
+ VerticalOptions="Fill" />
+ </Grid>
+ </StackLayout>
+</ContentPage> \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1568.xaml.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1568.xaml.cs
new file mode 100644
index 00000000..6dce5c68
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1568.xaml.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls.TestCasesPages
+{
+#if APP
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Github, 1568, "StackLayout, Grid issue", PlatformAffected.Android | PlatformAffected.iOS | PlatformAffected.WinPhone)]
+ public partial class Issue1568 : ContentPage
+ {
+ public Issue1568 ()
+ {
+ InitializeComponent ();
+ }
+ }
+#endif
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1583.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1583.cs
new file mode 100644
index 00000000..f150d46d
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1583.cs
@@ -0,0 +1,20 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1583, "NavigationPage.TitleIcon broken", PlatformAffected.Android | PlatformAffected.iOS | PlatformAffected.WinPhone)]
+ public class Issue1583 : ContentPage
+ {
+ public Issue1583 ()
+ {
+ Title = "Test";
+ BackgroundColor = Color.Pink;
+ Content = new Label{Text = "Hello"};
+ NavigationPage.SetTitleIcon(this, "bank.png");
+ }
+ }
+}
+
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1590.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1590.cs
new file mode 100644
index 00000000..2e1c70c7
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1590.cs
@@ -0,0 +1,123 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls.TestCasesPages
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1590, "ListView.IsGroupingEnabled results ins ArguementOutOfRangeException", PlatformAffected.Android)]
+ public class Issue1590 : ContentPage
+ {
+ ListView _listView;
+
+ public Issue1590()
+ {
+ var vm = new RootPageViewModel();
+ Content = BuildListView(vm);
+ }
+
+ StackLayout BuildListView(RootPageViewModel viewModel)
+ {
+ var headerTemplate = new DataTemplate(typeof(ModuleMediaListHeaderTemplate));
+ headerTemplate.CreateContent();
+
+ var itemTemplate = new DataTemplate(typeof(ModuleMediaListItemTemplate));
+ itemTemplate.CreateContent();
+
+ _listView = new ListView
+ {
+ ItemsSource = viewModel.MediaSections,
+ IsGroupingEnabled = true,
+ GroupDisplayBinding = new Binding("SectionName"),
+ HasUnevenRows = false,
+ GroupHeaderTemplate = headerTemplate,
+ ItemTemplate = itemTemplate
+ };
+
+ return new StackLayout { Children = { _listView } };
+ }
+ }
+
+ [Preserve (AllMembers=true)]
+ public class RootPageViewModel
+ {
+ public IEnumerable MediaSections
+ {
+ get
+ {
+ var titles = new[] {"First", "Second", "Third", "Forth", "Fifth"};
+
+ return titles.Select(section => new MediaListSection(section)
+ {
+ new FooViewModel {Title = "Foo", Description = "description for foo"},
+ new FooViewModel {Title = "Bar", Description = "description for bar"},
+ new FooViewModel {Title = "Baz", Description = "description for baz"},
+ new FooViewModel {Title = "Fiz", Description = "description for fiz"},
+ new FooViewModel {Title = "Buz", Description = "description for buz"},
+ }).ToList();
+ }
+ }
+ }
+
+ [Preserve (AllMembers=true)]
+ public class MediaListSection : ObservableCollection<FooViewModel>
+ {
+ public string SectionName { get; private set; }
+
+ public MediaListSection(string sectionName)
+ {
+ SectionName = sectionName;
+ }
+ }
+
+ [Preserve (AllMembers=true)]
+ public class FooViewModel
+ {
+ public string Title { get; set; }
+ public string Description { get; set; }
+ }
+
+ [Preserve (AllMembers=true)]
+ public class ModuleMediaListItemTemplate : ViewCell
+ {
+ public ModuleMediaListItemTemplate()
+ {
+ var title = new Label { YAlign = TextAlignment.Center };
+ title.SetBinding(Label.TextProperty, new Binding("Title", BindingMode.OneWay));
+
+ var description = new Label { YAlign = TextAlignment.Center };
+ description.SetBinding(Label.TextProperty, new Binding("Description", BindingMode.OneWay));
+
+ View = new StackLayout
+ {
+ Orientation = StackOrientation.Horizontal,
+ Padding = new Thickness(8),
+ Children = { title, description }
+ };
+ }
+ }
+
+ [Preserve (AllMembers=true)]
+ public class ModuleMediaListHeaderTemplate : ViewCell
+ {
+ public ModuleMediaListHeaderTemplate()
+ {
+ var title = new Label { TextColor = Color.White, YAlign = TextAlignment.Center };
+ title.SetBinding(Label.TextProperty, new Binding("SectionName", BindingMode.OneWay));
+
+ View = new StackLayout
+ {
+ Padding = new Thickness(8, 0),
+ BackgroundColor = Color.FromHex("#999999"),
+ Orientation = StackOrientation.Horizontal,
+ Children = { title },
+ };
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1593.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1593.cs
new file mode 100644
index 00000000..238ab936
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1593.cs
@@ -0,0 +1,169 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Xamarin.Forms;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1593, "Android reports zero minimum size for almost all controls", PlatformAffected.Android)]
+ public class Issue1593 : ContentPage
+ {
+ public Issue1593 ()
+ {
+ var title = new Label {
+ Text = "Select League",
+ Font = Font.SystemFontOfSize (NamedSize.Large),
+ TextColor = Color.White
+ };
+
+ # region Season Filter
+
+ var seasonLabel = new Label {
+ Text = "Season",
+ Font = Font.SystemFontOfSize (NamedSize.Small),
+ TextColor = Color.White
+ };
+
+ var seasonPicker = new Picker {
+ WidthRequest = 140,
+ Title = "Season",
+ Items = { "Test 1", "Test 2"}
+ };
+
+ var seasonPanel = new StackLayout {
+ Children = {
+ seasonLabel,
+ seasonPicker
+ }
+ };
+
+ #endregion
+
+ # region Sport Filter
+
+ var sportLabel = new Label {
+ Text = "Sport",
+ Font = Font.SystemFontOfSize (NamedSize.Small),
+ TextColor = Color.White
+ };
+
+ var sportPicker = new Picker {
+ WidthRequest = 140,
+ Title = "Sport",
+ Items = { "Test 1", "Test 2"}
+ };
+
+ var sportPanel = new StackLayout {
+ Children = {
+ sportLabel,
+ sportPicker
+ }
+ };
+
+ #endregion
+
+ var filtersPanel = new StackLayout {
+ Padding = new Thickness (0, 10, 0, 0),
+ Orientation = StackOrientation.Horizontal,
+ HorizontalOptions = LayoutOptions.Fill,
+ Children = {
+ seasonPanel,
+ sportPanel
+ }
+ };
+
+ var leagues = new ListView {
+ MinimumHeightRequest = 100,
+ ItemsSource = new [] {
+ "Test 1",
+ "Test 2",
+ "Test 3",
+ "Test 4",
+ "Test 5",
+ "Test 6",
+ "Test 7",
+ "Test 8",
+ "Test 9",
+ "Test 10",
+ "Test 11",
+ "Test 12",
+ "Test 13",
+ "Test 14",
+ "Test 15",
+ },
+ BackgroundColor = Color.Gray,
+ ItemTemplate = new DataTemplate (() => {
+ var leagueName = new Label {
+ Font =
+ Font.SystemFontOfSize (NamedSize.Large),
+ BackgroundColor = Color.Transparent,
+ TextColor = Color.White,
+ VerticalOptions = LayoutOptions.CenterAndExpand,
+ LineBreakMode = LineBreakMode.WordWrap
+ };
+ leagueName.SetBinding (Label.TextProperty, ".");
+
+ var row = new StackLayout {
+ Padding = new Thickness (5, 0, 5, 0),
+ BackgroundColor = Color.Transparent,
+ Orientation = StackOrientation.Horizontal,
+ VerticalOptions = LayoutOptions.CenterAndExpand,
+ Children = {
+ leagueName
+ }
+ };
+
+ return new ViewCell {
+ View = row
+ };
+ })
+ };
+
+ var activityIndicator = new ActivityIndicator {
+ VerticalOptions =
+ LayoutOptions.CenterAndExpand,
+ IsVisible = false
+ };
+
+ var titlePanel = new StackLayout {
+ Orientation = StackOrientation.Horizontal,
+ Spacing = 50,
+ Children = {
+ title,
+ activityIndicator
+ }
+ };
+
+ var standingsButton = new Button {
+ Text = "Standings",
+ HorizontalOptions = LayoutOptions.CenterAndExpand
+ };
+
+ var scheduleButton = new Button {
+ Text = "Schedule",
+ HorizontalOptions = LayoutOptions.CenterAndExpand
+ };
+
+ var buttonPanel = new StackLayout {
+ Orientation = StackOrientation.Horizontal,
+ HorizontalOptions = LayoutOptions.CenterAndExpand,
+ Children = {
+ standingsButton,
+ scheduleButton
+ }
+ };
+
+ Content = new StackLayout {
+ Padding = 20,
+ Children = {
+ titlePanel,
+ filtersPanel,
+ leagues,
+ buttonPanel
+ }
+ };
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1598.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1598.cs
new file mode 100644
index 00000000..bb448743
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1598.cs
@@ -0,0 +1,80 @@
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ public class MasterDetailToolbarBug : MasterDetailPage
+ {
+ public MasterDetailToolbarBug ()
+ {
+ Title = "MasterDetailToolbarBug";
+
+ Master = new ContentPage () {
+ Title = "Master"
+ };
+ Detail = new ContentPage () {
+ Title = "Detail",
+ };
+ Detail.ToolbarItems.Add (new ToolbarItem ("ToolbarItem2", "Icon.png", ()
+ => { }));
+ }
+ }
+
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1598, "MasterDetailContainer does not handle adding of views which are already its children", PlatformAffected.Android)]
+ public class Issue1598 : ContentPage
+ {
+ MasterDetailToolbarBug _secondPage = new MasterDetailToolbarBug ();
+
+ public Issue1598 ()
+ {
+ Title = "XamarinTest MainMenu";
+
+ var menu1 = new MainMenuCell ("MasterDetail - Toolbar bug", "Icon.png");
+ menu1.Tapped += (o, e) => {
+ Navigation.PushAsync (_secondPage);
+ };
+
+ var menu = new TableView () {
+ VerticalOptions = LayoutOptions.FillAndExpand,
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ HasUnevenRows = true,
+ Intent = TableIntent.Menu,
+ Root = new TableRoot {
+ new TableSection ("Menu") {
+ menu1,
+ }
+ }
+ };
+
+ Content = menu;
+
+ ToolbarItems.Add (new ToolbarItem ("ToolbarItem1", "bank.png", () => { }));
+ }
+
+ class MainMenuCell : ViewCell
+ {
+ public MainMenuCell (string title, string iconFile)
+ {
+ View = new StackLayout () {
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ VerticalOptions = LayoutOptions.FillAndExpand,
+ Orientation = StackOrientation.Horizontal,
+ Spacing = 15,
+ Padding = 10,
+ Children = {
+ new Image () {
+ Source = ImageSource.FromFile (iconFile),
+ VerticalOptions = LayoutOptions.CenterAndExpand,
+ },
+ new Label () {
+ Text = title,
+ VerticalOptions = LayoutOptions.CenterAndExpand,
+ Font = Font.SystemFontOfSize (NamedSize.Large,
+ FontAttributes.Bold)
+ }
+ }
+ };
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1613.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1613.cs
new file mode 100644
index 00000000..1eaf95e4
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1613.cs
@@ -0,0 +1,64 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Xamarin.Forms.CustomAttributes;
+using Xamarin.Forms.Maps;
+
+namespace Xamarin.Forms.Controls.TestCasesPages
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1613, "Map.GetSizeRequest always returns map's current size", PlatformAffected.Android | PlatformAffected.iOS)]
+ public class Issue1613 : ContentPage
+ {
+ public Issue1613 ()
+ {
+ Build ();
+ }
+
+ async void Build ()
+ {
+ var image = new Image {
+ Source = "http://www.califliving.com/title24-energy/images/sanfrancisco.jpg",
+ Aspect = Aspect.AspectFill,
+ Opacity = 0.5,
+ };
+
+ var name = new Label {
+ Text = "Foo",
+ XAlign = TextAlignment.Center,
+ YAlign = TextAlignment.Center,
+ Font = Font.SystemFontOfSize(30, FontAttributes.Bold),
+ TextColor = Color.White,
+ };
+
+ var nameView = new AbsoluteLayout {
+ HeightRequest = 170,
+ BackgroundColor = Color.Black,
+ Children = {
+ {image, new Rectangle(0, 0, 1, 1), AbsoluteLayoutFlags.All},
+ {name, new Rectangle(0, 0, 1, 1), AbsoluteLayoutFlags.All}
+ },
+ };
+
+ var addressLabel = new Label {
+ Text = "Loading address…",
+ XAlign = TextAlignment.Center,
+ YAlign = TextAlignment.Center,
+ };
+
+ var map = new Map {
+ VerticalOptions = LayoutOptions.FillAndExpand,
+ };
+
+ Content = new StackLayout {
+ Children = { nameView, addressLabel, map },
+ };
+
+ await Task.Delay (1000);
+ addressLabel.Text = "Updated with new\nmultiline\nlabel";
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1618.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1618.cs
new file mode 100644
index 00000000..48f519f6
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1618.cs
@@ -0,0 +1,37 @@
+using System;
+using System.Linq;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1618, "Horizontal ScrollView in ListView crashes", PlatformAffected.Android)]
+ public class Issue1618
+ : ContentPage
+ {
+ public Issue1618()
+ {
+ Content = new ListView {
+ ItemsSource = Enumerable.Range(0, 100).Select (i => Enumerable.Repeat (i, 500).Aggregate (string.Empty, (s, n) => s += n + " ")),
+ ItemTemplate = new DataTemplate (typeof (MyCell))
+ };
+ }
+
+ class MyCell
+ : ViewCell
+ {
+ public MyCell()
+ {
+ var scroll = new ScrollView {
+ Orientation = ScrollOrientation.Horizontal,
+ Content = new Label()
+ };
+
+ scroll.Content.SetBinding (Label.TextProperty, ".");
+
+ View = scroll;
+ }
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1641.xaml b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1641.xaml
new file mode 100644
index 00000000..ddc824a0
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1641.xaml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
+ xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+ x:Class="Xamarin.Forms.Controls.Issue1641">
+ <ContentPage.Resources>
+ <ResourceDictionary>
+ <x:String x:Key="caption" >Hello there!</x:String>
+ </ResourceDictionary>
+ </ContentPage.Resources>
+ <TableView>
+ <TableRoot Title="x">
+ <TableSection Title="y">
+ <TextCell Text="{StaticResource caption}" />
+ </TableSection>
+ </TableRoot>
+ </TableView>
+</ContentPage> \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1641.xaml.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1641.xaml.cs
new file mode 100644
index 00000000..c5e03f6e
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1641.xaml.cs
@@ -0,0 +1,17 @@
+using Xamarin.Forms;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+#if APP
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Github, 1641, "Static Resources inside TableView using XAML doesn't work", PlatformAffected.Android | PlatformAffected.iOS | PlatformAffected.WinPhone)]
+ public partial class Issue1641 : ContentPage
+ {
+ public Issue1641 ()
+ {
+ InitializeComponent ();
+ }
+ }
+#endif
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1644.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1644.cs
new file mode 100644
index 00000000..c8947782
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1644.cs
@@ -0,0 +1,74 @@
+using System;
+using Xamarin.Forms;
+using System.Collections.ObjectModel;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1644, "ListView reappearing and selecting its item causes jobject exception", PlatformAffected.Android)]
+ public class Issue1644 : ContentPage
+ {
+ public ObservableCollection<string> Collection = new
+ ObservableCollection<string>();
+
+ public Issue1644 ()
+ {
+ for (int i = 0; i < 20; i++)
+ {
+ Collection.Add(DateTime.Now.ToString());
+ }
+
+ var listView = new ListView() {
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ HasUnevenRows = true,
+ ItemsSource = Collection,
+ };
+
+ listView.ItemSelected += (sender, e) =>
+ {
+ listView.SelectedItem = null;
+ };
+
+ var root = new StackLayout() {
+ Padding = 5,
+ Spacing = 5,
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ VerticalOptions = LayoutOptions.FillAndExpand,
+ Children = {
+ listView
+ }
+ };
+
+ Content = root;
+ }
+ }
+
+ public class Issue1644Menu : MasterDetailPage
+ {
+ Issue1644 _secondPage = new Issue1644();
+
+ public Issue1644Menu()
+ {
+ var button = new Button() {
+ Text = "MAIN MENU BUTTON"
+ };
+
+ button.Clicked += (sender, e) =>
+ {
+ Navigation.PushAsync(_secondPage);
+ };
+
+ Master = new ContentPage() {
+ Title = "Master"
+ };
+
+ Detail = new ContentPage() {
+ Title = "Detail",
+ Content = button
+ };
+ }
+ }
+}
+
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1653.xaml b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1653.xaml
new file mode 100644
index 00000000..2d937fc4
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1653.xaml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
+ xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+ x:Class="Xamarin.Forms.Controls.Issue1653">
+ <StackLayout Spacing="0">
+ <StackLayout x:Name="accountDetailsStack"/>
+ <StackLayout x:Name="carrierHeaderStack">
+ <Label Text="HEADER" Font="40" />
+ </StackLayout>
+ <StackLayout Padding="22,0,22,22">
+ <Label x:Name="productNameLabel" Text="TESTING 345" XAlign="Center" YAlign="Center" TextColor="#808080"></Label>
+ <StackLayout IsClippedToBounds="true">
+ <ScrollView HeightRequest="980" BackgroundColor="Aqua" IsClippedToBounds="true">
+ <StackLayout x:Name="addonGroupStack" Spacing="1" ></StackLayout>
+ </ScrollView>
+ </StackLayout>
+ <Button x:Name="activateButton" Text="ACTIVATE NOW" TextColor="White" BackgroundColor="#00A0FF">
+ </Button>
+ <ActivityIndicator x:Name="checkoutRunningIndicator" HeightRequest="20"/>
+ </StackLayout>
+ </StackLayout>
+</ContentPage> \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1653.xaml.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1653.xaml.cs
new file mode 100644
index 00000000..e8088be7
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1653.xaml.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+#if APP
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Github, 1653, "ScrollView exceeding bounds", PlatformAffected.Android | PlatformAffected.iOS | PlatformAffected.WinPhone)]
+ public partial class Issue1653 : ContentPage
+ {
+ public Issue1653 ()
+ {
+ InitializeComponent ();
+
+ for (int i = 0; i < 40; i++)
+ addonGroupStack.Children.Add (new Label {Text = "Testing 123"});
+ }
+ }
+#endif
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1653v2.xaml b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1653v2.xaml
new file mode 100644
index 00000000..581087dd
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1653v2.xaml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
+ xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+ x:Class="Xamarin.Forms.Controls.Issue1653v2">
+ <StackLayout Spacing="0">
+ <StackLayout x:Name="accountDetailsStack"/>
+ <StackLayout x:Name="carrierHeaderStack">
+ <Label Text="HEADER" Font="40" />
+ </StackLayout>
+ <StackLayout Padding="22,0,22,22">
+ <Label x:Name="productNameLabel" Text="TESTING 345" XAlign="Center" YAlign="Center" TextColor="#808080"></Label>
+ <ScrollView HeightRequest="980" BackgroundColor="Aqua" IsClippedToBounds="true">
+ <StackLayout x:Name="addonGroupStack" Spacing="1" ></StackLayout>
+ </ScrollView>
+ <Button x:Name="activateButton" Text="ACTIVATE NOW" TextColor="White" BackgroundColor="#00A0FF">
+ </Button>
+ <ActivityIndicator x:Name="checkoutRunningIndicator" HeightRequest="20"/>
+ </StackLayout>
+ </StackLayout>
+</ContentPage>
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1653v2.xaml.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1653v2.xaml.cs
new file mode 100644
index 00000000..2492e8cf
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1653v2.xaml.cs
@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using Xamarin.Forms;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+#if APP
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Github, 1653, "ScrollView exceeding bounds - v2", PlatformAffected.Android | PlatformAffected.iOS | PlatformAffected.WinPhone)]
+ public partial class Issue1653v2 : ContentPage
+ {
+ public Issue1653v2 ()
+ {
+ InitializeComponent ();
+
+ for (int i = 0; i < 40; i++)
+ addonGroupStack.Children.Add (new Label {Text = "Testing 123"});
+ }
+ }
+#endif
+}
+
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1664.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1664.cs
new file mode 100644
index 00000000..61cbecfd
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1664.cs
@@ -0,0 +1,46 @@
+using System;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1664, "Page.Title bubbling", PlatformAffected.iOS)]
+ public class Issue1664 : TabbedPage
+ {
+ public Issue1664 ()
+ {
+ NavigationPage nav1 = new NavigationPage (new ContentPage {Title = "Page1"});
+ NavigationPage nav2 = new NavigationPage (new PageTwo ());
+
+ nav1.Title = "Tab 1";
+ nav2.Title = "Tab 2";
+
+ Children.Add (nav1);
+ Children.Add (nav2);
+ }
+
+ public class PageTwo : ContentPage
+ {
+ public PageTwo ()
+ {
+ var pageTwoEntry = new Entry {
+ VerticalOptions = LayoutOptions.Center,
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ Placeholder = "Enter a title for page 2",
+ Text = "Page 2",
+ };
+
+ pageTwoEntry.SetBinding (Entry.TextProperty, new Binding ("Title", BindingMode.OneWayToSource));
+ BindingContext = this;
+ Content = new StackLayout {
+ Children = {
+ new Label {Text = "When changing the content of this entry, the page title (on top) should update, but not the tab title"},
+ pageTwoEntry
+ }
+ };
+ }
+ }
+ }
+}
+
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1680.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1680.cs
new file mode 100644
index 00000000..eb98b5ed
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1680.cs
@@ -0,0 +1,106 @@
+using System;
+using System.Collections.ObjectModel;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1680, "Disposed object updating ListView ItemSource", PlatformAffected.Android)]
+ public class Issue1680 : ContentPage
+ {
+ XamarinListViewBug _page1 = new XamarinListViewBug();
+
+ public Issue1680()
+ {
+ var button1 = new Button { Text = "PAGE1" };
+
+ button1.Clicked += (sender, e) => Navigation.PushAsync (_page1);
+
+ var root = new StackLayout {
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ VerticalOptions = LayoutOptions.FillAndExpand,
+ Children = {
+ button1,
+ }
+ };
+
+ Content = root;
+ }
+
+ public class XamarinListViewBug : MasterDetailPage
+ {
+ bool _flag;
+
+ readonly ObservableCollection<Tuple<string, string>> _collection = new ObservableCollection<Tuple<string, string>>();
+
+ void FillTheList()
+ {
+ _collection.Clear();
+
+ for (int i = 0; i < 100; i++) {
+ var item = new Tuple<string, string> (
+ string.Format ("{0} {0} {0} {0} {0} {0}", _flag ? i : 100 - i),
+ string.Format ("---- i ----{0} {0} {0} {0} {0} {0}", _flag ? i : 100 - i)
+ );
+
+
+ _collection.Add (item);
+ }
+
+ _flag = !_flag;
+ }
+
+ public XamarinListViewBug()
+ {
+ Title = "XamarinListViewBug";
+
+ SearchBar search = new SearchBar();
+ search.SearchButtonPressed += (sender, e) => FillTheList();
+
+ ListView list = new ListView {
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ VerticalOptions = LayoutOptions.FillAndExpand,
+ HasUnevenRows = true,
+ ItemsSource = _collection,
+ ItemTemplate = new DataTemplate (typeof (CellTemplate))
+ };
+
+ StackLayout root = new StackLayout {
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ VerticalOptions = LayoutOptions.FillAndExpand,
+ Children = {
+ search,
+ list,
+ }
+ };
+
+ Master = new ContentPage { Title = "Master" };
+ Detail = new ContentPage {
+ Title = "Detail",
+ Content = root
+ };
+ }
+
+ class CellTemplate : ViewCell
+ {
+ public CellTemplate()
+ {
+ Label cellLabel = new Label{
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ };
+
+ cellLabel.SetBinding (Label.TextProperty, new Binding ("Item1", BindingMode.OneWay));
+
+ StackLayout root = new StackLayout {
+ Children = {
+ cellLabel
+ }
+ };
+
+ View = root;
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1682.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1682.cs
new file mode 100644
index 00000000..b23a534d
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1682.cs
@@ -0,0 +1,30 @@
+using System;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1682, "Software keyboard does not show up when we set Focus for Entry in Android", PlatformAffected.Android, NavigationBehavior.PushModalAsync)]
+ public class Issue1682 : ContentPage
+ {
+ public Issue1682 ()
+ {
+ var entry = new Entry {
+ WidthRequest = 300
+ };
+
+ var button = new Button {
+ Text = "Click"
+ };
+
+ button.Clicked += (sender, e) => entry.Focus ();
+
+ Content = new StackLayout {
+ Children = { entry, button },
+ VerticalOptions = LayoutOptions.CenterAndExpand,
+ HorizontalOptions = LayoutOptions.CenterAndExpand,
+ };
+ }
+ }
+}
+
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1685.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1685.cs
new file mode 100644
index 00000000..1f9cbcf2
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1685.cs
@@ -0,0 +1,77 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers=true)]
+ [Issue (IssueTracker.Github, 1685, "Entry clears when upadting text from native with one-way binding", PlatformAffected.Android | PlatformAffected.iOS | PlatformAffected.WinPhone, NavigationBehavior.PushModalAsync)]
+ public class Issue1685 : ContentPage
+ {
+ class Test : INotifyPropertyChanged
+ {
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ decimal _entryValue = decimal.Zero;
+ public decimal EntryValue
+ {
+ get
+ {
+ return _entryValue;
+ }
+ set
+ {
+ _entryValue = value;
+ OnPropertyChanged("EntryValue");
+ }
+ }
+
+ void OnPropertyChanged(string caller) {
+ var handler = PropertyChanged;
+ if (handler != null)
+ {
+ handler(this, new PropertyChangedEventArgs(caller));
+ }
+ }
+ }
+
+ public Issue1685()
+ {
+ Title = "EntryBindingBug";
+
+ BindingContext = new Test();
+
+ var entry = new Entry() {
+ Placeholder = "Entry"
+ };
+ entry.SetBinding(Entry.TextProperty, "EntryValue", BindingMode.OneWay);
+
+ var button = new Button() {
+ Text = "Click me"
+ };
+
+ button.Clicked += (sender, e) =>
+ {
+ var context = BindingContext as Test;
+ context.EntryValue = context.EntryValue + 1;
+ };
+
+ var root = new StackLayout() {
+ VerticalOptions = LayoutOptions.FillAndExpand,
+ HorizontalOptions = LayoutOptions.FillAndExpand,
+ Children = {
+ entry,
+ button
+ }
+ };
+
+ Content = root;
+
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1691.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1691.cs
new file mode 100644
index 00000000..110f9093
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1691.cs
@@ -0,0 +1,77 @@
+using System;
+using System.Collections.ObjectModel;
+using System.Linq;
+
+using Xamarin.Forms.CustomAttributes;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+using System.Diagnostics;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ [Issue (IssueTracker.Github, 1691, "CarouselPage iOS CurrentPage bug")]
+ public class Issue1691 : TestCarouselPage
+ {
+ int _currentIndex;
+ int _page = 9;
+
+ protected override void Init ()
+ {
+ _currentIndex = 10;
+ ItemsSource = new ObservableCollection<int>() { _currentIndex };
+ SelectedItem = ((ObservableCollection<int>)ItemsSource)[0];
+ }
+
+ protected override ContentPage CreateDefault (object item)
+ {
+ var currentInt = item as int?;
+
+ var label = new Label {
+ Text = "Page " + currentInt,
+ };
+
+ return new ContentPage {
+ Content = new StackLayout {
+ Children = {
+ label,
+ new Button {
+ AutomationId = "CreatePreviousPage" + currentInt,
+ Text = "Create previous page",
+ Command = new Command (() => {
+ ((ObservableCollection<int>)ItemsSource).Insert (0, _page);
+ _page--;
+ label.Text = "Page Created";
+ })
+ },
+ new Button {
+ AutomationId = "GoToPreviousPage" + currentInt,
+ Text = "Go to previous page",
+ Command = new Command (() => {
+ CurrentPage = Children[0];
+ })
+ }
+ }
+ }
+ };
+ }
+
+#if UITEST
+ [Test]
+ public void Issue1691Test ()
+ {
+ RunningApp.Screenshot ("I am at Issue 1691");
+ RunningApp.Tap (q => q.Marked ("CreatePreviousPage10"));
+ RunningApp.WaitForElement (q => q.Marked ("Page Created"));
+ RunningApp.Screenshot ("I should be on the same page with a new page created to the left");
+ RunningApp.Tap (q => q.Marked ("GoToPreviousPage10"));
+ RunningApp.WaitForNoElement (q => q.Marked ("GoToPreviousPage10"));
+ RunningApp.Screenshot ("I should be on page 9");
+ RunningApp.WaitForElement (q => q.Marked ("GoToPreviousPage9"));
+ }
+#endif
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1698.cs b/Xamarin.Forms.Controls.Issues/Xam