2009-12-04 9 views
5

Estoy creando un estilo que cambia una Plantilla de Control de un Botón (en realidad agrega una flecha a la derecha, de modo que el botón se ve como el botón desplegable (que falta en wpf)).WPF: ¿Cómo tener una plantilla de botón personalizado que utiliza el fondo del botón del sistema de forma predeterminada?

Dentro de la plantilla, pongo el botón real (porque necesito el resultado para seguir siendo como el botón; podría cambiar solo ContentTemplate, pero necesito mostrar el contenido real junto con la flecha, y poner ContentPresenter dentro de ContentTemplate rinde pila overflow - wpf simplemente expande la plantilla en el presentador y sigue y sigue), junto con la flecha.

Mi problema es que me gustaría que el usuario pueda cambiar el fondo del botón, así que necesito unir Background="{TemplateBinding Background}". Con esto, el usuario debería siempre proporcionar el fondo, de lo contrario sería nulo. Para evitar esto, entiendo que necesito para proporcionar un valor predeterminado para el fondo, por lo que añade <Setter Property="Background" Value="default Background goes here"/>

La pregunta es, lo que debe ser un valor de esta incubadora? Supongo que los estilos incorporados de wpf se cargan automáticamente para cada aplicación, y he buscado en aero.normalcolor.xaml, donde proporcionan el estilo ButtonNormalBackground, y luego lo uso como el estilo de botón predeterminado <Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/> (aero.normalcolor.xaml, línea 47)

Exactamente lo que quería, sin embargo, cuando uso este setter, el recurso estático no se encuentra. Luego lo cambié a DynamicResource, pero en ese caso, el fondo del botón se mantiene transparente: ¡no se usa ButtonNormalBackground!

¿Qué debo hacer para que el botón del sistema se vea como valor predeterminado? ¡Gracias!

PS: Dtto para BorderBrush, BorderThickness - vaya, parece que no se me permite los trucos que los autores de WPF utilizan todo el tiempo:/

Mi estilo:

<Style TargetType="{x:Type ToggleButton}" x:Key="DropDownArrowStyle"> 
    <Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/> 
    <Setter Property="ToggleButton.Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ToggleButton}"> 
       <ToggleButton 
        x:Name="PART_ToggleButton" 
        Margin="{TemplateBinding Margin}" 
        Padding="{TemplateBinding Padding}" 
        HorizontalAlignment="Stretch" 
        VerticalAlignment="Stretch" 
        HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" 
        VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" 
        IsEnabled="{TemplateBinding IsEnabled}" 
        IsChecked="{Binding IsChecked, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" 
        ContextMenu="{TemplateBinding ContextMenu}" 
        Background="{TemplateBinding Background}" 
        BorderBrush="{TemplateBinding BorderBrush}" 
        BorderThickness="{TemplateBinding BorderThickness}" 
        Foreground="{TemplateBinding Foreground}" 
        FocusVisualStyle="{TemplateBinding FocusVisualStyle}" 
        ClickMode="{TemplateBinding ClickMode}" 
        > 
        <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="*" /> 
          <ColumnDefinition Width="Auto" /> 
         </Grid.ColumnDefinitions> 
         <ContentPresenter 
          x:Name="ButtonContentPresenter" 
          HorizontalAlignment="Left" 
          VerticalAlignment="Stretch" 
          Margin="{TemplateBinding Padding}" 
          Content="{TemplateBinding Content}" 
          Grid.Column="0" 
          /> 
         <Border 
          x:Name="PART_DownArrowBorder" 
          HorizontalAlignment="Stretch" 
          VerticalAlignment="Stretch" 
          Background="Transparent" 
          Focusable="False" 
          Grid.Column="1" 
          > 
          <Path 
           Focusable="False" 
           x:Name="PART_DownArrow" 
           Data="M 3,0 L 6.5,4 L 10,0" 
           Width="12" 
           HorizontalAlignment="Right" 
           VerticalAlignment="Center" 
           Fill="Black" SnapsToDevicePixels="True" 
           > 
          </Path> 
         </Border> 
        </Grid> 
       </ToggleButton> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+0

relacionadas: http://stackoverflow.com/questions/628483/how-can-i-set-a-wpf-controls-color-to- a-system-color-programtically-so-that-i –

Respuesta

0

Es necesario definir los colores que desea utilizar y hacer referencia a los colores del sistema:

es decir

<SolidColorBrush 
    Color="{DynamicResource {x:Static SystemColors.HighlightColorKey}}" 
    x:Key="ButtonLinkBackground"/> 

o

<Grid Background="{DynamicResource {x:Static SystemColors.DesktopBrushKey}}"/> 

Más información sobre SystemColors disponibles How can I list colors in WPF with XAML?

Cuestiones relacionadas