La respuesta breve es "cambiar la plantilla de ScrollBar".
La respuesta larga es ... Que agregaría un ItemsControl en la plantilla del control ScrollBar. Pondría este ItemsControl en la parte superior de la plantilla con su IsHitTestVisible configurado en falso para que no capture los eventos del mouse.
Luego utilizaría un lienzo como ItemsPanelTemplate para poder colocar las manchas correctamente. Utilizaría el enlace de datos con la propiedad ItemsSource de ItemsControl y una DataTemplate para representar cada elemento con una imagen.
Aquí hay una muestra que hice usando Blend. Por supuesto, no está completo (no maneja el evento del mouse por ejemplo), pero espero que sea un punto de partida para ti.
alt text http://www.japf.fr/download/scrollbars.png
<ControlTemplate TargetType="{x:Type ScrollBar}">
<Grid SnapsToDevicePixels="true" Background="{TemplateBinding Background}">
<Grid.ColumnDefinitions>
<ColumnDefinition MaxWidth="{DynamicResource {x:Static SystemParameters.HorizontalScrollBarButtonWidthKey}}"/>
<ColumnDefinition Width="0.00001*"/>
<ColumnDefinition MaxWidth="{DynamicResource {x:Static SystemParameters.HorizontalScrollBarButtonWidthKey}}"/>
</Grid.ColumnDefinitions>
<RepeatButton Style="{StaticResource ScrollBarButton}" Command="{x:Static ScrollBar.LineLeftCommand}" Microsoft_Windows_Themes:ScrollChrome.ScrollGlyph="LeftArrow"/>
<Track x:Name="PART_Track" Grid.Column="1" d:IsHidden="True">
<Track.Thumb>
<Thumb Style="{StaticResource ScrollBarThumb}" Microsoft_Windows_Themes:ScrollChrome.ScrollGlyph="HorizontalGripper"/>
</Track.Thumb>
<Track.IncreaseRepeatButton>
<RepeatButton Style="{StaticResource HorizontalScrollBarPageButton}" Command="{x:Static ScrollBar.PageRightCommand}"/>
</Track.IncreaseRepeatButton>
<Track.DecreaseRepeatButton>
<RepeatButton Style="{StaticResource HorizontalScrollBarPageButton}" Command="{x:Static ScrollBar.PageLeftCommand}"/>
</Track.DecreaseRepeatButton>
</Track>
<ItemsControl Grid.Column="1" HorizontalAlignment="Stretch">
<sys:Double>10</sys:Double>
<sys:Double>50</sys:Double>
<sys:Double>100</sys:Double>
<sys:Double>140</sys:Double>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Rectangle Fill="Orange" Width="3" Height="16"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Canvas.Left" Value="{Binding }" />
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
<RepeatButton Style="{StaticResource ScrollBarButton}" Grid.Column="2" Command="{x:Static ScrollBar.LineRightCommand}" Microsoft_Windows_Themes:ScrollChrome.ScrollGlyph="RightArrow" d:IsHidden="True"/>
</Grid>
</ControlTemplate>
¿Cómo resolvió el problema al cambiar el tamaño de la barra de desplazamiento? Los marcadores siguen en la misma posición, pero la ventana tiene otro tamaño, por lo que los marcadores están en una posición incorrecta. No sé cómo resolver eso. –
Hmm, en ese caso, creo que podría necesitar subclasificar la clase ScrollBar para poder manejar el evento SizeChanged (o similar, no tengo el nombre exacto) para recalcular la posición de los marcadores. – japf