2010-01-22 4 views

Respuesta

11

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> 
+0

¿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. –

+1

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

1

Para contribuir a japfs respuesta: Solucioné la actualización en cuestión de cambio de tamaño: Puede utilizar japfs Estilo y aplicar una ItemsSource a la ItemControl:

ItemsSource="{Binding Positions, UpdateSourceTrigger=PropertyChanged}" 

Sólo asegúrese sure Positions es del tipo ObservableCollection y las posiciones se vuelven a calcular en SizeChanged-event. Además, en caso de que la llamada (interfaz INotifyPropertyChanged la que debe poner en práctica su modelo de vista)

OnPropertyChanged("Positions"); 

probado con una lista de principio, pero que no se actualizaba correctamente. Trabajé con ObservableCollection bien.

Cuestiones relacionadas