summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.ControlGallery.WP8/MainPage.xaml.cs
blob: e1ddb60fe3360ece9740d2c160205757380be572 (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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Automation.Peers;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using Xamarin.Forms.ControlGallery.WP8.Resources;
using Xamarin.Forms;
using Xamarin.Forms.ControlGallery.WP8;
using Xamarin.Forms.Controls;
using Xamarin.Forms.Maps.WP8;
using Xamarin.Forms.Platform.WinPhone;

[assembly: Dependency (typeof (StringProvider))]
namespace Xamarin.Forms.ControlGallery.WP8
{
	public class StringProvider : IStringProvider
	{
		public string CoreGalleryTitle { get { return "WP8 Core Gallery"; } }
	}

#if PRE_APPLICATION_CLASS
	public partial class MainPage : PhoneApplicationPage
	{
		public MainPage ()
		{
			InitializeComponent();

			Forms.Init ();
			FormsMaps.Init ();

			Content = CoreGallery.GetMainPage ().ConvertPageToUIElement (this);

			MessagingCenter.Subscribe<RootPagesGallery, Type>(this, Messages.ChangeRoot, (sender, pagetype) =>
			{
				var page = ((Page) Activator.CreateInstance(pagetype));
				app.MainPage = page;
			});

			MessagingCenter.Subscribe<HomeButton>(this, Messages.GoHome, (sender) => {
				var page = FormsApp.GetFormsApp ();
				app.MainPage = page;
			});
		}
	}

#else
	public partial class MainPage : FormsApplicationPage
	{
		// Constructor
		public MainPage()
		{
			InitializeComponent();

			Forms.Init ();
			FormsMaps.Init ();

			var app = new Controls.App ();

			var mdp = app.MainPage as MasterDetailPage;

			var detail = mdp?.Detail as NavigationPage;
			if (detail != null) {
				detail.Pushed += (sender, args) => {
					var nncgPage = args.Page as NestedNativeControlGalleryPage;

					if (nncgPage != null) {
						AddNativeControls (nncgPage);
					}
				};
			}

			LoadApplication (app);
		}

		void AddNativeControls (NestedNativeControlGalleryPage page)
		{
			if (page.NativeControlsAdded) {
				return;
			}

			StackLayout sl = page.Layout;

			// Create and add a native TextBlock
			var originalText = "I am a native TextBlock";
			var textBlock = new TextBlock {
				Text = originalText,
				FontSize = 14,
				FontFamily = new FontFamily ("HelveticaNeue")
			};

			sl?.Children.Add (textBlock);

			// Create and add a native Button 
			var button = new System.Windows.Controls.Button { Content = "Click to toggle font size", Height = 80 };
			button.Click += (sender, args) => { textBlock.FontSize = textBlock.FontSize == 14 ? 24 : 14; };

			sl?.Children.Add (button.ToView ());

			// Create a control which we know doesn't behave correctly with regard to measurement
			var difficultControl = new BrokenNativeControl {
				Text = "Not Sized/Arranged Properly"
			};

			var difficultControl2 = new BrokenNativeControl {
				Text = "Fixed"
			};

			// Add the misbehaving controls, one with a custom delegate for ArrangeOverride
			sl?.Children.Add (difficultControl);
			sl?.Children.Add (difficultControl2,
				arrangeOverrideDelegate: (renderer, finalSize) => {
					if (finalSize.Width <= 0 || double.IsInfinity (finalSize.Width)) {
						return null;
					}

					FrameworkElement frameworkElement = renderer.Control;

					frameworkElement.Measure (finalSize);

					// The broken control always sizes itself to be 600 wide
					// We can re-center it by offsetting it during the Arrange call
					double diff = (finalSize.Width - 600) / 2;
					frameworkElement.Arrange (new Rect (diff, 0, finalSize.Width - diff, finalSize.Height));

					// Arranging the control to the left will make it show up past the edge of the stack layout
					// We can fix that by clipping it manually
					var clip = new RectangleGeometry { Rect = new Rect (-diff, 0, finalSize.Width, finalSize.Height) };
					frameworkElement.Clip = clip;

					return finalSize;
				}
			);

			page.NativeControlsAdded = true;
		}
	}
#endif
}