2011-03-16 58 views
4

我試圖在App.xaml中定義一個全局按鈕樣式,它的大部分工作正如我所期望的那樣。但是,我只是無法弄清楚如何讓Foreground正常工作。無論我做什麼,我都會得到默認TextBlock的樣式(將顏色設置爲白色)。自定義按鈕的前景顏色(ControlPresenter)

<Style TargetType="{x:Type Button}"> 
     <Setter Property="Margin" Value="3, 5" /> 
     <Setter Property="OverridesDefaultStyle" Value="True" /> 
     <Setter Property="FocusVisualStyle" 
       Value="{StaticResource ButtonFocusVisual}" /> 
     <Setter Property="Foreground" Value="Red" /> 
     <Setter Property="Padding" Value="5" /> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="Button"> 
        <Grid x:Name="gridMainButton" 
          RenderTransformOrigin="0.5, 0.5"> 
         <Grid.RenderTransform> 
          <ScaleTransform x:Name="scaleTransform" 
              CenterX="0.5" 
              CenterY="0.5" /> 
         </Grid.RenderTransform> 
         <VisualStateManager.VisualStateGroups> 
          <VisualStateGroup x:Name="CommonStates" > 
           <VisualState x:Name="Normal" /> 
           <VisualState x:Name="MouseOver" /> 
           <VisualState x:Name="Pressed"> 
            <Storyboard> 
             <DoubleAnimation 
               Storyboard.TargetName="scaleTransform" 
               Storyboard.TargetProperty="ScaleX" 
               Duration="0" 
               To="0.85" /> 
            </Storyboard> 
           </VisualState> 
          </VisualStateGroup> 
         </VisualStateManager.VisualStateGroups> 

         <Ellipse x:Name="ellipse" 
           HorizontalAlignment="Stretch" 
           VerticalAlignment="Stretch" 
           StrokeThickness="2" 
           Stroke="{StaticResource standardBackground}" 
           Fill="{StaticResource standardBackground}" /> 
         <ContentPresenter HorizontalAlignment="Center" 
              VerticalAlignment="Center" 
              Margin="4, 8"/> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

我想我可以在ContentPresenter改變給TextBlock,這將是確定這個特定的應用程序,但我正在尋找一個更通用的解決方案。

感謝,
WTS

回答

7

像馬庫斯·特說,問題可能是,你必須定義一個TextBlock隱式風格而當Button Content被設置爲一個字符串,一個TextBlock將被創建,你必須在模板中ContentPresenter。這TextBlock將拿起隱式風格,這就是爲什麼你得到這個問題。

通過爲string指定DataTemplate,您可以禁用針對字符串創建的TextBlock的隱式樣式。將以下內容添加到App.xaml

<Application ...> 
    <Application.Resources> 
     <DataTemplate xmlns:sys="clr-namespace:System;assembly=mscorlib" 
         DataType="{x:Type sys:String}"> 
      <TextBlock Text="{Binding}"> 
       <TextBlock.Resources> 
        <Style TargetType="{x:Type TextBlock}"/> 
       </TextBlock.Resources> 
      </TextBlock> 
     </DataTemplate> 
     <!--...--> 
    </Application.Resources> 
</Application> 
+0

+1不錯,不知道你能做到這一點! – 2011-03-16 21:01:56

1

你似乎是使用文本塊的自定義樣式(如果你說前景色爲白色)允許調用此StandardTextBlockStyle

在外部網格內的按鈕樣式中。包括:

<Grid x:Name="gridMainButton"> 
    <Grid.Resources> 
     <Style TargetType="TextBlock" BasedOn="{StaticResource StandardTextBlockStyle}"> 
      <Setter Property="Foreground" Value="Black"/> 
     </Style> 
    </Grid.Resources> 
    <!-- ...--> 
</Grid> 

這應該覆蓋默認的TextBlock樣式。