diff --git a/samples/ControlCatalog/MainView.xaml b/samples/ControlCatalog/MainView.xaml
index 4a5f5bc96c..9e0fb3f852 100644
--- a/samples/ControlCatalog/MainView.xaml
+++ b/samples/ControlCatalog/MainView.xaml
@@ -92,6 +92,9 @@
+
+
+
diff --git a/samples/ControlCatalog/Pages/GesturePage.cs b/samples/ControlCatalog/Pages/GesturePage.cs
new file mode 100644
index 0000000000..ee10f21317
--- /dev/null
+++ b/samples/ControlCatalog/Pages/GesturePage.cs
@@ -0,0 +1,212 @@
+using System;
+using System.Numerics;
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Input;
+using Avalonia.LogicalTree;
+using Avalonia.Markup.Xaml;
+using Avalonia.Rendering.Composition;
+
+namespace ControlCatalog.Pages
+{
+ public class GesturePage : UserControl
+ {
+ private bool _isInit;
+ private float _currentScale;
+
+ public GesturePage()
+ {
+ this.InitializeComponent();
+ }
+
+ private void InitializeComponent()
+ {
+ AvaloniaXamlLoader.Load(this);
+ }
+
+ protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
+ {
+ base.OnAttachedToVisualTree(e);
+
+ if(_isInit)
+ {
+ return;
+ }
+
+ _isInit = true;
+
+ SetPullHandlers(this.Find("TopPullZone"), false);
+ SetPullHandlers(this.Find("BottomPullZone"), true);
+ SetPullHandlers(this.Find("RightPullZone"), true);
+ SetPullHandlers(this.Find("LeftPullZone"), false);
+
+ var image = this.Find("PinchImage");
+ SetPinchHandlers(image);
+
+ var reset = this.Find