2012-09-06 52 views
0

我想动画按钮阴影效果的颜色,当鼠标进入边界。 我试试这个代码,并不适合我。 我不知道问题在哪里?Silverlight动画风格从资源文件

<Style x:Name="HeaderButton" TargetType="Button"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
       <Border x:Name="Border" BorderBrush="#FF550211" BorderThickness="0" CornerRadius="4"> 
        <Border.Triggers> 
         <EventTrigger RoutedEvent="Border.MouseEnter"> 
          <BeginStoryboard> 
           <Storyboard> 
            <ColorAnimation Storyboard.TargetProperty="Color" Storyboard.TargetName="MenuButtonShadow" 
                From="#FFFFFFFF" To="#FF000000" Duration="0:0:0.3"></ColorAnimation> 
           </Storyboard> 
          </BeginStoryboard> 
         </EventTrigger> 
        </Border.Triggers> 
        <Border.Background> 
         <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
          <GradientStop Color="#FFAF1232" Offset="0" /> 
          <GradientStop Color="#FFB60329" Offset="1" /> 
         </LinearGradientBrush> 
        </Border.Background> 
        <ContentPresenter Margin="8, 0" VerticalAlignment="Center" HorizontalAlignment="Center" /> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="Effect"> 
     <Setter.Value> 
      <DropShadowEffect x:Name="MenuButtonShadow" ShadowDepth="0" BlurRadius="4"></DropShadowEffect> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="Foreground" Value="White"></Setter> 
    <Setter Property="Margin" Value="4"></Setter> 
</Style> 

回答

1

MSDN

在Silverlight中,你可以使用一个EventTrigger的唯一事件是Loaded事件。对于其他事件,您应该声明的资源属性情节串连图板,提供故事板一个名称值,编写事件处理程序调用上的命名故事板Begin方法。

我想你可以做这样的事情在你的XAML(虽然我没有测试过):

<Storyboard x:Name="MenuButtonShadowStoryboard"> 
    <ColorAnimation Storyboard.TargetProperty="Color" Storyboard.TargetName="MenuButtonShadow" 
        From="#FFFFFFFF" To="#FF000000" Duration="0:0:0.3"> 
    </ColorAnimation> 
</Storyboard> 

<ControlTemplate TargetType="Button"> 
    <Border x:Name="Border" MouseEnter="Border_MouseEnter"> 
     <!-- omitted for brevity --> 
    </Border> 
</ControlTemplate> 

然后你的事件处理程序调用上的故事板Begin方法:

private void Border_MouseEnter(object sender, MouseEventArgs e) 
{ 
    MenuButtonShadowStoryboard.Begin(); 
} 

您可能想为MouseLeave事件添加类似的内容,这会使颜色回到#FFFFFFFF。

+0

你好,谢谢安德鲁。你能告诉我如何开始在资源文件中的故事板? –

+0

哎呀,我的解决方案假定您有一个代码隐藏文件,但你的问题的标题清楚地表明,你的代码是一个资源文件。抱歉!也许你可以创建一个名为FancyBorder的新UserControl,它包含你在ControlTemplate中定义的边界。在UserControl.Resources中定义Storyboard,并将事件处理程序放入新的UserControl的代码隐藏中。然后在你的资源文件,'<控件模板>'。 ContentPresenter不再是Border的子项,但我认为它仍然看起来一样。希望有所帮助! – Andrew

+0

考虑其他的选择可能是使用[行为/触发】(http://www.silverlightshow.net/items/Behaviors-and-Triggers-in-Silverlight-3.aspx),或[VisualStateManager(HTTP ://msdn.microsoft.com/en-us/library/cc278064(v = VS.95)的.aspx#defining_the_visual_structure_and_visual_behavior_of_a_control_in_a_controltemplate)。 – Andrew