2010-11-26 4 views
5

Ich verwende eine WPF Slider-Steuerelement (ich vermute, die Silverlight-Version ist ähnlich), die auf horizontal eingestellt ist und hat einen Min-Wert von 0 und einen Maximalwert von 5.WPF/Silverlight Slider Steuerelement Anzeige Tick Zahlen

Ich möchte die Werte 0 - 5 unterhalb der Teilstriche anzeigen, um ein wenig deutlicher zu machen, auf welchen Wert der Daumen gerade zeigt.

Ist das möglich und hat es irgendjemand geschafft, dies zu erreichen?

+0

Möchten Sie eine Antwort, die in Silverlight funktioniert? Es ist am besten, wenn Sie explizit angeben, wo dies eigentlich funktionieren soll. – AnthonyWJones

+0

Hallo Anthony, ich brauche es für ein WPF-Projekt, das nächstes Jahr auf Silverlight portiert wird, also bin ich nicht besonders beunruhigt, ob ich eine WPF- oder Silverlight-Lösung bekomme. In Anbetracht der Ähnlichkeiten zwischen den beiden würde ich hoffen, in der Lage zu sein, irgendwelche Vorschläge in jeder Hinsicht anzupassen. Mitch – Mitch

Antwort

11

Ich glaube, der beste Weg, dies zu tun ist, ein benutzerdefiniertes TickBar-Steuerelement zu erstellen und überschreiben das Rendern der Ticks. Hier ist eine Möglichkeit:

public class NumberedTickBar : TickBar 
    { 
    protected override void OnRender(DrawingContext dc) 
    { 

     Size size = new Size(base.ActualWidth,base.ActualHeight); 
     int tickCount = (int)((this.Maximum - this.Minimum)/this.TickFrequency) + 1; 
     if((this.Maximum - this.Minimum) % this.TickFrequency == 0) 
     tickCount -= 1; 
     Double tickFrequencySize; 
     // Calculate tick's setting 
     tickFrequencySize = (size.Width * this.TickFrequency/(this.Maximum - this.Minimum)); 
     string text = ""; 
     FormattedText formattedText = null; 
     double num = this.Maximum - this.Minimum; 
     int i = 0; 
     // Draw each tick text 
     for(i = 0;i <= tickCount;i++) 
     { 
     text = Convert.ToString(Convert.ToInt32(this.Minimum + this.TickFrequency * i),10); 

     formattedText = new FormattedText(text,CultureInfo.GetCultureInfo("en-us"),FlowDirection.LeftToRight,new Typeface("Verdana"),8,Brushes.Black); 
     dc.DrawText(formattedText,new Point((tickFrequencySize * i),30)); 

     } 
    } 
    } 

Dann werden Sie haben einen benutzerdefinierten Stil für Ihren Schieber zu schaffen, die Ihre neue Tickbar anstelle der Standard-Tickbar verwendet.

Wenn Sie nicht sicher sind, wie Sie einen Stil für einen Schieberegler erstellen, können Sie mit dem Windows-Beispiel beginnen here. Es ist ein sehr anspruchsvoller.

Dann müssen Sie nur noch die obere Tickbar durch Ihre neue benutzerdefinierte ersetzen. Grundsätzlich ändern:

<TickBar Name="TopTick" SnapsToDevicePixels="True" Placement="Top" Fill="{StaticResource GlyphBrush}" Height="4" Visibility="Collapsed" /> 

dazu:

<local:NumberedTickBar Name="TopTick" Margin="5,0,10,0" SnapsToDevicePixels="True" Grid.Row="0" Fill="{TemplateBinding Foreground}" Placement="Top" Height="4" Visibility="Collapsed"/> 

Die Marge ist wichtig, denn das wird dafür sorgen, dass Ihr Text an der richtigen Stelle ist.

Ihr Schieberegler wird auf der Oberseite mit Zecken direkt darunter sein. Eine Zeile Text wird unter den Ticks angezeigt.

0

Etwas mehr Detail zu der obigen Antwort hinzufügen. So haben wir es gemacht, zuerst das Standard-Slider-Control bearbeiten und das Xaml in Blend erzeugen.

