diff options
author | Jason Smith <jason.smith@xamarin.com> | 2016-03-22 13:02:25 -0700 |
---|---|---|
committer | Jason Smith <jason.smith@xamarin.com> | 2016-03-22 16:13:41 -0700 |
commit | 17fdde66d94155fc62a034fa6658995bef6fd6e5 (patch) | |
tree | b5e5073a2a7b15cdbe826faa5c763e270a505729 /Xamarin.Forms.Controls/ViewContainers | |
download | xamarin-forms-17fdde66d94155fc62a034fa6658995bef6fd6e5.tar.gz xamarin-forms-17fdde66d94155fc62a034fa6658995bef6fd6e5.tar.bz2 xamarin-forms-17fdde66d94155fc62a034fa6658995bef6fd6e5.zip |
Initial import
Diffstat (limited to 'Xamarin.Forms.Controls/ViewContainers')
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 |