{"id":687,"date":"2014-08-10T23:58:17","date_gmt":"2014-08-10T21:58:17","guid":{"rendered":"http:\/\/dev.bratched.fr\/fr\/?p=687"},"modified":"2014-08-10T23:58:17","modified_gmt":"2014-08-10T21:58:17","slug":"pinch-to-zoom-avec-windows-et-windows-phone-8-1","status":"publish","type":"post","link":"https:\/\/bratched.com\/fr\/2014\/08\/10\/pinch-to-zoom-avec-windows-et-windows-phone-8-1\/","title":{"rendered":"Pinch to Zoom avec Windows et Windows Phone 8.1"},"content":{"rendered":"<h1>Comment rendre une image zoomable?<\/h1>\n<p>Pour l&rsquo;application Infografx, j&rsquo;ai eu besoin de g\u00e9rer le zoom d&rsquo;un graphique \u00e0 travers un \u00ab\u00a0pinch to\u00a0zoom\u00a0\u00bb<\/p>\n<p><a href=\"http:\/\/dev.bratched.fr\/fr\/wp-content\/uploads\/sites\/2\/2014\/08\/Zoom-Gesture.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-688\" src=\"http:\/\/dev.bratched.fr\/fr\/wp-content\/uploads\/sites\/2\/2014\/08\/Zoom-Gesture.png\" alt=\"Zoom-Gesture\" width=\"227\" height=\"225\" srcset=\"https:\/\/bratched.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/08\/Zoom-Gesture.png 227w, https:\/\/bratched.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/08\/Zoom-Gesture-150x150.png 150w\" sizes=\"(max-width: 227px) 100vw, 227px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Lors de l&rsquo;utilisation d&rsquo;une image, l&rsquo;utilisateur doit pouvoir zoomer et se d\u00e9placer dans le Zoom.<\/p>\n<p>Mon premier r\u00e9flex a \u00e9t\u00e9 de coder l&rsquo;utilisation de se zoom et du scale \u00e0 partir des \u00e9venements de manipulation. Et puis comme j&rsquo;\u00e9tais dans un mod\u00e8le M-V-VM j&rsquo;ai m\u00eame utilis\u00e9 un behavior pour rendre le code plus propre.<\/p>\n<p>Tout cel\u00e0 pour rien, car il existe une mani\u00e8re bien plus simple et bien plus efficace&#8230;<\/p>\n<h1>Avant<\/h1>\n<p>Avant, il fallait coder les\u00a0gestes de l&rsquo;utilisateur\u00a0intervenant sur l&rsquo;image.<\/p>\n<p>Voici un exemple de code qui fait intervenir 2 \u00e9v\u00e8nements sur le contr\u00f4le ManipulationStart et ManipulationDelta.<\/p>\n<pre class=\"lang:default decode:true \">    private void image_OnManipulationDelta(object sender, ManipulationDeltaEventArgs e)\n    {\n        var transform = (CompositeTransform)image.RenderTransform;\n\n        \/\/ pan\n        transform.TranslateX = _translationX + e.CumulativeManipulation.Translation.X;\n        transform.TranslateY = _translationY + e.CumulativeManipulation.Translation.Y;\n\n        \/\/ zoom\n        if (e.PinchManipulation != null)\n        {\n            transform.CenterX = e.PinchManipulation.Original.Center.X;\n            transform.CenterY = e.PinchManipulation.Original.Center.Y;\n\n            transform.ScaleX = _scaleX * e.PinchManipulation.CumulativeScale;\n            transform.ScaleY = _scaleY * e.PinchManipulation.CumulativeScale;\n        }\n    }\n\n    private void image_OnManipulationStarted(object sender, ManipulationStartedEventArgs e)\n    {\n        \/\/ the user has started manipulating the screen, set starting points\n        var transform = (CompositeTransform)image.RenderTransform;\n        _scaleX = transform.ScaleX;\n        _scaleY = transform.ScaleY;\n        _translationX = transform.TranslateX;\n        _translationY = transform.TranslateY;\n    }<\/pre>\n<p>Le code est assez long, le r\u00e9sultat n&rsquo;est pas parfait car un peu rigide (pas de gestion de l&rsquo;inertie) et pas facile \u00e0 ins\u00e9rer dans un mod\u00e8le M-V-VM.<\/p>\n<p>Il existe un moyen pourtant bien plus simple.<\/p>\n<h1>Le ScrollViewer<\/h1>\n<p>Avec Windows 8 et les projets Windows Phone 8.1 (non Silverlight), le scrollviewer est enrichi d&rsquo;un Zoom.<\/p>\n<p>En Initialisant la propri\u00e9t\u00e9 ZoomMode avec \u00ab\u00a0Enabled\u00a0\u00bb, vous b\u00e9n\u00e9ficiez d&rsquo;un Pinch To Zoom sur n&rsquo;importe quel contenu du ScrollViewer<\/p>\n<p>D&rsquo;autres propri\u00e9t\u00e9s permettent \u00e9galement de param\u00e9trer votre zoom :<\/p>\n<ul>\n<li>MinZoomFactor : Pour fixer le zoom minimum (exemple 0.25)<\/li>\n<li>MaxZoomFactor : Pour fixer le zoom maximum (exemple 3.0)<\/li>\n<li>IsZoomInertiaEnabled : Pour g\u00e9rer l&rsquo;inertie du zoom (exemple false)<\/li>\n<\/ul>\n<p>Ce qui donne en XAML<\/p>\n<pre class=\"lang:default decode:true \"> &lt;ScrollViewer Width=\"Auto\" Height=\"Auto\" VerticalScrollBarVisibility=\"Visible\"\n                          HorizontalScrollBarVisibility=\"Visible\" Margin=\"4\"\n                          ZoomMode=\"Enabled\"                           \n                          MinZoomFactor=\"0.25\"\n                          MaxZoomFactor=\"3.0\"\n                          IsZoomInertiaEnabled=\"False\"\n                          &gt;\n                &lt;Grid VerticalAlignment=\"Top\" HorizontalAlignment=\"Left\"\n                       &gt;\n...\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Et voil\u00e0!\u00a0En\u00a0quelques lignes de code XAML\u00a0le tour est jou\u00e9. vous avez un zoom parfait, sans code \u00e0 maintenir et 100% M-V-VM.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Comment rendre une image zoomable? Pour l&rsquo;application Infografx, j&rsquo;ai eu besoin de g\u00e9rer le zoom d&rsquo;un graphique \u00e0 travers un \u00ab\u00a0pinch to\u00a0zoom\u00a0\u00bb &nbsp; Lors de l&rsquo;utilisation d&rsquo;une image, l&rsquo;utilisateur doit pouvoir zoomer et se d\u00e9placer dans le Zoom. Mon premier r\u00e9flex a \u00e9t\u00e9 de coder l&rsquo;utilisation de se zoom et du scale \u00e0 partir des [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[59,62,63],"tags":[4,88,89,58,90,8,91],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/posts\/687"}],"collection":[{"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/comments?post=687"}],"version-history":[{"count":0,"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/posts\/687\/revisions"}],"wp:attachment":[{"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/media?parent=687"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/categories?post=687"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/tags?post=687"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}