summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Controls/GalleryPages/TemplatedCarouselGallery.cs
blob: 2d9cfe11ba3e0511d001d21afb7854bdbd3ec6e0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
using System;
using System.Collections.ObjectModel;
using System.Threading.Tasks;

namespace Xamarin.Forms.Controls
{
	internal class TemplatedCarouselGallery
		: CarouselPage
	{
		ObservableCollection<Item> _items;
		int _count = 0;

		public TemplatedCarouselGallery()
		{
			NavigationPage.SetHasNavigationBar (this, false);

			_items = new ObservableCollection<Item> {
				CreateItem(),
				CreateItem(),
			};

			ItemsSource = _items;

			ItemTemplate = new DataTemplate (() => {
				var page = new ContentPage ();

				page.Padding = new Thickness (0,30,0,0);
				page.SetBinding (TitleProperty, "Title");

				var layout = new StackLayout { Spacing = 0 };

				var label = new Label();
				label.SetBinding (Label.TextProperty, "Content");
				layout.Children.Add (label);

				var swipeHereLabel = new Label {
					Text = "Swipe Here",
					HeightRequest = 40
				};

				layout.Children.Add (swipeHereLabel);

				var add = new Button ();
				add.SetBinding (Button.TextProperty, "InsertTabText");
				add.Clicked += (sender, args) => _items.Insert (_items.IndexOf ((Item)add.BindingContext) + 1, CreateItem());
				layout.Children.Add (add);

				var change = new Button ();
				change.SetBinding (Button.TextProperty, "ChangeTitleText");
				change.Clicked += (sender, args) => ((Item) change.BindingContext).Title = (new Random().Next().ToString());
				layout.Children.Add (change);

				var remove = new Button ();
				remove.SetBinding (Button.TextProperty, "RemoveTabText");
				remove.Clicked += (sender, args) => _items.Remove ((Item)remove.BindingContext);
				layout.Children.Add (remove);

				var reset = new Button ();
				reset.SetBinding (Button.TextProperty, "ResetAllTabsText");
				reset.Clicked += (sender, args) => {
					_count = 0;
					ItemsSource = _items = new ObservableCollection<Item> { CreateItem(), CreateItem() };
				};
				layout.Children.Add (reset);

				var nextPage = new Button ();
				nextPage.SetBinding (Button.TextProperty, "NextPageText");
				nextPage.Clicked += (sender, args) => {
					int index = _items.IndexOf ((Item) nextPage.BindingContext) + 1;
					if (index == _items.Count)
						index = 0;

					SelectedItem = _items[index];
				};
				layout.Children.Add (nextPage);

				var delayReset = new Button { Text = "Delayed reset" };
				delayReset.SetBinding (Button.TextProperty, "DelayedResetText");
				delayReset.Clicked += (sender, args) => {
					ItemsSource = null;

					Task.Delay (5000).ContinueWith (t => {
						_count = 0;
						ItemsSource = _items = new ObservableCollection<Item> { CreateItem(), CreateItem() };
					}, TaskScheduler.FromCurrentSynchronizationContext());
				};

				layout.Children.Add (delayReset);

				page.Content = new ScrollView { 
					Padding = new Thickness (60, 0),
					Content = layout 
				};
				return page;
			});
		}

		Item CreateItem()
		{
			int x = _count++;
			return new Item { 
				Title = "Page " + x, 
				Content = "Lorem ipsum dolor sit amet #" + x, 
				InsertTabText = "Insert Tab: " + x,
				ChangeTitleText = "Change title: " + x,
				MoveTabText = "Move Tab: " + x,
				RemoveTabText = "Remove Tab: " + x,
				ResetAllTabsText = "Reset all tabs: " + x,
				NextPageText = "Next Page: " + x,
				DelayedResetText = "Delayed reset: " + x
			};
		}
	}
}