2012-08-30 11 views
5

estoy tratando de volver al estilo del control deslizante usando XAML para una aplicación estilo Metro - se supone que debe parecerse a un autobús rojo que el usuario arrastra a lo largo de una franja de color gris, es decir:Control deslizante XAML de estilo: ¿cómo puedo detener el cambio de fondo de mi pulgar en PointerOver?

enter image description here

I han extraído el Estilo usando Visual Studio y rediseñado el control deslizante como se muestra a continuación. Desafortunadamente, siempre que muevo el mouse sobre el control deslizante, el pulgar se reemplaza con un rectángulo gris, aunque he eliminado específicamente todos los elementos del guión gráfico del grupo VisualState "PointerOver".

enter image description here

Qué me he perdido? XAML está abajo. Si necesito modificar otra plantilla (por ejemplo, ¿Pulgar?), Indique los pasos para extraer esta plantilla, ya que Visual Studio no parece estar exponiéndome más plantillas de control además de la siguiente.

<Style x:Key="BusRouteSliderStyle" TargetType="Slider"> 
     <Setter Property="Background" Value="{StaticResource SliderTrackBackgroundThemeBrush}"/> 
     <Setter Property="BorderBrush" Value="{StaticResource SliderBorderThemeBrush}"/> 
     <Setter Property="BorderThickness" Value="{StaticResource SliderBorderThemeThickness}"/> 
     <Setter Property="Foreground" Value="{StaticResource SliderTrackDecreaseBackgroundThemeBrush}"/> 
     <Setter Property="ManipulationMode" Value="None"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="Slider"> 
        <Grid Margin="{TemplateBinding Padding}"> 
         <VisualStateManager.VisualStateGroups> 
          <VisualStateGroup x:Name="CommonStates"> 
           <VisualState x:Name="Normal"/> 
           <VisualState x:Name="Pressed"> 
            <Storyboard> 
            </Storyboard> 
           </VisualState> 
           <VisualState x:Name="Disabled"> 
            <Storyboard> 
            </Storyboard> 
           </VisualState> 
           <VisualState x:Name="PointerOver"> 
            <Storyboard> 
            </Storyboard> 
           </VisualState> 
          </VisualStateGroup> 
          <VisualStateGroup x:Name="FocusStates"> 
           <VisualState x:Name="Focused"> 
            <Storyboard> 
             <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="FocusVisualWhiteHorizontal"/> 
             <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="FocusVisualBlackHorizontal"/> 
             <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="FocusVisualWhiteVertical"/> 
             <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="FocusVisualBlackVertical"/> 
            </Storyboard> 
           </VisualState> 
           <VisualState x:Name="Unfocused"/> 
          </VisualStateGroup> 
         </VisualStateManager.VisualStateGroups> 
         <Grid x:Name="HorizontalTemplate" Background="Transparent"> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="Auto"/> 
           <ColumnDefinition Width="Auto"/> 
           <ColumnDefinition Width="*"/> 
          </Grid.ColumnDefinitions> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="17"/> 
           <RowDefinition Height="30"/> 
           <RowDefinition Height="32"/> 
          </Grid.RowDefinitions> 
          <Rectangle x:Name="HorizontalTrackRect" Grid.ColumnSpan="3" Fill="LightGray" Grid.Row="1" 
             Height="10" VerticalAlignment="Bottom"/> 
          <Rectangle x:Name="HorizontalDecreaseRect" Height="0" /> 
          <TickBar x:Name="TopTickBar" Grid.ColumnSpan="3" Fill="{StaticResource SliderTickmarkOutsideBackgroundThemeBrush}" Height="{StaticResource SliderOutsideTickBarThemeHeight}" Margin="0,0,0,2" Visibility="Collapsed" VerticalAlignment="Bottom"/> 
          <TickBar x:Name="HorizontalInlineTickBar" Grid.ColumnSpan="3" Fill="{StaticResource SliderTickMarkInlineBackgroundThemeBrush}" Height="{StaticResource SliderTrackThemeHeight}" Grid.Row="1" Visibility="Collapsed"/> 
          <TickBar x:Name="BottomTickBar" Grid.ColumnSpan="3" Fill="{StaticResource SliderTickmarkOutsideBackgroundThemeBrush}" Height="{StaticResource SliderOutsideTickBarThemeHeight}" Margin="0,2,0,0" Grid.Row="2" Visibility="Collapsed" VerticalAlignment="Top"/> 
          <Rectangle x:Name="HorizontalBorder" Grid.ColumnSpan="3" Grid.Row="1" Stroke="{TemplateBinding BorderBrush}" StrokeThickness="{TemplateBinding BorderThickness}"/> 
          <Thumb x:Name="HorizontalThumb" 
            Grid.Column="1" 
            DataContext="{TemplateBinding Value}" 
            Width="40" 
            Height="30" 
            Grid.Row="1" > 
           <Thumb.Background> 
            <ImageBrush ImageSource="/Assets/bus_thumb.png" /> 
           </Thumb.Background> 
          </Thumb> 
          <Rectangle x:Name="FocusVisualWhiteHorizontal" Grid.ColumnSpan="3" IsHitTestVisible="False" Opacity="0" Grid.RowSpan="3" StrokeDashOffset="1.5" StrokeEndLineCap="Square" Stroke="{StaticResource FocusVisualWhiteStrokeThemeBrush}" StrokeDashArray="1,1"/> 
          <Rectangle x:Name="FocusVisualBlackHorizontal" Grid.ColumnSpan="3" IsHitTestVisible="False" Opacity="0" Grid.RowSpan="3" StrokeDashOffset="0.5" StrokeEndLineCap="Square" Stroke="{StaticResource FocusVisualBlackStrokeThemeBrush}" StrokeDashArray="1,1"/> 
         </Grid> 
         <Grid x:Name="VerticalTemplate" Background="Transparent" Visibility="Collapsed"> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="17"/> 
           <ColumnDefinition Width="Auto"/> 
           <ColumnDefinition Width="17"/> 
          </Grid.ColumnDefinitions> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="*"/> 
           <RowDefinition Height="Auto"/> 
           <RowDefinition Height="Auto"/> 
          </Grid.RowDefinitions> 
          <Rectangle x:Name="VerticalTrackRect" Grid.Column="1" Fill="{TemplateBinding Background}" Grid.RowSpan="3"/> 
          <Rectangle x:Name="VerticalDecreaseRect" Grid.Column="1" Fill="{TemplateBinding Foreground}" Grid.Row="2"/> 
          <TickBar x:Name="LeftTickBar" Fill="{StaticResource SliderTickmarkOutsideBackgroundThemeBrush}" HorizontalAlignment="Right" Margin="0,0,2,0" Grid.RowSpan="3" Visibility="Collapsed" Width="{StaticResource SliderOutsideTickBarThemeHeight}"/> 
          <TickBar x:Name="VerticalInlineTickBar" Grid.Column="1" Fill="{StaticResource SliderTickMarkInlineBackgroundThemeBrush}" Grid.RowSpan="3" Visibility="Collapsed" Width="{StaticResource SliderTrackThemeHeight}"/> 
          <TickBar x:Name="RightTickBar" Grid.Column="2" Fill="{StaticResource SliderTickmarkOutsideBackgroundThemeBrush}" HorizontalAlignment="Left" Margin="2,0,0,0" Grid.RowSpan="3" Visibility="Collapsed" Width="{StaticResource SliderOutsideTickBarThemeHeight}"/> 
          <Rectangle x:Name="VerticalBorder" Grid.Column="1" Grid.RowSpan="3" Stroke="{TemplateBinding BorderBrush}" StrokeThickness="{TemplateBinding BorderThickness}"/> 
          <Thumb x:Name="VerticalThumb" 
           Background="{StaticResource SliderThumbBackgroundThemeBrush}" 
           Grid.Column="1" DataContext="{TemplateBinding Value}" Height="{StaticResource SliderTrackThemeHeight}" Grid.Row="1" 
           Width="{StaticResource SliderTrackThemeHeight}"/> 
          <Rectangle x:Name="FocusVisualWhiteVertical" Grid.ColumnSpan="3" IsHitTestVisible="False" Opacity="0" Grid.RowSpan="3" StrokeDashOffset="1.5" StrokeEndLineCap="Square" Stroke="{StaticResource FocusVisualWhiteStrokeThemeBrush}" StrokeDashArray="1,1"/> 
          <Rectangle x:Name="FocusVisualBlackVertical" Grid.ColumnSpan="3" IsHitTestVisible="False" Opacity="0" Grid.RowSpan="3" StrokeDashOffset="0.5" StrokeEndLineCap="Square" Stroke="{StaticResource FocusVisualBlackStrokeThemeBrush}" StrokeDashArray="1,1"/> 
         </Grid> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</UserControl.Resources> 

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="50" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 

    <Slider x:Name="busSlider" Width="220" Height="50" Minimum="0" Maximum="100" Value="0" Orientation="Horizontal" IsEnabled="True" Style="{StaticResource BusRouteSliderStyle}" /> 

    <TextBlock x:Name="lblSliderStopInfo" Grid.Row="1" Foreground="White" FontSize="12" Text ="{Binding ElementName=slider, Path=Value}" /> 

