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
}
|