protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Frame> e)
        {
            base.OnElementChanged (e);

            if (e.NewElement != null) {
                _frame = e.NewElement as GesturedFrame;

                if (_frame.HasSwipeRightToLeft)
                    NativeView.AddGestureRecognizer (new UISwipeGestureRecognizer (g => _frame.DoSwipeRightToLeft ()) { Direction = UISwipeGestureRecognizerDirection.Left });

                if (_frame.HasSwipeLeftToRight)
                    NativeView.AddGestureRecognizer (new UISwipeGestureRecognizer (g => _frame.DoSwipeLeftToRight ()) { Direction = UISwipeGestureRecognizerDirection.Right });

                if (_frame.HasSwipeBottomToTop)
                    NativeView.AddGestureRecognizer (new UISwipeGestureRecognizer (g => _frame.DoSwipeBottomToTop ()) { Direction = UISwipeGestureRecognizerDirection.Up });

                if (_frame.HasSwipeTopToBottom)
                    NativeView.AddGestureRecognizer (new UISwipeGestureRecognizer (g => _frame.DoSwipeTopToBottom ()) { Direction = UISwipeGestureRecognizerDirection.Down });

                if (_frame.HasTap)
                    NativeView.AddGestureRecognizer (new UITapGestureRecognizer (g => _frame.DoTap ()) { NumberOfTapsRequired = 1 });

                if (_frame.HasLongTap)
                    NativeView.AddGestureRecognizer (new UILongPressGestureRecognizer (g => _frame.DoLongTap ()));
            }
        }
        protected override void OnElementChanged(ElementChangedEventArgs<Frame> e)
        {
            base.OnElementChanged (e);

            _frame = e.NewElement as GesturedFrame;
            _gestureDetector = new GestureDetector (new InternalGestureCapture (_frame));

            this.ChildViewAdded += (object sender, ChildViewAddedEventArgs e2) => {
                e2.Child.Touch += (object sender2, TouchEventArgs e3) => _gestureDetector.OnTouchEvent (e3.Event);
            };
        }
		public GestureFrameDemoPage ()
		{
			Title = "Coded Gesture Control";

			// Setup the Gesture Area
			GesturedFrame gestureArea = new GesturedFrame() { HeightRequest = 300 };

			var boxAnimLayout = new AbsoluteLayout () { BackgroundColor = Color.FromHex ("FCFCFC") };

			mainBox = new BoxView () { IsVisible = true, BackgroundColor = Color.Black };

			boxAnimLayout.Children.Add (mainBox, new Rectangle (currentLeft, currentTop, boxSize, boxSize));

			gestureArea.Content = boxAnimLayout;

			const int movementAmount = 75;

			gestureArea.OnSwipeLeftToRight += async (sender, args) => {
				log.Add("Swipe to Right");
				await MoveBox (movementAmount, 0);
			};
			gestureArea.OnSwipeRightToLeft += async (sender, args) => {
				log.Add("Swipe to Left");
				await MoveBox (-movementAmount, 0);
			};
			gestureArea.OnSwipeTopToBottom += async (sender, args) => {
				log.Add("Swipe to Bottom");
				await MoveBox (0, movementAmount);
			};
			gestureArea.OnSwipeBottomToTop += async (sender, args) => {
				log.Add("Swipe to Top");
				await MoveBox (0, -movementAmount);
			};
			gestureArea.OnTap += async (sender, args) => {
				log.Add("Tap");
				await ScaleBox (2);
			};
			gestureArea.OnLongTap += async (sender, args) => {
				log.Add("Long Press");
				await ScaleBox (1);
			};

			// Setup the Logger
	        var listView = new ListView
	        {
	            ItemsSource = log,
				ItemTemplate = new DataTemplate(typeof (TextCell))
	            {
	                Bindings =
	                {
	                    {TextCell.TextProperty, new Binding(".")},
	                }
	            }
			};

			RelativeLayout layout = new RelativeLayout ();
			layout.Children.Add (gestureArea, 
				Constraint.Constant (0),
				Constraint.Constant (0),
				Constraint.RelativeToParent (p => p.Width),
				Constraint.RelativeToParent (p => p.Height - 200));
			layout.Children.Add (listView, 
				Constraint.Constant (0),
				Constraint.RelativeToParent (p => p.Height - 200),
				Constraint.RelativeToParent (p => p.Width),
				Constraint.Constant(200));

			Content = layout;
		}