WPF中全局开启或关闭动画效果

公司开发的WPF项目中,要求有这样一个业务:用户可以开启或关闭动画效果。WPF的绚丽之处就是3D、动画、特效等等,给人非常炫的感觉,但是机器配置较差的用户可能需要关闭动画特效。
我甚至遇到一个3D特效在显卡不好机器上,导致应用程序崩溃的情况。可见WPF对机器的要求还是比较高的。如果才能做到呢?需要以下几步就能轻松完成。

初始状态:

鼠标移动到矩形上颜色更改


1.建立两个资源字典,分别为Storyboards.xaml和NonStoryboards.xaml
见项目文件截图:

Storyboards.xaml里放有动画的内容
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Storyboard x:Key="Storyboard1"> <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="rectangle"> <EasingColorKeyFrame KeyTime="0:0:0.5" Value="Yellow"/> </ColorAnimationUsingKeyFrames> </Storyboard> <Storyboard x:Key="Storyboard2"> <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="rectangle"> <EasingColorKeyFrame KeyTime="0" Value="Yellow"/> <EasingColorKeyFrame KeyTime="0:0:0.5" Value="#FF6B6B9B"/> </ColorAnimationUsingKeyFrames> </Storyboard> </ResourceDictionary>
NonStoryboards.xaml里放有没有动画的内容,并保证Key一致
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Storyboard x:Key="Storyboard1"> </Storyboard> <Storyboard x:Key="Storyboard2"> </Storyboard> </ResourceDictionary>

2.在App.xaml.cs增加一个静态方法,加载资源字典,定义在App中,好处是应用程序级别设置,而不是针对某个窗体
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Linq; using System.Windows; namespace AnimationSwitch { /// <summary> /// App.xaml 的交互逻辑 /// </summary> public partial class App : Application { protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); App.LoadResources(true); } public static void LoadResources(bool allowStoryboard) { string resFilename = "/Res/" + (allowStoryboard ? "Storyboards.xaml" : "NonStoryboards.xaml"); ResourceDictionary resDic = new ResourceDictionary { Source = new Uri(resFilename, UriKind.Relative) }; Application.Current.Resources.MergedDictionaries.Clear(); Application.Current.Resources.MergedDictionaries.Add(resDic); } } }

3.在窗体设置对象与对象的动画,以及动画效果的CheckBox开关
这里要注意的是:Storyboard="{DynamicResource Storyboard1}必须使用DynamicResource(动态资源),如果使用了StaticResource则第一次加载后,不会更改。
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Class="AnimationSwitch.MainWindow" Title="MainWindow" Height="350" Width="525"> <Window.Resources> </Window.Resources> <Window.Triggers> <EventTrigger RoutedEvent="Mouse.MouseEnter" SourceName="rectangle"> <BeginStoryboard Storyboard="{DynamicResource Storyboard1}"/> </EventTrigger> <EventTrigger RoutedEvent="Mouse.MouseLeave" SourceName="rectangle"> <BeginStoryboard Storyboard="{DynamicResource Storyboard2}"/> </EventTrigger> </Window.Triggers> <Grid> <Rectangle x:Name="rectangle" HorizontalAlignment="Left" Margin="79,43,0,0" Stroke="Black" Width="162" Fill="#FF6B6B9B" Height="99" VerticalAlignment="Top" RadiusY="22.5" RadiusX="22.5" d:LayoutOverrides="VerticalAlignment" /> <CheckBox Content="动画效果" HorizontalAlignment="Left" Margin="99,178,0,0" VerticalAlignment="Top" IsChecked="True" Width="80" Click="CheckBox_Click" /> </Grid> </Window>
CheckBox事件:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace AnimationSwitch { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void CheckBox_Click(object sender, RoutedEventArgs e) { CheckBox checkBox=sender as CheckBox; App.LoadResources(checkBox.IsChecked.Value); } } }

到此大功告成!
源代码下载:http://download.csdn.net/source/3349597

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现WPF的渐变淡入淡出动画效果,可以使用Opacity属性配合DoubleAnimation来实现。Opacity属性表示元素的不透明度,其值从0到1,0表示完全透明,1表示完全不透明。而DoubleAnimation则可以控制动画的开始值、结束值、动画持续时间等参数。 下面是一个简单的示例,实现了一个Button的渐变淡入淡出动画效果: ```xml <Button Content="Click me!" x:Name="myButton" Opacity="0"> <Button.Triggers> <EventTrigger RoutedEvent="Button.Loaded"> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.TargetName="myButton" Storyboard.TargetProperty="Opacity" From="0" To="1" Duration="0:0:1" /> <DoubleAnimation Storyboard.TargetName="myButton" Storyboard.TargetProperty="Opacity" From="1" To="0" Duration="0:0:1" BeginTime="0:0:2" /> </Storyboard> </BeginStoryboard> </EventTrigger> </Button.Triggers> </Button> ``` 以上代码,Button的Opacity属性初始化为0,即完全透明。在Button的Loaded事件触发时,开始一个Storyboard,其包含两个DoubleAnimation动画,第一个动画实现渐变淡入,持续1秒钟;第二个动画实现渐变淡出,持续1秒钟,开始时间为2秒钟后。Storyboard的TargetName和TargetProperty属性分别指定了动画的目标元素和目标属性。 需要注意的是,如果要反复播放渐变淡入淡出动画效果,可以使用RepeatBehavior属性,设置动画的重复次数或重复时长。例如,设置动画重复3次: ```xml <DoubleAnimation Storyboard.TargetName="myButton" Storyboard.TargetProperty="Opacity" From="0" To="1" Duration="0:0:1" RepeatBehavior="3x" /> ``` 以上就是WPF实现渐变淡入淡出的动画效果的简单示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值