WPF开发者QQ群: 340500857
前言
需要实现类似音乐播放器字幕滚动动画。
欢迎转发、分享、点赞,谢谢大家~。
效果预览(更多效果请下载源码体验):

一、TextBlockCustomControl.cs代码如下:
public class TextBlockCustomControl : TextBlock { public static readonly DependencyProperty DurationProperty = DependencyProperty.Register("Duration", typeof(TimeSpan), typeof(TextBlockCustomControl), new PropertyMetadata(TimeSpan.FromSeconds(1))); public TimeSpan Duration { get { return (TimeSpan)GetValue(DurationProperty); } set { SetValue(DurationProperty, value); } } public TimeSpan StartDuration { get { return (TimeSpan)GetValue(StartDurationProperty); } set { SetValue(StartDurationProperty, value); } } public static readonly DependencyProperty StartDurationProperty = DependencyProperty.Register("StartDuration", typeof(TimeSpan), typeof(TextBlockCustomControl), new PropertyMetadata(TimeSpan.FromSeconds(1))); public TextBlockCustomControl() { NameScope.SetNameScope(this, new NameScope()); var gradientBrush = new LinearGradientBrush(); gradientBrush.EndPoint = new Point(1, 0.5); gradientBrush.StartPoint = new Point(0, 0.5); var stop1 = new GradientStop(Colors.White, 0); var stop2 = new GradientStop(Colors.White, 1); var stop3 = new GradientStop(Colors.Gray, 1); this.RegisterName("GradientStop1", stop1); this.RegisterName("GradientStop2", stop2); this.RegisterName("GradientStop3", stop3); gradientBrush.GradientStops.Add(stop1); gradientBrush.GradientStops.Add(stop2); gradientBrush.GradientStops.Add(stop3); this.Foreground = gradientBrush; this.Loaded += (s, e) => { Animate(); }; } public override void OnApplyTemplate() { base.OnApplyTemplate(); } private void Animate() { var storyboard = new Storyboard(); var animation1 = new DoubleAnimation(); animation1.From = 0; animation1.To = 1; animation1.Duration = Duration; animation1.BeginTime = StartDuration; Storyboard.SetTargetName(animation1, "GradientStop2"); Storyboard.SetTargetProperty(animation1, new PropertyPath(GradientStop.OffsetProperty)); var animation2 = new DoubleAnimation(); animation2.From = 0; animation2.To = 1; animation2.Duration = Duration; animation2.BeginTime = StartDuration; Storyboard.SetTargetName(animation2, "GradientStop3"); Storyboard.SetTargetProperty(animation2, new PropertyPath(GradientStop.OffsetProperty)); storyboard.Children.Add(animation1); storyboard.Children.Add(animation2); storyboard.Begin(this); } }二、MainWindow.xaml代码如下:
<Window x:Class="WPFSongWords.MainWindow" ="" ="" ="" ="" ="" ="clr-namespace:WPFSongWords" mc:Ignorable="d" Title="WPFDevelopers" Height="650" Width="400" ResizeMode="NoResize" WindowStartupLocation="CenterScreen" TextOptions.TextFormattingMode="Display" UseLayoutRounding="True" SnapsToDevicePixels="True" WindowStyle="None" Background="Transparent" Foreground="White" FontSize="14"> <Window.Resources> <LinearGradientBrush x:Key="DefaultBackgroundBrush" StartPoint="0,0" EndPoint="0,1"> <GradientStop Color="#FF33B9AD" Offset="0" /> <GradientStop Color="#FF007ACC" Offset="1" /> </LinearGradientBrush> </Window.Resources> <shell:WindowChrome.WindowChrome> <shell:WindowChrome GlassFrameThickness="-1" CaptionHeight="40"/> </shell:WindowChrome.WindowChrome> <Grid> <Border Background="{StaticResource DefaultBackgroundBrush}" UseLayoutRounding="True" SnapsToDevicePixels="True" Margin="10"> <Border.Effect> <DropShadowEffect ShadowDepth="1" BlurRadius="6" Direction="270" Opacity="0.75" Color="#FF211613"/> </Border.Effect> </Border> <Grid Margin="10"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition/> <RowDefinition Height="Auto"/> <RowDefinition Height="60"/> </Grid.RowDefinitions> <Grid Height="40" Grid.Row="0"> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <TextBlock Text="WPF开发者" VerticalAlignment="Center" Padding="10,0" FontSize="16"/> <Button Grid.Column="1" Style="{StaticResource CloseButton}" Width="30" Click="BtnCloseClick"> <Button.Content> <Path Data="{StaticResource ClosePath}" Fill="{Binding RelativeSource={RelativeSource AncestorType=Button}, Path=Foreground}" Height="12" Width="12" Stretch="Uniform" StrokeThickness="0"/> </Button.Content> </Button> </Grid> <StackPanel HorizontalAlignment="Center" Grid.Row="1"> <TextBlock Text="中华人民共和国国歌" HorizontalAlignment="Center" FontSize="20" Margin="0,10"/> <ItemsControl ItemsSource="{Binding MusicWordArray,RelativeSource={RelativeSource AncestorType=local:MainWindow}}"> <ItemsControl.ItemTemplate> <DataTemplate> <local:TextBlockCustomControl Text="{Binding SongWords}" StartDuration="{Binding StarTime}" Duration="{Binding RunTime}" Block.TextAlignment="Center" FontSize="15" Margin="0,4"/> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </StackPanel> </Grid> </Grid></Window>三、MainWindow.xaml.cs代码如下:
using System;using System.Collections;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 WPFSongWords{ /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public IEnumerable MusicWordArray { get { return (IEnumerable)GetValue(MusicWordArrayProperty); } set { SetValue(MusicWordArrayProperty, value); } } public static readonly DependencyProperty MusicWordArrayProperty = DependencyProperty.Register("MusicWordArray", typeof(IEnumerable), typeof(MainWindow), new PropertyMetadata(null)); public MainWindow() { InitializeComponent(); this.Loaded += MainWindow_Loaded; } private void MainWindow_Loaded(object sender, RoutedEventArgs e) { var musicWords = new List<MusicWord>(); musicWords.Add(new MusicWord { RunTime = TimeSpan.FromSeconds(1), StarTime = TimeSpan.FromSeconds(0), SongWords = "作词 : 田汉" }); musicWords.Add(new MusicWord { RunTime = TimeSpan.FromSeconds(1), StarTime = TimeSpan.FromSeconds(1), SongWords = "作曲 : 聂耳" }); musicWords.Add(new MusicWord { RunTime = TimeSpan.FromSeconds(0.5), StarTime = TimeSpan.FromSeconds(2), SongWords = "起来!" }); musicWords.Add(new MusicWord { RunTime = TimeSpan.FromSeconds(2), StarTime = TimeSpan.FromSeconds(2.5), SongWords = "不愿做奴隶的人们!!" }); musicWords.Add(new MusicWord { RunTime = TimeSpan.FromSeconds(4), StarTime = TimeSpan.FromSeconds(4.5), SongWords = "把我们的血肉,筑成我们新的长城!"}); musicWords.Add(new MusicWord { RunTime = TimeSpan.FromSeconds(3), StarTime = TimeSpan.FromSeconds(8.5), SongWords = "中华民族到了最危险的时候," }); musicWords.Add(new MusicWord { RunTime = TimeSpan.FromSeconds(3.5), StarTime = TimeSpan.FromSeconds(11.5), SongWords = "每个人被迫着发出最后的吼声。" }); musicWords.Add(new MusicWord { RunTime = TimeSpan.FromSeconds(0.5), StarTime = TimeSpan.FromSeconds(15), SongWords = "起来!" }); musicWords.Add(new MusicWord { RunTime = TimeSpan.FromSeconds(0.5), StarTime = TimeSpan.FromSeconds(15.5), SongWords = "起来!" }); musicWords.Add(new MusicWord { RunTime = TimeSpan.FromSeconds(0.5), StarTime = TimeSpan.FromSeconds(16), SongWords = "起来!" }); musicWords.Add(new MusicWord { RunTime = TimeSpan.FromSeconds(4.5), StarTime = TimeSpan.FromSeconds(16.5), SongWords = "我们万众一心,冒着敌人的炮火前进!" }); musicWords.Add(new MusicWord { RunTime = TimeSpan.FromSeconds(2), StarTime = TimeSpan.FromSeconds(21), SongWords = "冒着敌人的炮火前进!" }); musicWords.Add(new MusicWord { RunTime = TimeSpan.FromSeconds(0.5), StarTime = TimeSpan.FromSeconds(23), SongWords = "前进!" }); musicWords.Add(new MusicWord { RunTime = TimeSpan.FromSeconds(0.5), StarTime = TimeSpan.FromSeconds(23.5), SongWords = "前进!进!" }); MusicWordArray = musicWords; } private void BtnCloseClick(object sender, RoutedEventArgs e) { Close(); } } public class MusicWord { public TimeSpan RunTime { get; set; } public TimeSpan StarTime { get; set; } public string SongWords { get; set; } }}更多教程欢迎关注微信公众号:

