2009-12-04 14 views
5

Sto creando uno stile che modifica un ControlTemplate di un pulsante (in realtà aggiunge una freccia a destra, in modo che il pulsante appaia come il pulsante a discesa (che manca in wpf)).WPF: Come avere un modello di pulsante personalizzato che utilizza lo sfondo del pulsante del sistema per impostazione predefinita?

All'interno del modello, ho inserito il pulsante attuale (perché ho bisogno che il risultato sia ancora come pulsante - Potrei modificare solo ContentTemplate, ma ho bisogno di visualizzare il contenuto effettivo insieme alla freccia e mettere ContentPresenter all'interno dello stack di rendimento ContentTemplate overflow - wpf semplicemente espande il template nel presenter e va avanti e avanti), insieme alla freccia.

Il mio problema è che vorrei che l'utente fosse in grado di modificare lo sfondo del pulsante, quindi è necessario associare Background="{TemplateBinding Background}". Con questo, l'utente dovrebbe sempre fornire lo sfondo, altrimenti sarebbe nullo. Per evitare questo, ho bisogno di fornire il valore predefinito per lo sfondo, così ho aggiunto <Setter Property="Background" Value="default Background goes here"/>

La domanda è, quale dovrebbe essere un valore di questo setter? Suppongo che gli stili built-in di wpf vengano caricati automaticamente per ogni applicazione, e ho esaminato aero.normalcolor.xaml, dove forniscono lo stile ButtonNormalBackground e in seguito lo usano come stile pulsante predefinito <Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/> (aero.normalcolor.xaml, riga 47).

Esattamente ciò che volevo, tuttavia, quando utilizzo questo setter, la risorsa statica non viene trovata. L'ho quindi modificato in DynamicResource, ma in tal caso, lo sfondo del pulsante rimane trasparente: ButtonNormalBackground non viene utilizzato!

Come si deve fornire il pulsante di sistema come valore predefinito? Grazie!

PS: dtto per BorderBrush, BorderThickness - Accidenti, sembra che non mi è permesso i trucchi che gli autori WPF utilizzano tutto il tempo:/

Il mio stile:

<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

correlati: http://stackoverflow.com/questions/628483/how-can-i-set-a-wpf-controls-color-to- un sistema colori-programatically-so-che-i –

risposta

0

È necessario definire i colori che si desidera utilizzare e fare riferimento ai colori di sistema:

cioè

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

o

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

Maggiori informazioni disponibili SystemColors How can I list colors in WPF with XAML?