{"id":5053,"date":"2007-12-05T04:08:00","date_gmt":"2007-12-05T04:08:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/vbteam\/2007\/12\/05\/silverlight-ux-musings-providing-panning-functionality-for-a-canvas-of-objects-part-2-corrina-barber\/"},"modified":"2024-07-05T14:37:18","modified_gmt":"2024-07-05T21:37:18","slug":"silverlight-ux-musings-providing-panning-functionality-for-a-canvas-of-objects-part-2-corrina-barber","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/vbteam\/silverlight-ux-musings-providing-panning-functionality-for-a-canvas-of-objects-part-2-corrina-barber\/","title":{"rendered":"Silverlight Ux Musings: Providing Panning Functionality for a Canvas of Objects &#8211; Part 2 [Corrina Barber]"},"content":{"rendered":"<p><span><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\"><span>I&rsquo;m back with part 2 of the blog on panning functionality (<a class=\"\" href=\"http:\/\/blogs.msdn.com\/vbteam\/archive\/2007\/12\/03\/silverlight-ux-musings-providing-panning-functionality-for-a-canvas-of-objects-corrina-barber.aspx\">part 1 is here<\/a>), and, to quickly recap, w<\/span><span>e&rsquo;re creating a region in a web site that can be panned rather than scrolled (users can click and drag to pan and navigate the region). We&rsquo;re also designing the region so images always align properly (no images clip when the user finishes panning).<img decoding=\"async\" height=\"416\" hspace=\"10\" src=\"https:\/\/devblogs.microsoft.com\/vbteam\/wp-content\/uploads\/sites\/7\/2007\/12\/1.jpg\" width=\"560\" align=\"right\" vspace=\"6\"><\/p>\n<p><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">I have a sample solution that looks like my design goal pictured at right that can be downloaded <a class=\"\" href=\"http:\/\/cid-41ea2b2f3f18c5d6.skydrive.live.com\/self.aspx\/Public\/Images\/Blog_December\/Day1\/VB_Silverlight_Blog_Pan_End.zip\">here<\/a> or you can simply <a class=\"\" href=\"http:\/\/www.brad_abrams.members.winisp.net\/Projects\/CorrinaVBSilverlightExample\/testpage.html\">check it out online here<\/a>. Please note that the UI in this solution has many buttons and features that are disabled because my primary focus was to provide code for the panning functionality.<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/span><span><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>Necessities<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">More detailed information can be found on the <\/font><\/span><a href=\"http:\/\/silverlight.net\/GetStarted\/\"><span><font face=\"Calibri\">Silverlight.NET site<\/font><\/span><\/a><span><\/p>\n<p><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>&sect;<span>&nbsp; <\/span><\/span><\/span><span>Microsoft Silverlight 1.1 Alpha September Refresh<span><\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>&sect;<span>&nbsp; <\/span><\/span><\/span><span>Visual Studio 2008<span><\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>&sect;<span>&nbsp; <\/span><\/span><\/span><span>Microsoft Silverlight Tools Alpha Refresh for Visual Studio 2008 Beta 2 (July 2007)<span><\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>&sect;<span>&nbsp; <\/span><\/span><\/span><span>Expression Blend 2 September Preview<\/span><\/p>\n<p class=\"MsoNormal\"><span>Details: Visual Studio (xaml)<span><\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoListParagraph\"><span>Open the solution created in part 1 (<a class=\"\" href=\"http:\/\/cid-41ea2b2f3f18c5d6.skydrive.live.com\/self.aspx\/Public\/WireFrame_PanningProject%7C5to_Blend%7C6.zip\">a copy can be found here<\/a>). Again, this is a <a class=\"\" href=\"http:\/\/en.wikipedia.org\/wiki\/Website_wireframe\">wireframe<\/a> version of only the panning region; not the full fidelity UI pictured above. The first thing we need to do is to make a few modifications to Page.xaml.<\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span>Open Page.xaml and find the canvas named &lsquo;allImgs&rsquo;. Right below the opening tag add the following clipping path xaml. This clipping path is sized the same as the parent canvas (remember, we planned to use the height and width of this canvas as defined in Blend as a guide when creating the clipping path in Visual Studio)<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span>&lt;<\/span><span>Canvas.Clip<\/span><span>&gt;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&lt;<\/span><span>RectangleGeometry<\/span><span> <\/span><span>Rect<\/span><span>=<\/span><span>&#8220;<span>0,0,264,356<\/span>&#8220;<span>&gt;&lt;\/<\/span><span>RectangleGeometry<\/span><span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span>&lt;\/<\/span><span>Canvas.Clip<\/span><span>&gt;<\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>2.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span>Locate the &lsquo;allImgsRectangle&rsquo; and add an opacity attribute and set it to 0. Remember, we want to only show this rectangle when the mouse is in the panning region (we could have done this in Blend too ;)).<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&lt;<\/span><span>Rectangle<\/span><span> <\/span><span>Width<\/span><span>=<\/span><span>&#8220;<span>280<\/span>&#8220;<span> <\/span><span>Height<\/span><span>=<\/span>&#8220;<span>372<\/span>&#8220;<span> <\/span><span>Stroke<\/span><span>=<\/span>&#8220;<span>#FF000000<\/span>&#8220;<span> <\/span><span>Canvas.Left<\/span><span>=<\/span>&#8220;<span>12<\/span>&#8220;<span> <\/span><span>Canvas.Top<\/span><span>=<\/span>&#8220;<span>12<\/span>&#8220;<span> <\/span><span>x:Name<\/span><span>=<\/span>&#8220;<span>allImgsRectangle<\/span>&#8220;<span> <\/span>Opacity<\/span><span>=<\/span><span>&#8220;<span>0<\/span>&#8220;<\/span><span>\/&gt;<\/span><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>3.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span>Locate the &lsquo;allImgsCanvas&rsquo; and then locate the &lt;Canvas.RenderTransform&gt; tag for the canvas (it should be right below the opening tag).<span>&nbsp; <\/span>Add an x:Name attribute to &lt;TranslateTransform.. and name it &lsquo;allImgsTransform&rsquo;. This will allow us to control the transform values from code.<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&lt;<\/span><span>Canvas.RenderTransform<\/span><span>&gt;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&lt;<\/span><span>TransformGroup<\/span><span>&gt;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&lt;<\/span><span>ScaleTransform<\/span><span> <\/span><span>ScaleX<\/span><span>=<\/span><span>&#8220;<span>1<\/span>&#8220;<span> <\/span><span>ScaleY<\/span><span>=<\/span>&#8220;<span>1<\/span>&#8220;<span>\/&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&lt;<\/span><span>SkewTransform<\/span><span> <\/span><span>AngleX<\/span><span>=<\/span><span>&#8220;<span>0<\/span>&#8220;<span> <\/span><span>AngleY<\/span><span>=<\/span>&#8220;<span>0<\/span>&#8220;<span>\/&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&lt;<\/span><span>RotateTransform<\/span><span> <\/span><span>Angle<\/span><span>=<\/span><span>&#8220;<span>0<\/span>&#8220;<span>\/&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&lt;<\/span><span>TranslateTransform<\/span><span> <\/span><span>x:Name<\/span><span>=<\/span><span>&#8220;<span>allImgsTransform<\/span>&#8220;<\/span><span> <\/span><span>X<\/span><span>=<\/span><span>&#8220;<span>0<\/span>&#8220;<span> <\/span><span>Y<\/span><span>=<\/span>&#8220;<span>0<\/span>&#8220;<span>\/&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&lt;\/<\/span><span>TransformGroup<\/span><span>&gt;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&nbsp;&nbsp; <\/span><span>&nbsp;<\/span>&lt;\/<\/span><span>Canvas.RenderTransform<\/span><span>&gt;<\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>4.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span>Locate the &lsquo;allImgsPan&rsquo; storyboard (it should be at the very top of the page), and then locate the two &lt;DoubleAnimationUsingKeyframe&gt; tags that apply to the TranslateTransform X and Y values. Add x:Name attributes to both child &lt;ChildDoubleKeyFrame&gt; tags as shown below.<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&nbsp;&nbsp;&nbsp; <\/span>&lt;<\/span><span>Canvas.Resources<\/span><span>&gt;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&lt;<\/span><span>Storyboard<\/span><span> <\/span><span>x:Name<\/span><span>=<\/span><span>&#8220;<span>allImgsPan<\/span>&#8220;<span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>&lt;<\/span><span>DoubleAnimationUsingKeyFrames<\/span><span> <\/span><span>BeginTime<\/span><span>=<\/span><span>&#8220;<span>00:00:00<\/span>&#8220;<span> <\/span><span>Storyboard.TargetName<\/span><span>=<\/span>&#8220;<span>allImgsCanvas<\/span>&#8220;<span> <\/span><span>Storyboard.TargetProperty<\/span><span>=<\/span>&#8220;<span>(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)<\/span>&#8220;<span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>&lt;<\/span><span>SplineDoubleKeyFrame<\/span><span> <\/span><span>KeyTime<\/span><span>=<\/span><span>&#8220;<span>00:00:00<\/span>&#8220;<span> <\/span><span>Value<\/span><span>=<\/span>&#8220;<span>1<\/span>&#8220;<span>\/&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>&lt;<\/span><span>SplineDoubleKeyFrame<\/span><span> <\/span><span>KeyTime<\/span><span>=<\/span><span>&#8220;<span>00:00:00.5000000<\/span>&#8220;<span> <\/span><span>Value<\/span><span>=<\/span>&#8220;<span>1.1<\/span>&#8220;<span>\/&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>&lt;<\/span><span>SplineDoubleKeyFrame<\/span><span> <\/span><span>KeyTime<\/span><span>=<\/span><span><\/span><\/p>\n<p><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I&rsquo;m back with part 2 of the blog on panning functionality (part 1 is here), and, to quickly recap, we&rsquo;re creating a region in a web site that can be panned rather than scrolled (users can click and drag to pan and navigate the region). We&rsquo;re also designing the region so images always align properly [&hellip;]<\/p>\n","protected":false},"author":260,"featured_media":8818,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[192,195],"tags":[50,137],"class_list":["post-5053","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-featured","category-visual-basic","tag-corrina-barber","tag-silverlight"],"acf":[],"blog_post_summary":"<p>I&rsquo;m back with part 2 of the blog on panning functionality (part 1 is here), and, to quickly recap, we&rsquo;re creating a region in a web site that can be panned rather than scrolled (users can click and drag to pan and navigate the region). We&rsquo;re also designing the region so images always align properly [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/posts\/5053","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/users\/260"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/comments?post=5053"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/posts\/5053\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/media\/8818"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/media?parent=5053"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/categories?post=5053"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/tags?post=5053"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}