summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Controls/ViewContainers
diff options
context:
space:
mode:
authorJason Smith <jason.smith@xamarin.com>2016-03-22 13:02:25 -0700
committerJason Smith <jason.smith@xamarin.com>2016-03-22 16:13:41 -0700
commit17fdde66d94155fc62a034fa6658995bef6fd6e5 (patch)
treeb5e5073a2a7b15cdbe826faa5c763e270a505729 /Xamarin.Forms.Controls/ViewContainers
downloadxamarin-forms-17fdde66d94155fc62a034fa6658995bef6fd6e5.tar.gz
xamarin-forms-17fdde66d94155fc62a034fa6658995bef6fd6e5.tar.bz2
xamarin-forms-17fdde66d94155fc62a034fa6658995bef6fd6e5.zip
Initial import
Diffstat (limited to 'Xamarin.Forms.Controls/ViewContainers')
-rw-r--r--Xamarin.Forms.Controls/ViewContainers/EventViewContainer.cs32
-rw-r--r--Xamarin.Forms.Controls/ViewContainers/LayeredViewContainer.cs38
-rw-r--r--Xamarin.Forms.Controls/ViewContainers/MultiBindingHack.cs47
-rw-r--r--Xamarin.Forms.Controls/ViewContainers/StateViewContainer.cs48
-rw-r--r--Xamarin.Forms.Controls/ViewContainers/ValueViewContainer.cs16
-rw-r--r--Xamarin.Forms.Controls/ViewContainers/ViewContainer.cs44
6 files changed, 225 insertions, 0 deletions
diff --git a/Xamarin.Forms.Controls/ViewContainers/EventViewContainer.cs b/Xamarin.Forms.Controls/ViewContainers/EventViewContainer.cs
new file mode 100644
index 00000000..2095c037
--- /dev/null
+++ b/Xamarin.Forms.Controls/ViewContainers/EventViewContainer.cs
@@ -0,0 +1,32 @@
+using System;
+
+namespace Xamarin.Forms.Controls
+{
+ internal class EventViewContainer<T> : ViewContainer<T>
+ where T : View
+ {
+ string _formsMember;
+ Label _eventLabel;
+ int _numberOfTimesFired;
+
+ public EventViewContainer (Enum formsMember, T view) : base (formsMember, view)
+ {
+ _numberOfTimesFired = 0;
+
+ _formsMember = formsMember.ToString ();
+
+ _eventLabel = new Label {
+ AutomationId = formsMember + "EventLabel",
+ Text = "Event: " + _formsMember + " (none)"
+ };
+
+ ContainerLayout.Children.Add (_eventLabel);
+ }
+
+ public void EventFired ()
+ {
+ _numberOfTimesFired++;
+ _eventLabel.Text = "Event: " + _formsMember + " (fired " + _numberOfTimesFired + ")";
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls/ViewContainers/LayeredViewContainer.cs b/Xamarin.Forms.Controls/ViewContainers/LayeredViewContainer.cs
new file mode 100644
index 00000000..e22ecfb6
--- /dev/null
+++ b/Xamarin.Forms.Controls/ViewContainers/LayeredViewContainer.cs
@@ -0,0 +1,38 @@
+using System;
+
+namespace Xamarin.Forms.Controls
+{
+ internal class LayeredViewContainer<T> : ViewContainer<T>
+ where T : View
+ {
+ public LayeredViewContainer (Enum formsMember, T view) : base (formsMember, view)
+ {
+ var layout = new AbsoluteLayout ();
+
+ var hiddenButton = new Button {
+ AutomationId = formsMember + "LayeredHiddenButton",
+ Text = "Covered Up"
+ };
+
+ layout.Children.Add (hiddenButton);
+ AbsoluteLayout.SetLayoutFlags (hiddenButton, AbsoluteLayoutFlags.All);
+ AbsoluteLayout.SetLayoutBounds (hiddenButton, new Rectangle (0, 0, 1, 1));
+ layout.Children.Add (view);
+ AbsoluteLayout.SetLayoutBounds (view, new Rectangle (0, 0, 1, 1));
+ AbsoluteLayout.SetLayoutFlags (view, AbsoluteLayoutFlags.All);
+
+ var hiddenLabel = new Label {
+ AutomationId = formsMember + "LayeredLabel",
+ Text = "Hidden Button (Not Clicked)"
+ };
+
+ hiddenButton.Clicked += (sender, args) => { hiddenLabel.Text = "Hidden Button (Clicked)"; };
+
+ ContainerLayout = new StackLayout {
+ AutomationId = formsMember + "Container",
+ Padding = 10,
+ Children = { TitleLabel, BoundsLabel, layout, hiddenLabel }
+ };
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls/ViewContainers/MultiBindingHack.cs b/Xamarin.Forms.Controls/ViewContainers/MultiBindingHack.cs
new file mode 100644
index 00000000..4853fd14
--- /dev/null
+++ b/Xamarin.Forms.Controls/ViewContainers/MultiBindingHack.cs
@@ -0,0 +1,47 @@
+using System.ComponentModel;
+using System.Runtime.CompilerServices;
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve (AllMembers = true)]
+ internal class MultiBindingHack : INotifyPropertyChanged
+ {
+ string _labelWithBounds;
+
+ public MultiBindingHack (VisualElement element)
+ {
+ LabelWithBounds = string.Format("{{X={0:0.00} Y={1:0.00} Width={2:0.00} Height={3:0.00}}}", element.X, element.Y, element.Width, element.Height);
+
+ element.PropertyChanged += (sender, args) => {
+ if (args.PropertyName == "X" ||
+ args.PropertyName == "Y" ||
+ args.PropertyName == "Width" ||
+ args.PropertyName == "Height" ||
+ args.PropertyName == "Rotation") {
+ LabelWithBounds = string.Format("{{X={0:0.00} Y={1:0.00} Width={2:0.00} Height={3:0.00}}}", element.X, element.Y, element.Width, element.Height); // super hack
+ }
+ };
+ }
+
+ public string LabelWithBounds
+ {
+ get { return _labelWithBounds; }
+ set
+ {
+ if (_labelWithBounds == value)
+ return;
+ _labelWithBounds = value;
+ OnPropertyChanged ();
+ }
+ }
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ void OnPropertyChanged ([CallerMemberName] string propertyName = null)
+ {
+ PropertyChangedEventHandler handler = PropertyChanged;
+ if (handler != null)
+ handler (this, new PropertyChangedEventArgs (propertyName));
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls/ViewContainers/StateViewContainer.cs b/Xamarin.Forms.Controls/ViewContainers/StateViewContainer.cs
new file mode 100644
index 00000000..b08cc306
--- /dev/null
+++ b/Xamarin.Forms.Controls/ViewContainers/StateViewContainer.cs
@@ -0,0 +1,48 @@
+using System;
+
+namespace Xamarin.Forms.Controls
+{
+ internal class StateViewContainer<T> : ViewContainer<T>
+ where T : View
+ {
+ public Button StateChangeButton { get; private set; }
+ public Label ViewInteractionLabel { get; private set; }
+
+ public StateViewContainer (Enum formsMember, T view) : base (formsMember, view)
+ {
+ var name = formsMember.ToString ();
+
+ var stateTitleLabel = new Label {
+ Text = name + "?"
+ };
+
+ ViewInteractionLabel = new Label {
+ Text = "Interacted? : False"
+ };
+
+ var stateValueLabel = new Label {
+ BindingContext = view,
+ AutomationId = name + "StateLabel"
+ };
+ if (name != "Focus")
+ stateValueLabel.SetBinding (Label.TextProperty, name, converter: new GenericValueConverter (o => o.ToString()));
+
+ StateChangeButton = new Button {
+ Text = "Change State: " + name,
+ AutomationId = name + "StateButton"
+ };
+
+ var labelLayout = new StackLayout {
+ Orientation = StackOrientation.Horizontal,
+ Children = {
+ stateTitleLabel,
+ stateValueLabel
+ }
+ };
+
+ ContainerLayout.Children.Add (ViewInteractionLabel);
+ ContainerLayout.Children.Add (labelLayout);
+ ContainerLayout.Children.Add (StateChangeButton);
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls/ViewContainers/ValueViewContainer.cs b/Xamarin.Forms.Controls/ViewContainers/ValueViewContainer.cs
new file mode 100644
index 00000000..08dcc166
--- /dev/null
+++ b/Xamarin.Forms.Controls/ViewContainers/ValueViewContainer.cs
@@ -0,0 +1,16 @@
+using System;
+
+namespace Xamarin.Forms.Controls
+{
+ internal class ValueViewContainer<T> : ViewContainer<T> where T : View
+ {
+ public ValueViewContainer (Enum formsMember, T view, string bindingPath, Func<object, object> converterAction) : base (formsMember, view)
+ {
+
+ var valueLabel = new Label { BindingContext = View };
+ valueLabel.SetBinding (Label.TextProperty, bindingPath, converter: new GenericValueConverter (converterAction));
+
+ ContainerLayout.Children.Add (valueLabel);
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Controls/ViewContainers/ViewContainer.cs b/Xamarin.Forms.Controls/ViewContainers/ViewContainer.cs
new file mode 100644
index 00000000..f12a0030
--- /dev/null
+++ b/Xamarin.Forms.Controls/ViewContainers/ViewContainer.cs
@@ -0,0 +1,44 @@
+using System;
+using System.Linq.Expressions;
+
+namespace Xamarin.Forms.Controls
+{
+ internal enum ViewLayoutType
+ {
+ Normal,
+ Layered
+ }
+
+ internal class ViewContainer<T>
+ where T : View
+ {
+
+ public Label TitleLabel { get; private set; }
+ public Label BoundsLabel { get; private set; }
+ public T View { get; private set; }
+
+ // May want to override the container layout in subclasses
+ public StackLayout ContainerLayout { get; protected set; }
+
+ public ViewContainer (Enum formsMember, T view)
+ {
+ view.AutomationId = formsMember + "VisualElement";
+ View = view;
+
+ TitleLabel = new Label {
+ Text = formsMember + " View"
+ };
+
+ BoundsLabel = new Label {
+ BindingContext = new MultiBindingHack (view)
+ };
+ BoundsLabel.SetBinding (Label.TextProperty, "LabelWithBounds");
+
+ ContainerLayout = new StackLayout {
+ AutomationId = formsMember + "Container",
+ Padding = 10,
+ Children = { TitleLabel, BoundsLabel, view }
+ };
+ }
+ }
+} \ No newline at end of file