WPF开发者QQ群: 340500857
blogs: https://www.cnblogs.com/yanjinhua/p/14345136.html
源码Github:https://github.com/yanjinhuagood/WPFDevelopers.git
gitee:https://gitee.com/yanjinhua/WPFDevelopers.git
原文转载:http://www.shaoqun.com/a/790428.html
网易考拉海购大促:https://www.ikjzd.com/w/1052
c88:https://www.ikjzd.com/w/1017.html
四海商舟:https://www.ikjzd.com/w/1516
环球b2b:https://www.ikjzd.com/w/1762
WPF开发者QQ群:340500857前言需要实现类似音乐播放器字幕滚动动画。欢迎转发、分享、点赞,谢谢大家~。效果预览(更多效果请下载源码体验):一、TextBlockCustomControl.cs代码如下:publicclassTextBlockCustomControl:TextBlock{publicstaticreadonlyDependencyPropertyDurationProp
赛兔:https://www.ikjzd.com/w/2375
西集网:https://www.ikjzd.com/w/1353
imgur:https://www.ikjzd.com/w/156
let go:https://www.ikjzd.com/w/825
houzz:https://www.ikjzd.com/w/236
闺蜜来我家住和男友暧昧 口述男友出轨与闺蜜亲亲我我:http://lady.shaoqun.com/m/a/270117.html
卫生间里干新娘A级小说 口述我与新娘子婚礼当天的疯狂:http://lady.shaoqun.com/a/274142.html
情人用色情A片诱惑我上了她的床:http://lady.shaoqun.com/a/271179.html
老婆的闺蜜用视频向我卖弄双峰:http://www.30bags.com/m/a/251874.html
口述:我嫁了一个18岁的老公:http://www.30bags.com/m/a/253929.html
小说:路过的女人被拐卖到农村,成了粗野男人的妻子。没想到自己恋爱了很久:http://www.30bags.com/a/380328.html
在亚马逊如何拥有爆款产品的Listing?:https://www.ikjzd.com/articles/145622
亚马逊团队上演宫心计?积加为你排忧解难!:https://www.ikjzd.com/articles/145619
No comments:
Post a Comment