{"id":13679902,"url":"https://github.com/wieslawsoltes/PanAndZoom","last_synced_at":"2025-04-29T19:32:11.144Z","repository":{"id":47481778,"uuid":"51879362","full_name":"wieslawsoltes/PanAndZoom","owner":"wieslawsoltes","description":"Pan and zoom control for Avalonia.","archived":false,"fork":false,"pushed_at":"2024-07-22T20:47:49.000Z","size":272864,"stargazers_count":345,"open_issues_count":5,"forks_count":45,"subscribers_count":10,"default_branch":"master","last_synced_at":"2024-10-30T01:02:35.518Z","etag":null,"topics":["avalonia","avaloniaui","c-sharp","control","gui","multi-platform","pan","pan-and-zoom","xaml","zoom"],"latest_commit_sha":null,"homepage":"http://wieslawsoltes.github.io/PanAndZoom/","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wieslawsoltes.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.TXT","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["wieslawsoltes"]}},"created_at":"2016-02-16T23:49:29.000Z","updated_at":"2024-10-22T13:16:37.000Z","dependencies_parsed_at":"2024-06-16T18:57:36.492Z","dependency_job_id":"ffcc71e3-18e1-459c-b757-3b1be0920786","html_url":"https://github.com/wieslawsoltes/PanAndZoom","commit_stats":{"total_commits":722,"total_committers":5,"mean_commits":144.4,"dds":"0.32409972299168976","last_synced_commit":"60d1ca107a7b454ac5bcb32055cbedb38344cb23"},"previous_names":[],"tags_count":60,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wieslawsoltes%2FPanAndZoom","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wieslawsoltes%2FPanAndZoom/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wieslawsoltes%2FPanAndZoom/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wieslawsoltes%2FPanAndZoom/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wieslawsoltes","download_url":"https://codeload.github.com/wieslawsoltes/PanAndZoom/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251569550,"owners_count":21610575,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["avalonia","avaloniaui","c-sharp","control","gui","multi-platform","pan","pan-and-zoom","xaml","zoom"],"created_at":"2024-08-02T13:01:10.845Z","updated_at":"2025-04-29T19:32:09.279Z","avatar_url":"https://github.com/wieslawsoltes.png","language":"C#","funding_links":["https://github.com/sponsors/wieslawsoltes"],"categories":["C#","Libraries \u0026 Extensions"],"sub_categories":["Controls"],"readme":"# PanAndZoom\n\n[![Gitter](https://badges.gitter.im/wieslawsoltes/PanAndZoom.svg)](https://gitter.im/wieslawsoltes/PanAndZoom?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge)\n\n[![Build Status](https://dev.azure.com/wieslawsoltes/GitHub/_apis/build/status/wieslawsoltes.PanAndZoom?branchName=master)](https://dev.azure.com/wieslawsoltes/GitHub/_build/latest?definitionId=98\u0026branchName=master)\n[![CI](https://github.com/wieslawsoltes/PanAndZoom/actions/workflows/build.yml/badge.svg)](https://github.com/wieslawsoltes/PanAndZoom/actions/workflows/build.yml)\n\n[![NuGet](https://img.shields.io/nuget/v/Avalonia.Controls.PanAndZoom.svg)](https://www.nuget.org/packages/Avalonia.Controls.PanAndZoom)\n[![NuGet](https://img.shields.io/nuget/dt/Avalonia.Controls.PanAndZoom.svg)](https://www.nuget.org/packages/Avalonia.Controls.PanAndZoom)\n[![MyGet](https://img.shields.io/myget/panandzoom-nightly/vpre/Avalonia.Controls.PanAndZoom.svg?label=myget)](https://www.myget.org/gallery/panandzoom-nightly) \n\nPanAndZoom control for Avalonia\n\n\u003ca href='https://youtu.be/BFLF1WPZWCQ' target='_blank'\u003e![](images/PanAndZoom.png)\u003ca/\u003e\n\n## NuGet\n\nPanAndZoom is delivered as a NuGet package.\n\nYou can find the NuGet packages here for [Avalonia](https://www.nuget.org/packages/Avalonia.Controls.PanAndZoom/) or by using nightly build feed:\n* Add `https://www.myget.org/F/panandzoom-nightly/api/v2` to your package sources\n* Alternative nightly build feed `https://pkgs.dev.azure.com/wieslawsoltes/GitHub/_packaging/Nightly/nuget/v3/index.json`\n* Update your package using `PanAndZoom` feed\n\nYou can install the package for `Avalonia` based projects like this:\n\n`Install-Package Avalonia.Controls.PanAndZoom -Pre`\n\n### Package Sources\n\n* https://api.nuget.org/v3/index.json\n* https://www.myget.org/F/panandzoom-nightly/api/v2\n\n## Resources\n\n* [GitHub source code repository.](https://github.com/wieslawsoltes/PanAndZoom)\n\n## Using PanAndZoom\n\n`MainWindow.xaml`\n```XAML\n\u003cWindow x:Class=\"AvaloniaDemo.MainWindow\"\n        xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:paz=\"using:Avalonia.Controls.PanAndZoom\"\n        WindowStartupLocation=\"CenterScreen\" UseLayoutRounding=\"True\"\n        Title=\"PanAndZoom\" Height=\"640\" Width=\"640\"\u003e\n    \u003cGrid RowDefinitions=\"Auto,12,Auto,12,*,12\" ColumnDefinitions=\"50,*,50\"\u003e\n        \u003cStackPanel Orientation=\"Vertical\"\n                    HorizontalAlignment=\"Center\" Grid.Row=\"0\" Grid.Column=\"1\"\u003e\n            \u003cTextBlock Text=\"F - Fill\"/\u003e\n            \u003cTextBlock Text=\"U - Uniform\"/\u003e\n            \u003cTextBlock Text=\"R - Reset\"/\u003e\n            \u003cTextBlock Text=\"T - Toggle Stretch Mode\"/\u003e\n            \u003cTextBlock Text=\"Mouse Wheel - Zoom to Point\"/\u003e\n            \u003cTextBlock Text=\"Mouse Left Button Down - Pan\"/\u003e\n        \u003c/StackPanel\u003e\n        \u003cStackPanel Orientation=\"Horizontal\"\n                    HorizontalAlignment=\"Center\" Grid.Row=\"2\" Grid.Column=\"1\"\u003e\n            \u003cTextBlock Text=\"PanButton:\" VerticalAlignment=\"Center\"/\u003e\n            \u003cComboBox Items=\"{x:Static paz:ZoomBorder.ButtonNames}\"\n                      SelectedItem=\"{Binding #ZoomBorder.PanButton, Mode=TwoWay}\"\n                      Margin=\"2\"\u003e\n            \u003c/ComboBox\u003e\n            \u003cTextBlock Text=\"Stretch:\" VerticalAlignment=\"Center\"/\u003e\n            \u003cComboBox Items=\"{x:Static paz:ZoomBorder.StretchModes}\"\n                      SelectedItem=\"{Binding #ZoomBorder.Stretch, Mode=TwoWay}\"\n                      Margin=\"2\"\u003e\n            \u003c/ComboBox\u003e\n            \u003cTextBlock Text=\"ZoomSpeed:\" VerticalAlignment=\"Center\"/\u003e\n            \u003cTextBox Text=\"{Binding #ZoomBorder.ZoomSpeed, Mode=TwoWay}\"\n                     TextAlignment=\"Center\" Width=\"50\" Margin=\"2\"/\u003e\n            \u003cCheckBox IsChecked=\"{Binding #ZoomBorder.EnablePan}\"\n                      Content=\"EnablePan\" VerticalAlignment=\"Center\"/\u003e\n            \u003cCheckBox IsChecked=\"{Binding #ZoomBorder.EnableZoom}\"\n                      Content=\"EnableZoom\" VerticalAlignment=\"Center\"/\u003e\n        \u003c/StackPanel\u003e\n        \u003cScrollViewer Grid.Row=\"4\" Grid.Column=\"1\"\n                      VerticalScrollBarVisibility=\"Auto\"\n                      HorizontalScrollBarVisibility=\"Auto\"\u003e\n            \u003cpaz:ZoomBorder Name=\"ZoomBorder\" Stretch=\"None\" ZoomSpeed=\"1.2\"\n                            Background=\"SlateBlue\" ClipToBounds=\"True\" Focusable=\"True\"\n                            VerticalAlignment=\"Stretch\" HorizontalAlignment=\"Stretch\"\u003e\n                \u003cCanvas Background=\"LightGray\" Width=\"300\" Height=\"300\"\u003e\n                    \u003cRectangle Canvas.Left=\"100\" Canvas.Top=\"100\" Width=\"50\" Height=\"50\" Fill=\"Red\"/\u003e\n                    \u003cStackPanel Canvas.Left=\"100\" Canvas.Top=\"200\"\u003e\n                        \u003cTextBlock Text=\"Text1\" Width=\"100\" Background=\"Red\" Foreground=\"WhiteSmoke\"/\u003e\n                        \u003cTextBlock Text=\"Text2\" Width=\"100\" Background=\"Red\" Foreground=\"WhiteSmoke\"/\u003e\n                    \u003c/StackPanel\u003e\n                \u003c/Canvas\u003e\n            \u003c/paz:ZoomBorder\u003e  \n        \u003c/ScrollViewer\u003e\n    \u003c/Grid\u003e \n\u003c/Window\u003e\n```\n\n`MainWindow.xaml.cs`\n```C#\nusing System.Diagnostics;\nusing Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Controls.PanAndZoom;\nusing Avalonia.Input;\nusing Avalonia.Markup.Xaml;\n\nnamespace AvaloniaDemo\n{\n    public class MainWindow : Window\n    {\n        private readonly ZoomBorder? _zoomBorder;\n\n        public MainWindow()\n        {\n            this.InitializeComponent();\n            this.AttachDevTools();\n\n            _zoomBorder = this.Find\u003cZoomBorder\u003e(\"ZoomBorder\");\n            if (_zoomBorder != null)\n            {\n                _zoomBorder.KeyDown += ZoomBorder_KeyDown;\n                \n                _zoomBorder.ZoomChanged += ZoomBorder_ZoomChanged;\n            }\n        }\n\n        private void InitializeComponent()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n\n        private void ZoomBorder_KeyDown(object? sender, KeyEventArgs e)\n        {\n            switch (e.Key)\n            {\n                case Key.F:\n                    _zoomBorder?.Fill();\n                    break;\n                case Key.U:\n                    _zoomBorder?.Uniform();\n                    break;\n                case Key.R:\n                    _zoomBorder?.ResetMatrix();\n                    break;\n                case Key.T:\n                    _zoomBorder?.ToggleStretchMode();\n                    _zoomBorder?.AutoFit();\n                    break;\n            }\n        }\n\n        private void ZoomBorder_ZoomChanged(object sender, ZoomChangedEventArgs e)\n        {\n            Debug.WriteLine($\"[ZoomChanged] {e.ZoomX} {e.ZoomY} {e.OffsetX} {e.OffsetY}\");\n        }\n    }\n}\n```\n\n### Getting zoom ratio\n\nTo get current zoom ratio use `ZoomX` and `ZoomY` properties. \n\n### Getting pan offset\n\nTo get current pan offset use `OffsetX` and `OffsetY` properties. \n\n### Constrain zoom ratio\n\nTo constrain zoom ratio use `MinZoomX`, `MaxZoomX`, `MinZoomY` and `MaxZoomY` properties. \n\n### Constrain pan offset\n\nTo constrain pan offset use `MinOffsetX`, `MaxOffsetX`, `MinOffsetY` and `MaxOffsetY` properties. \n\n### Enable or disable constrains\n\nTo enable or disable constrains use `EnableConstrains` flag.\n\n## License\n\nPanAndZoom is licensed under the [MIT license](LICENSE.TXT).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwieslawsoltes%2FPanAndZoom","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwieslawsoltes%2FPanAndZoom","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwieslawsoltes%2FPanAndZoom/lists"}