2012-09-10 224 views
2

我在XAML中有以下基礎Style,我需要基於它創建幾個新樣式,每種新樣式中只有1個屬性不同。在XAML中設置樣式

<UserControl.Resources> 
<Style x:Key="BaseButtonStyle" TargetType="{x:Type ButtonBase}"> 
      <Setter Property="FocusVisualStyle" Value="{x:Null}"/> 
      <Setter Property="Background" Value="{StaticResource Button.Background}"/> 
      <Setter Property="BorderBrush" Value="{StaticResource Button.BorderBrush}"/> 
      <Setter Property="Foreground" Value="{StaticResource Button.Foreground}"/> 
      <Setter Property="BorderThickness" Value="1"/> 
      <Setter Property="HorizontalContentAlignment" Value="Center"/> 
      <Setter Property="VerticalContentAlignment" Value="Center"/> 
      <Setter Property="Padding" Value="10,1,10,1"/> 
      <Setter Property="SnapsToDevicePixels" Value="True"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type ButtonBase}"> 
         <Grid x:Name="Root" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"> 
          <Grid x:Name="FocusState" Opacity="0"> 
           <Border CornerRadius="4" Style="{StaticResource FocusTemplate}"/> 
          </Grid> 
          <Grid x:Name="DefaultState"> 
           <Border Background="{StaticResource Button.DefaultState.Border1}" 
            Padding="1" CornerRadius="3"> 
            <Border Background="{StaticResource Button.DefaultState.Border2}" 
             Padding="1" CornerRadius="2"> 
            </Border> 
           </Border> 
          </Grid> 
          <Grid x:Name="HoverState" Opacity="0"> 
           <Border Background="{StaticResource Button.HoverState.Border1}" 
            Padding="1" CornerRadius="3"> 
            <Grid> 
             <Border Background="{StaticResource Button.HoverState.Border2}" 
              Padding="1" CornerRadius="2"> 
              <Border Background="{StaticResource Button.HoverState.Border3}" 
               CornerRadius="1"/> 
             </Border> 
             <Border> 
              <Border.Background> 
               <RadialGradientBrush> 
                <RadialGradientBrush.RelativeTransform> 
                 <TranslateTransform X="0" Y="0.5"/> 
                </RadialGradientBrush.RelativeTransform> 
                <GradientStop Color="#00FFFFFF" Offset="1"/> 
                <GradientStop Color="#BFFFFFFF" Offset="0"/> 
               </RadialGradientBrush> 
              </Border.Background> 
             </Border> 
            </Grid> 
           </Border> 
          </Grid> 
          <Grid x:Name="PressedState" Opacity="0"> 
           <Border Background="{StaticResource Button.PressedState.Border1}" 
            Padding="1" CornerRadius="3"> 
            <Border Background="{StaticResource Button.PressedState.Border2}" 
             Padding="1" CornerRadius="2"> 
             <Border Background="{StaticResource Button.PressedState.Border3}" 
              CornerRadius="1"/> 
            </Border> 
           </Border> 
          </Grid> 
          <Grid x:Name="CheckedState" Opacity="0"> 
           <Border Background="{StaticResource Button.CheckedState.Border1}" 
            Padding="1" CornerRadius="3"> 
            <Border Background="{StaticResource Button.CheckedState.Border2}" 
             Padding="1" CornerRadius="2"> 
             <Border Background="{StaticResource Button.CheckedState.Border3}" 
              CornerRadius="1"/> 
            </Border> 
           </Border> 
          </Grid> 
          <Grid Margin="2"> 
           <ContentPresenter Margin="{TemplateBinding Padding}" 
               HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
               VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
               RecognizesAccessKey="True" 
               SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
          </Grid> 
         </Grid> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsMouseOver" Value="True"> 
           <Setter TargetName="DefaultState" Property="Opacity" Value="0"/> 
           <Setter TargetName="HoverState" Property="Opacity" Value="1"/> 
           <Setter TargetName="PressedState" Property="Opacity" Value="0"/> 
           <Setter TargetName="CheckedState" Property="Opacity" Value="0"/> 
           <Setter Property="Foreground" 
            Value="{StaticResource Button.Foreground}"/> 
          </Trigger> 
          <Trigger Property="IsPressed" Value="True"> 
           <Setter TargetName="DefaultState" Property="Opacity" Value="0"/> 
           <Setter TargetName="HoverState" Property="Opacity" Value="0"/> 
           <Setter TargetName="PressedState" Property="Opacity" Value="1"/> 
           <Setter TargetName="CheckedState" Property="Opacity" Value="0"/> 
           <Setter Property="Foreground" 
            Value="{StaticResource Button.Foreground}"/> 
          </Trigger> 
          <Trigger Property="ToggleButton.IsChecked" Value="True"> 
           <Setter TargetName="DefaultState" Property="Opacity" Value="0"/> 
           <Setter TargetName="HoverState" Property="Opacity" Value="0"/> 
           <Setter TargetName="PressedState" Property="Opacity" Value="0"/> 
           <Setter TargetName="CheckedState" Property="Opacity" Value="1"/> 
           <Setter Property="Foreground" 
            Value="{StaticResource Button.Foreground}"/> 
          </Trigger> 
          <Trigger Property="IsFocused" Value="True"> 
           <Setter TargetName="FocusState" Property="Opacity" Value="1"/> 
          </Trigger> 
          <Trigger Property="Button.IsDefaulted" Value="True"> 
           <Setter TargetName="FocusState" Property="Opacity" Value="1"/> 
          </Trigger> 
          <Trigger Property="IsEnabled" Value="False"> 
           <Setter TargetName="Root" Property="Opacity" Value="0.35"/> 
           <Setter Property="Foreground" 
            Value="{StaticResource Button.Foreground}"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
</Style> 

<UserControl.Resources> 

和我設置爲使用

<Style TargetType="{x:Type Button}" BasedOn="{StaticResource BaseButtonStyle}"/> 

到目前爲止好基礎按鈕樣式。接下來,我想有是不同的只是部分的第二風格

<Border Background="{StaticResource Button.DefaultState.BorderNEWZ}" 
//instead of 
<Border Background="{StaticResource Button.DefaultState.Border2}" 

所以我試過NEWSTYLETEST ...

<Style x:Key="NEWSTYLETEST" TargetType="{x:Type Button}" BasedOn="{StaticResource BaseButtonStyle}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ButtonBase}"> 
        <Grid x:Name="Root" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"> 
         <Grid x:Name="FocusState" Opacity="0"> 
          <Border CornerRadius="4" Style="{StaticResource FocusTemplate}"/> 
         </Grid> 
         <Grid x:Name="DefaultState"> 
          <Border Background="{StaticResource Button.DefaultState.Border1}" 
           Padding="1" CornerRadius="3"> 
           <Border Background="{StaticResource Button.DefaultState.BorderNEWZ}" 
            Padding="1" CornerRadius="2"> 
           </Border> 
          </Border> 
         </Grid> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

這不會改變我需要從Button.DefaultState.Border2Button.DefaultState.BorderNEWZ控制部分,但它以基礎樣式省略了其餘<Setter Property="Template">中包含的其餘值。

我可以複製整個<Setter Property="Template">每次和改變我需要的線,但似乎矯枉過正。有沒有一種方法只針對每種新風格的變化Button.DefaultState.Border2,同時保持其他所有內容不變,而不重複大塊代碼?

回答