2015-02-08 34 views
1

我正在尝试用玻璃式外观为画笔创建自定义样式。我看到了我想要的方式,但我无法让按下的行为起作用。在VisualStateManager中交换画笔

按下的外观只是其中一个笔刷反转的正常外观。我已经设置了两个画笔作为资源,并尝试ObjectAnimationUsingKeyFrames,但它似乎并不需要。我们的想法是沿此线的东西:

<VisualState x:Name="Pressed"> 
    <Storyboard> 
     <!-- swap the brush from {StaticResource ButtonGlassBrushNormal} to 
      {StaticResource ButtonGlassBrushPressed --> 
    </Storyboard> 
</VisualState> 

这里是我的资源和样式:

<LinearGradientBrush x:Key="ButtonGlassBrushNormal" EndPoint="0.5,1" StartPoint="0.5,0"> 
    <GradientStop Color="#00000000" Offset="0.31"/> 
    <GradientStop Color="White"/> 
</LinearGradientBrush> 
<LinearGradientBrush x:Key="ButtonGlassBrushPressed" EndPoint="0.5,0" StartPoint="0.5,1"> 
    <GradientStop Color="White"/> 
    <GradientStop Color="#00000000" Offset="0.31"/> 
</LinearGradientBrush> 
<ControlTemplate x:Key="ButtonControlTemplate1" TargetType="{x:Type Button}"> 
    <Grid> 
     <VisualStateManager.VisualStateGroups> 
      <VisualStateGroup x:Name="CommonStates"> 
       <VisualState x:Name="Normal" /> 
       <VisualState x:Name="Pressed"> 
        <Storyboard> 
         <ObjectAnimationUsingKeyFrames 
          Storyboard.TargetName="_glassBorder" 
          Storyboard.TargetProperty="Background" 
          Duration="0:0:1" 
          RepeatBehavior="Forever"> 
          <ObjectAnimationUsingKeyFrames.KeyFrames> 
           <DiscreteObjectKeyFrame KeyTime="0:0:1" Value="{StaticResource ButtonGlassBrushPressed}" /> 
          </ObjectAnimationUsingKeyFrames.KeyFrames> 
         </ObjectAnimationUsingKeyFrames> 
        </Storyboard> 
       </VisualState> 
      </VisualStateGroup> 
     </VisualStateManager.VisualStateGroups> 
     <Border BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Left" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" VerticalAlignment="Top" Margin="0,0,0,-21.167" CornerRadius="5"> 
      <Border.Background> 
       <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
        <GradientStop Color="Black" Offset="0"/> 
        <GradientStop Color="#FF803A3A" Offset="1"/> 
       </LinearGradientBrush> 
      </Border.Background> 
      <Border BorderThickness="1" CornerRadius="5" x:Name="_glassBorder" Background="{StaticResource ButtonGlassBrushNormal}"> 
       <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> 
      </Border> 
     </Border> 
    </Grid> 
</ControlTemplate> 

我猜这将是头slappingly简单,但我究竟错在这里做?

回答

2

不要在故事板上设置持续时间,也可能为零KeyTime。此外,你还必须申报的鼠标悬停状态,否则按下状态会持续到鼠标离开按钮:

<VisualStateGroup x:Name="CommonStates"> 
    <VisualState x:Name="Normal"/> 
    <VisualState x:Name="MouseOver"/> 
    <VisualState x:Name="Disabled"/> 
    <VisualState x:Name="Pressed"> 
     <Storyboard> 
      <ObjectAnimationUsingKeyFrames 
       Storyboard.TargetName="_glassBorder" 
       Storyboard.TargetProperty="Background"> 
       <ObjectAnimationUsingKeyFrames.KeyFrames> 
        <DiscreteObjectKeyFrame KeyTime="0:0:0" 
         Value="{StaticResource ButtonGlassBrushPressed}"/> 
       </ObjectAnimationUsingKeyFrames.KeyFrames> 
      </ObjectAnimationUsingKeyFrames> 
     </Storyboard> 
    </VisualState> 
</VisualStateGroup> 
+0

这是它的持续时间和零关键时间。谢谢! – 2015-02-08 22:22:22

0

那是,如果你不关心的动画,你应该做的方式(像我):

<VisualState x:Name="Pressed"> 
     <Storyboard> 
      <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="_glassBorder"> 
        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ButtonGlassBrushPressed}"/> 
      </ObjectAnimationUsingKeyFrames> 
     </Storyboard> 
</VisualState>