Hier ist der gesamte Stil und ja anstelle von CustomTickBar ersetzen Sie die NumberedTickBar und verwenden Sie die Vorlage für Ihren Slider als Horizontal Slider wie im Stil zur Verfügung gestellt.

<SolidColorBrush 
      x:Key="SliderThumb.Static.Foreground" 
      Color="#FFE5E5E5" /> 
     <SolidColorBrush 
      x:Key="SliderThumb.MouseOver.Background" 
      Color="#FFDCECFC" /> 
     <SolidColorBrush 
      x:Key="SliderThumb.MouseOver.Border" 
      Color="#FF7Eb4EA" /> 
     <SolidColorBrush 
      x:Key="SliderThumb.Pressed.Background" 
      Color="#FFDAECFC" /> 
     <SolidColorBrush 
      x:Key="SliderThumb.Pressed.Border" 
      Color="#FF569DE5" /> 
     <SolidColorBrush 
      x:Key="SliderThumb.Disabled.Background" 
      Color="#FFF0F0F0" /> 
     <SolidColorBrush 
      x:Key="SliderThumb.Disabled.Border" 
      Color="#FFD9D9D9" /> 
     <SolidColorBrush 
      x:Key="SliderThumb.Static.Background" 
      Color="#FFF0F0F0" /> 
     <SolidColorBrush 
      x:Key="SliderThumb.Static.Border" 
      Color="#FFACACAC" /> 
     <SolidColorBrush 
      x:Key="SliderThumb.Track.Border" 
      Color="#FFD6D6D6" /> 
     <SolidColorBrush 
      x:Key="SliderThumb.Track.Background" 
      Color="Red" /> 
     <Style 
      x:Key="RepeatButtonTransparent" 
      TargetType="{x:Type RepeatButton}"> 
      <Setter 
       Property="OverridesDefaultStyle" 
       Value="true" /> 
      <Setter 
       Property="Background" 
       Value="Transparent" /> 
      <Setter 
       Property="Focusable" 
       Value="false" /> 
      <Setter 
       Property="IsTabStop" 
       Value="false" /> 
      <Setter 
       Property="Template"> 
       <Setter.Value> 
        <ControlTemplate 
         TargetType="{x:Type RepeatButton}"> 
         <Rectangle 
          Fill="{TemplateBinding Background}" 
          Height="{TemplateBinding Height}" 
          Width="{TemplateBinding Width}" /> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

     <Style 
      x:Key="SliderThumbStyle" 
      TargetType="{x:Type Thumb}"> 
      <Setter 
       Property="SnapsToDevicePixels" 
       Value="true" /> 
      <Setter 
       Property="OverridesDefaultStyle" 
       Value="true" /> 
      <Setter 
       Property="Height" 
       Value="18" /> 
      <Setter 
       Property="Width" 
       Value="18" /> 
      <Setter 
       Property="Template"> 
       <Setter.Value> 
        <ControlTemplate 
         TargetType="{x:Type Thumb}"> 
         <Ellipse 
          Name="Ellipse" 
          Fill="Orange" 
          Stroke="#404040" 
          StrokeThickness="1" /> 
         <ControlTemplate.Triggers> 
          <Trigger 
           Property="IsMouseOver" 
           Value="True"> 
           <Setter 
            TargetName="Ellipse" 
            Property="Fill" 
            Value="#FFC3C0FF" /> 

          </Trigger> 
          <Trigger 
           Property="IsEnabled" 
           Value="false"> 
           <Setter 
            TargetName="Ellipse" 
            Property="Fill" 
            Value="#EEEEEE" /> 

          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

     <ControlTemplate 
      x:Key="SliderThumbHorizontalDefault" 
      TargetType="{x:Type Thumb}"> 
      <Grid 
       HorizontalAlignment="Center" 
       UseLayoutRounding="True" 
       VerticalAlignment="Center"> 
       <Path 
        x:Name="grip" 
        Data="M 0,0 C0,0 11,0 11,0 11,0 11,18 11,18 11,18 0,18 0,18 0,18 0,0 0,0 z" 
        Fill="{StaticResource SliderThumb.Static.Background}" 
        Stretch="Fill" 
        SnapsToDevicePixels="True" 
        Stroke="{StaticResource SliderThumb.Static.Border}" 
        StrokeThickness="1" 
        UseLayoutRounding="True" 
        VerticalAlignment="Center" /> 
      </Grid> 
      <ControlTemplate.Triggers> 
       <Trigger 
        Property="IsMouseOver" 
        Value="true"> 
        <Setter 
         Property="Fill" 
         TargetName="grip" 
         Value="{StaticResource SliderThumb.MouseOver.Background}" /> 
        <Setter 
         Property="Stroke" 
         TargetName="grip" 
         Value="{StaticResource SliderThumb.MouseOver.Border}" /> 
       </Trigger> 
       <Trigger 
        Property="IsDragging" 
        Value="true"> 
        <Setter 
         Property="Fill" 
         TargetName="grip" 
         Value="{StaticResource SliderThumb.Pressed.Background}" /> 
        <Setter 
         Property="Stroke" 
         TargetName="grip" 
         Value="{StaticResource SliderThumb.Pressed.Border}" /> 
       </Trigger> 
       <Trigger 
        Property="IsEnabled" 
        Value="false"> 
        <Setter 
         Property="Fill" 
         TargetName="grip" 
         Value="{StaticResource SliderThumb.Disabled.Background}" /> 
        <Setter 
         Property="Stroke" 
         TargetName="grip" 
         Value="{StaticResource SliderThumb.Disabled.Border}" /> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
     <ControlTemplate 
      x:Key="HorizontalSlider" 
      TargetType="{x:Type Slider}"> 
      <Grid> 
       <Grid.RowDefinitions> 
        <RowDefinition 
         Height="Auto" /> 
        <RowDefinition 
         Height="Auto" 
         MinHeight="{TemplateBinding Slider.MinHeight}" /> 
        <RowDefinition 
         Height="Auto" /> 
       </Grid.RowDefinitions> 
       <Custom:CustomTickBar 
        Margin="5,0,10,0" 
        x:Name="TopTick" 
        SnapsToDevicePixels="True" 
        Placement="Top" 
        Fill="Green" 
        Height="5" /> 
       <Border 
        Name="TrackBackground" 
        Margin="0" 
        CornerRadius="2" 
        Height="4" 
        Grid.Row="1" 
        Background="{StaticResource SliderThumb.Track.Background}" 
        BorderBrush="{StaticResource SliderThumb.Track.Border}" 
        BorderThickness="1" /> 
       <Track 
        Grid.Row="1" 
        Name="PART_Track"> 
        <Track.DecreaseRepeatButton> 
         <RepeatButton 
          Style="{StaticResource RepeatButtonTransparent}" 
          Command="Slider.DecreaseLarge" /> 
        </Track.DecreaseRepeatButton> 
        <Track.Thumb> 
         <Thumb 
          Style="{StaticResource SliderThumbStyle}" /> 
         <!--<Thumb 
          Style="{StaticResource SliderThumbHorizontalDefault}" />--> 
        </Track.Thumb> 
        <Track.IncreaseRepeatButton> 
         <RepeatButton 
          Style="{StaticResource RepeatButtonTransparent}" 
          Command="Slider.IncreaseLarge" /> 
        </Track.IncreaseRepeatButton> 
       </Track> 
       <TickBar 
        Name="BottomTick" 
        SnapsToDevicePixels="True" 
        Grid.Row="2" 
        Fill="Black" 
        Placement="Bottom" 
        Height="10" 
        Visibility="Collapsed" /> 
      </Grid> 
      <ControlTemplate.Triggers> 
       <Trigger 
        Property="TickPlacement" 
        Value="TopLeft"> 
        <Setter 
         TargetName="TopTick" 
         Property="Visibility" 
         Value="Visible" /> 
       </Trigger> 
       <Trigger 
        Property="TickPlacement" 
        Value="BottomRight"> 
        <Setter 
         TargetName="BottomTick" 
         Property="Visibility" 
         Value="Visible" /> 
       </Trigger> 
       <Trigger 
        Property="TickPlacement" 
        Value="Both"> 
        <Setter 
         TargetName="TopTick" 
         Property="Visibility" 
         Value="Visible" /> 
        <Setter 
         TargetName="BottomTick" 
         Property="Visibility" 
         Value="Visible" /> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate>