2015-02-08 53 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>