2012-09-10 121 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,同时保持其他所有内容不变,而不重复大块代码?

回答