using System; using System.Linq; using System.Collections.Generic; using System.Linq.Expressions; using System.Reflection; using System.Threading; using Xamarin.Forms.CustomAttributes; namespace Xamarin.Forms.Controls { internal class CoreGalleryPage : ContentPage where T : View, new () { List _views; int _currentIndex; Picker _picker; StackLayout _moveNextStack; ViewContainer _backgroundColorViewContainer; ViewContainer _opacityViewContainer; ViewContainer _rotationViewContainer; ViewContainer _rotationXViewContainer; ViewContainer _rotationYViewContainer; ViewContainer _scaleViewContainer; ViewContainer _translationXViewContainer; ViewContainer _translationYViewContainer; StateViewContainer _focusStateViewContainer; StateViewContainer _isFocusedStateViewContainer; StateViewContainer _isVisibleStateViewContainer; EventViewContainer _gestureRecognizerEventViewContainer; EventViewContainer _focusedEventViewContainer; EventViewContainer _unfocusedEventViewContainer; LayeredViewContainer _inputTransparentViewContainer; protected StateViewContainer IsEnabledStateViewContainer { get; private set; } protected StackLayout Layout { get; private set; } internal CoreGalleryPage () { Layout = new StackLayout { Padding = new Thickness (20) }; var modalDismissButton = new Button () { Text = "Dismiss Page", Command = new Command (async () => await Navigation.PopModalAsync ()) }; Layout.Children.Add (modalDismissButton); Build (Layout); Content = new ScrollView { AutomationId = "GalleryScrollView", Content = Layout }; } protected virtual void InitializeElement (T element) {} protected virtual void Build (StackLayout stackLayout) { var isFocusedView = new T (); isFocusedView.SetValueCore (IsFocusedPropertyKey, true); var viewContainers = new[] { _isFocusedStateViewContainer = new StateViewContainer (Test.VisualElement.IsFocused, isFocusedView), _backgroundColorViewContainer = new ViewContainer (Test.VisualElement.BackgroundColor, new T { BackgroundColor = Color.Blue }), _focusStateViewContainer = new StateViewContainer (Test.VisualElement.Focus, new T ()), _gestureRecognizerEventViewContainer = new EventViewContainer (Test.View.GestureRecognizers, new T ()), _inputTransparentViewContainer = new LayeredViewContainer (Test.VisualElement.InputTransparent, new T { InputTransparent = true }), IsEnabledStateViewContainer = new StateViewContainer (Test.VisualElement.IsEnabled, new T { IsEnabled = true }), _focusedEventViewContainer = new EventViewContainer (Test.VisualElement.Focused, new T ()), _unfocusedEventViewContainer = new EventViewContainer (Test.VisualElement.Unfocused, new T ()), _isVisibleStateViewContainer = new StateViewContainer (Test.VisualElement.IsVisible, new T { IsVisible = true }), _opacityViewContainer = new ViewContainer (Test.VisualElement.Opacity, new T { Opacity = 0.5 }), _rotationViewContainer = new ViewContainer (Test.VisualElement.Rotation, new T { Rotation = 10 }), _rotationXViewContainer = new ViewContainer (Test.VisualElement.RotationX, new T { RotationX = 33 }), _rotationYViewContainer = new ViewContainer (Test.VisualElement.RotationY, new T { RotationY = 10 }), _scaleViewContainer = new ViewContainer (Test.VisualElement.Scale, new T { Scale = 0.5 }), _translationXViewContainer = new ViewContainer (Test.VisualElement.TranslationX, new T { TranslationX = 30 }), _translationYViewContainer = new ViewContainer (Test.VisualElement.TranslationY, new T { TranslationY = 30 }), }; // Set state IsEnabledStateViewContainer.StateChangeButton.Command = new Command (() => { IsEnabledStateViewContainer.View.IsEnabled = !IsEnabledStateViewContainer.View.IsEnabled; }); _isVisibleStateViewContainer.StateChangeButton.Command = new Command (() => { _isVisibleStateViewContainer.View.IsVisible = !_isVisibleStateViewContainer.View.IsVisible; }); _focusStateViewContainer.StateChangeButton.Command = new Command (() => { if (_focusStateViewContainer.View.IsFocused) { _focusStateViewContainer.View.Unfocus (); } else { _focusStateViewContainer.View.Focus (); } }); _focusedEventViewContainer.View.Focused += (sender, args) => _focusedEventViewContainer.EventFired (); _unfocusedEventViewContainer.View.Unfocused += (sender, args) => _unfocusedEventViewContainer.EventFired (); _gestureRecognizerEventViewContainer.View.GestureRecognizers.Add ( new TapGestureRecognizer { Command = new Command (() => _gestureRecognizerEventViewContainer.EventFired ()) } ); _views = new List (viewContainers.Select (o => o.ContainerLayout)); _moveNextStack = new StackLayout (); var moveNextButton = new Button (); moveNextButton.Text = "Move Next"; moveNextButton.AutomationId = "MoveNextButton"; moveNextButton.Clicked += delegate (object sender, EventArgs e) { if (!_views.Any ()) return; if (_currentIndex + 1 >= _views.Count) { return; } _currentIndex += 1; _moveNextStack.Children.RemoveAt (2); _moveNextStack.Children.Add (_views[_currentIndex]); _picker.SelectedIndexChanged -= PickerSelectedIndexChanged; _picker.SelectedIndex = _currentIndex; _picker.SelectedIndexChanged += PickerSelectedIndexChanged; }; _picker = new Picker(); foreach (var container in viewContainers) { _picker.Items.Add(container.TitleLabel.Text); } _picker.SelectedIndex = _currentIndex; _picker.SelectedIndexChanged += PickerSelectedIndexChanged; _moveNextStack.Children.Add (_picker); _moveNextStack.Children.Add (moveNextButton); _moveNextStack.Children.Add (_views[_currentIndex]); stackLayout.Children.Add (_moveNextStack); if (!SupportsFocus) { stackLayout.Children.Remove (_focusStateViewContainer.ContainerLayout); stackLayout.Children.Remove (_isFocusedStateViewContainer.ContainerLayout); } if (!SupportsTapGestureRecognizer) stackLayout.Children.Remove (_gestureRecognizerEventViewContainer.ContainerLayout); foreach (var element in viewContainers) InitializeElement (element.View); } void PickerSelectedIndexChanged (object sender, EventArgs eventArgs) { _currentIndex = _picker.SelectedIndex; _moveNextStack.Children.RemoveAt (2); _moveNextStack.Children.Add (_views[_currentIndex]); } protected virtual bool SupportsTapGestureRecognizer { get { return true; } } protected virtual bool SupportsFocus { get { return true; } } protected void Add (ViewContainer view) { _views.Add (view.ContainerLayout); _picker.Items.Add(view.TitleLabel.Text); } } }