</Grid> 

Respuesta

3

Como sospechaba, necesitaba cambiar el estilo del control Thumb, pero no fue fácil extraerlo en VIsual Studio, ya que ya estaba dentro de ControlTemplate.

La solución fue la siguiente:

  • Crear un nuevo control del pulgar de la marca en una página XAML en blanco, lo que supone una altura/anchura por lo que es visible en el lienzo de diseño.
  • Haga clic en él, seleccione 'Editar plantilla' -> 'Editar una copia'
  • Esto crea la plantilla en el XAML que luego puede ser copiado/pegado en otros lugares como requerido.

El estilo de pulgar predeterminado se pega a continuación para cualquier persona que lo necesite. Simplemente elimine el PointerOver y los estados presionados para lograr el comportamiento que quería.

<Style x:Key="ThumbStyle1" TargetType="Thumb"> 
     <Setter Property="Background" Value="{StaticResource ThumbBackgroundThemeBrush}"/> 
     <Setter Property="BorderThickness" Value="1"/> 
     <Setter Property="IsTabStop" Value="False"/> 
     <Setter Property="BorderBrush" Value="{StaticResource ThumbBorderThemeBrush}"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="Thumb"> 
        <Grid> 
         <VisualStateManager.VisualStateGroups> 
          <VisualStateGroup x:Name="CommonStates"> 
           <VisualState x:Name="Normal"/> 
           <VisualState x:Name="PointerOver"> 
            <Storyboard> 
             <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="BackgroundPointerOver"/> 
             <DoubleAnimation Duration="0" To="0" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="Background"/> 
            </Storyboard> 
           </VisualState> 
           <VisualState x:Name="Pressed"> 
            <Storyboard> 
             <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="BackgroundPressed"/> 
             <DoubleAnimation Duration="0" To="0" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="Background"/> 
            </Storyboard> 
           </VisualState> 
           <VisualState x:Name="Disabled"/> 
          </VisualStateGroup> 
          <VisualStateGroup x:Name="FocusStates"> 
           <VisualState x:Name="Unfocused"/> 
           <VisualState x:Name="Focused"/> 
          </VisualStateGroup> 
         </VisualStateManager.VisualStateGroups> 
         <Border x:Name="Background" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}"/> 
         <Border x:Name="BackgroundPointerOver" BorderBrush="{StaticResource ThumbPointerOverBorderThemeBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{StaticResource ThumbPointerOverBackgroundThemeBrush}" Opacity="0"/> 
         <Border x:Name="BackgroundPressed" BorderBrush="{StaticResource ThumbPressedBorderThemeBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{StaticResource ThumbPressedBackgroundThemeBrush}" Opacity="0"/> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
+0

Para futuras referencias, si tiene Expression Blend, hace que estas tareas sean mucho más sencillas y eficientes que VS a la hora de trabajar con plantillas. ¡Me alegra que hayas recibido tu respuesta! –

+0

Gracias Chris, lo tengo pero aún no he dado el salto para intentar aprender a usarlo. Realmente debería hacerlo, sin embargo, no eres la primera persona en decir eso. –

3

Es probable que tenga que cambiar también el estilo/plantilla del control del pulgar.

+0

+1 desde que venció mi respuesta por segundos ... pero es correcto. –

+0

Gracias, pero como he dicho en mi pregunta, no estoy seguro de cómo extraer el estilo o la plantilla de Thumb usando Visual Studio. Si haces clic con el botón derecho en un control deslizante, eliges 'Editar plantilla' -> 'Editar una copia', obtienes la plantilla XAML para un control deslizante en mi pregunta, arriba. ¿Qué harías entonces para obtener la plantilla/estilo para el Pulgar? –

+0

OK, lo descubrí - respuesta publicada. –

Cuestiones relacionadas