<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0">
  <channel>
    <title>Nikolay Nedev's blog</title>
    <description>Nikolay Nedev's blog</description>
    <link>http://blogs.telerik.com/NikolayNedev/Posts.aspx</link>
    <docs>http://backend.userland.com/rss</docs>
    <item>
      <title>Silverlight 2.0 Custom Scroll Viewer with Mouse Wheel</title>
      <description>In this blog post i will demonstrate how to customize Scroll Viewer and enable the mouse wheel functionality. I would be using the mix08 controls for&amp;nbsp; silverlight 2.0. they are&amp;nbsp; free and with open license.&lt;br /&gt;
&lt;br /&gt;
Before start please download &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=ea93dd89-3af2-4acb-9cf4-bfe01b3f02d4&amp;amp;DisplayLang=en"&gt;Mix08 Controls&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
1. Extract them and then open MixControls, after that see generic.xaml file, and open it. Find and copy the ScrollViewer style, it should be something like:&lt;br /&gt;
&lt;br /&gt;
&lt;style type="text/css"&gt;
    .cf { font-family: Courier New; font-size: 10pt; color: black; background: white; }
    .cl { margin: 0px; }
    .cln { color: #2b91af; }
    .cb1 { color: #a31515; }
    .cb2 { color: blue; }
    .cb3 { color: red; }
    .cb4 { color: green; }
&lt;/style&gt;
&lt;div class="cf"&gt;
&lt;p class="cl"&gt;&lt;span class="cln"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="cb2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb1"&gt;Style&lt;/span&gt; &lt;span class="cb3"&gt;x&lt;/span&gt;&lt;span class="cb2"&gt;:&lt;/span&gt;&lt;span class="cb3"&gt;Key&lt;/span&gt;&lt;span class="cb2"&gt;="ScrollBarStyle"&lt;/span&gt;&lt;span class="cb3"&gt; TargetType&lt;/span&gt;&lt;span class="cb2"&gt;="ScrollBar"&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="cl"&gt;&lt;span class="cln"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;span class="cb1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="cb4"&gt;&amp;lt;!-- Any other properties you want to set --&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="cl"&gt;&lt;span class="cln"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;span class="cb1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="cb2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb1"&gt;Setter&lt;/span&gt;&lt;span class="cb3"&gt; Property&lt;/span&gt;&lt;span class="cb2"&gt;="Template"&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Open your Silverlight project in VS 2008, and go to App.xaml and paste in the &amp;lt;Application.Resources&amp;gt; the style for the scroll viewer. You would end up with something like:&lt;br /&gt;
&lt;br /&gt;
&lt;style type="text/css"&gt;
    .cf { font-family: Courier New; font-size: 10pt; color: black; background: white; }
    .cl { margin: 0px; }
    .cln { color: #2b91af; }
    .cb1 { color: blue; }
    .cb2 { color: #a31515; }
    .cb3 { color: red; }
&lt;/style&gt;
&lt;div class="cf"&gt;
&lt;p class="cl"&gt;&lt;span class="cln"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span class="cb1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb2"&gt;Application&lt;/span&gt;&lt;span class="cb3"&gt; xmlns&lt;/span&gt;&lt;span class="cb1"&gt;="http://schemas.microsoft.com/client/2007"&lt;/span&gt;&lt;/p&gt;
&lt;p class="cl"&gt;&lt;span class="cln"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb3"&gt;xmlns&lt;/span&gt;&lt;span class="cb1"&gt;:&lt;/span&gt;&lt;span class="cb3"&gt;x&lt;/span&gt;&lt;span class="cb1"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt; &lt;/p&gt;
&lt;p class="cl"&gt;&lt;span class="cln"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb3"&gt;x&lt;/span&gt;&lt;span class="cb1"&gt;:&lt;/span&gt;&lt;span class="cb3"&gt;Class&lt;/span&gt;&lt;span class="cb1"&gt;="SilverlightApplication5.App"&lt;/span&gt;&lt;/p&gt;
&lt;p class="cl"&gt;&lt;span class="cln"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="cl"&gt;&lt;span class="cln"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;span class="cb2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="cb1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb2"&gt;Application.Resources&lt;/span&gt;&lt;span class="cb1"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="cl"&gt;&lt;span class="cln"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;lt;!-- Paste Here --&amp;gt;&lt;/p&gt;
&lt;p class="cl"&gt;&lt;span class="cln"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;span class="cb2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="cb1"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="cb2"&gt;Application.Resources&lt;/span&gt;&lt;span class="cb1"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="cl"&gt;&lt;span class="cln"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span class="cb1"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="cb2"&gt;Application&lt;/span&gt;&lt;span class="cb1"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;br /&gt;
3.Switch back to the MixControls project and do the same for ScrollBar Style and paste it in the same place.&lt;br /&gt;
&lt;br /&gt;
&lt;style type="text/css"&gt;
    .cf { font-family: Courier New; font-size: 10pt; color: black; background: white; }
    .cl { margin: 0px; }
    .cln { color: #2b91af; }
    .cb1 { color: green; }
    .cb2 { color: #a31515; }
    .cb3 { color: blue; }
    .cb4 { color: red; }
&lt;/style&gt;
&lt;div class="cf"&gt;
&lt;p class="cl"&gt;&lt;span class="cln"&gt;&amp;nbsp;&lt;/span&gt; &lt;span class="cb1"&gt;&amp;lt;!-- Default style for System.Windows.Controls.Primitives.ScrollBar --&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="cl"&gt;&lt;span class="cln"&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;span class="cb2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="cb3"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb2"&gt;Style&lt;/span&gt;&lt;span class="cb4"&gt; TargetType&lt;/span&gt;&lt;span class="cb3"&gt;="ScrollBar"&amp;gt;&lt;/span&gt;&lt;span class="cb2"&gt; &lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;br /&gt;
4. Next step is to define resource keys for ScrollBar and ScrollViewer styles, and set them to ScrollBar key as Style in Scroll Viewer for VerticalScrollBarElement and HorizontalScrollBarElement.&lt;br /&gt;
&lt;br /&gt;
&lt;style type="text/css"&gt;
    .cf { font-family: Courier New; font-size: 10pt; color: black; background: white; }
    .cl { margin: 0px; }
    .cln { color: #2b91af; }
    .cb1 { color: #a31515; }
    .cb2 { color: blue; }
    .cb3 { color: red; }
&lt;/style&gt;
&lt;div class="cf"&gt;
&lt;p class="cl"&gt;&lt;span class="cln"&gt;&amp;nbsp; &lt;/span&gt;&lt;span class="cb2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb1"&gt;Style&lt;/span&gt; &lt;span class="cb3"&gt;x&lt;/span&gt;&lt;span class="cb2"&gt;:&lt;/span&gt;&lt;span class="cb3"&gt;Key&lt;/span&gt;&lt;span class="cb2"&gt;="ScrollBarStyle"&lt;/span&gt;&lt;span class="cb3"&gt; TargetType&lt;/span&gt;&lt;span class="cb2"&gt;="ScrollBar"&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;style type="text/css"&gt;
    .cf { font-family: Courier New; font-size: 10pt; color: black; background: white; }
    .cl { margin: 0px; }
    .cln { color: #2b91af; }
    .cb1 { color: blue; }
    .cb2 { color: #a31515; }
    .cb3 { color: red; }
&lt;/style&gt;
&lt;div class="cf"&gt;
&lt;p class="cl"&gt;&lt;span class="cln"&gt;&amp;nbsp; &lt;/span&gt;&lt;span class="cb1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb2"&gt;Style&lt;/span&gt;&lt;span class="cb3"&gt; x&lt;/span&gt;&lt;span class="cb1"&gt;:&lt;/span&gt;&lt;span class="cb3"&gt;Key&lt;/span&gt;&lt;span class="cb1"&gt;="ScrollViewerStyle"&lt;/span&gt;&lt;span class="cb3"&gt; TargetType&lt;/span&gt;&lt;span class="cb1"&gt;="ScrollViewer"&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;style type="text/css"&gt;
    .cf { font-family: Courier New; font-size: 10pt; color: black; background: white; }
    .cl { margin: 0px; }
    .cln { color: #2b91af; }
    .cb1 { color: red; }
    .cb2 { color: blue; }
    .cb3 { color: #a31515; }
&lt;/style&gt;
&lt;div class="cf"&gt;
&lt;p class="cl"&gt;&lt;span class="cln"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="cb1"&gt;Style&lt;/span&gt;&lt;span class="cb2"&gt;="{&lt;/span&gt;&lt;span class="cb3"&gt;StaticResource&lt;/span&gt;&lt;span class="cb1"&gt; ScrollBarStyle&lt;/span&gt;&lt;span class="cb2"&gt;}"&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;/p&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
5. Open the file where you define ScrollViewer and assign it style.&lt;br /&gt;
&lt;br /&gt;
&lt;style type="text/css"&gt;
    .cf { font-family: Courier New; font-size: 10pt; color: black; background: white; }
    .cl { margin: 0px; }
    .cln { color: #2b91af; }
    .cb1 { color: blue; }
    .cb2 { color: #a31515; }
    .cb3 { color: red; }
&lt;/style&gt;
&lt;div class="cf"&gt;
&lt;p class="cl"&gt;&lt;span class="cln"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="cb1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb2"&gt;ScrollViewer&lt;/span&gt;&lt;span class="cb3"&gt; Width&lt;/span&gt;&lt;span class="cb1"&gt;="400"&lt;/span&gt;&lt;span class="cb3"&gt; Height&lt;/span&gt;&lt;span class="cb1"&gt;="500"&lt;/span&gt;&lt;span class="cb3"&gt; x&lt;/span&gt;&lt;span class="cb1"&gt;:&lt;/span&gt;&lt;span class="cb3"&gt;Name&lt;/span&gt;&lt;span class="cb1"&gt;="CustomScrollViewer"&lt;/span&gt;&lt;span class="cb3"&gt; Style&lt;/span&gt;&lt;span class="cb1"&gt;="{&lt;/span&gt;&lt;span class="cb2"&gt;StaticResource&lt;/span&gt;&lt;span class="cb3"&gt; ScrollViewerStyle&lt;/span&gt;&lt;span class="cb1"&gt;}" &amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
6. Now it's time to customize our ScrollBar. Main elements which we can modify in the skin are VerticalThumbTemplate, HorizontalThumbTemplate, HorizontalIncrementTemplate, VerticalIncrementTemplate, HorizontalDecrementTemplate, VerticalDecrementTemplate, HorizontalRootElement, VerticalRootElement. Just change the colors of the brushes. But you could change elements like "Rectangle" and put other animations as well.&lt;br /&gt;
&lt;br /&gt;
7. After the changes you can see my theme for ScrollBar &lt;br /&gt;
&lt;br /&gt;
&lt;img src="/Photos/Storage/nedev/custom.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
7. Now it's time to define Mouse Wheel for ScrollViewer,&amp;nbsp; I have used the idea from &lt;a href="http://www.wintellect.com/cs/blogs/jprosise/archive/2008/03/18/mousewheel-zooms-in-silverlight-2-0.aspx"&gt;Jeff Prosise's Blog blog&lt;/a&gt; post. What I do here is check if either end of the scrollable area has been reached. Also the wheel affects the horizontal ScrollBar if the vertical is hidden.&lt;br /&gt;
&lt;br /&gt;
&lt;style type="text/css"&gt;
    .cf { font-family: Courier New; font-size: 10pt; color: black; background: white; }
    .cl { margin: 0px; }
    .cb1 { color: blue; }
    .cb2 { color: #2b91af; }
&lt;/style&gt;
&lt;div class="cf"&gt;
&lt;p class="cl"&gt;&lt;span class="cb1"&gt;if&lt;/span&gt; (CustomScrollViewer.ComputedVerticalScrollBarVisibility == &lt;span class="cb2"&gt;Visibility&lt;/span&gt;.Visible)&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;if&lt;/span&gt; (CustomScrollViewer.ScrollableHeight &amp;lt; &lt;span class="cb1"&gt;this&lt;/span&gt;.Offset)&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;this&lt;/span&gt;.Offset = CustomScrollViewer.ScrollableHeight;&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;else&lt;/span&gt; &lt;span class="cb1"&gt;if&lt;/span&gt; (&lt;span class="cb1"&gt;this&lt;/span&gt;.Offset &amp;lt; 0)&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;this&lt;/span&gt;.Offset = 0;&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; CustomScrollViewer.ScrollToVerticalOffset(&lt;span class="cb1"&gt;this&lt;/span&gt;.Offset);&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp; }&lt;/p&gt;
&lt;br /&gt;
&lt;p class="cl"&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;p class="cl"&gt;&lt;/p&gt;
&lt;p class="cl"&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p class="cl"&gt;8. Here is an &lt;a href="/photos/storage/nedev/scrollviewer/TestPage.html"&gt;example&lt;/a&gt; and of cource the &lt;a href="/photos/storage/nedev/scrollviewer/CustomScrollViewer.zip"&gt;source code&lt;/a&gt;.&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &lt;br /&gt;
</description>
      <link>http://blogs.telerik.com/NikolayNedev/Posts/08-04-18/Silverlight_2_0_Custom_Scroll_Viewer_with_Mouse_Wheel.aspx</link>
      <author>Nikolay Nedev</author>
      <comments>http://blogs.telerik.com/NikolayNedev/Posts/08-04-18/Silverlight_2_0_Custom_Scroll_Viewer_with_Mouse_Wheel.aspx</comments>
      <guid isPermaLink="false">f374807a-bcf6-4d80-8a36-d357ad7961ca</guid>
      <pubDate>Fri, 18 Apr 2008 08:08:00 GMT</pubDate>
    </item>
  </channel>
</rss>