2012-09-10 6 views
2

XAML에서 다음과 같은 기본 자료 Style을 얻었습니다. 새로운 스타일마다 각각 다른 속성을 가진 새로운 스타일을 만들어야합니다.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.Border2에서 Button.DefaultState.BorderNEWZ에 필요한 제어 부분을 변경하지 않습니다하지만, 기본 스타일의 <Setter Property="Template"> 나머지 부분에 포함 된 나머지 값을 생략합니다.

매번 <Setter Property="Template"> 전체를 복사하여 필요한 라인을 변경할 수는 있지만 지나친 것 같습니다. Button.DefaultState.Border2을 목표로하는 방법은 있습니까? 코드의 큰 덩어리를 반복하지 않고 다른 모든 것을 똑같이 유지하면서 새로운 스타일을 변경하려면 어떻게해야합니까?

답변