WPF 实现音频播放动画控件

WPF开发者QQ群

此群已满340500857 ,请加新群458041663

       由于微信群人数太多入群请添加小编微信号

 yanjinhuawechatW_Feng_aiQ 邀请入群

 需备注WPF开发者 

01

代码如下

一、创建AnimationAudio.xaml代码如下。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:controls="clr-namespace:WPFDevelopers.Controls"xmlns:helpers="clr-namespace:WPFDevelopers.Helpers"><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="Basic/ControlBasic.xaml"/><ResourceDictionary Source="Basic/Animations.xaml"/></ResourceDictionary.MergedDictionaries><Style TargetType="{x:Type controls:AnimationAudio}" BasedOn="{StaticResource ControlBasicStyle}"><Setter Property="Width" Value="80"/><Setter Property="Height" Value="35"/><Setter Property="Cursor" Value="Hand"/><Setter Property="Foreground" Value="{DynamicResource WhiteSolidColorBrush}"/><Setter Property="Background" Value="{DynamicResource PrimaryNormalSolidColorBrush}"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type controls:AnimationAudio}"><ControlTemplate.Resources><Storyboard x:Key="PlayStoryboard" RepeatBehavior="Forever"><ObjectAnimationUsingKeyFrames Storyboard.TargetName="PathAudioTwo" Storyboard.TargetProperty="(Path.Visibility)"><DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Hidden}" /></ObjectAnimationUsingKeyFrames><ObjectAnimationUsingKeyFrames Storyboard.TargetName="PathAudioThree" Storyboard.TargetProperty="(Path.Visibility)"><DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Hidden}" /></ObjectAnimationUsingKeyFrames><ObjectAnimationUsingKeyFrames BeginTime="0:0:.3" Duration="0:0:.4" Storyboard.TargetName="PathAudioTwo"Storyboard.TargetProperty="(Path.Visibility)"><DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Visible}" /></ObjectAnimationUsingKeyFrames><ObjectAnimationUsingKeyFrames BeginTime="0:0:.7" Duration="0:0:.4" Storyboard.TargetName="PathAudioThree"Storyboard.TargetProperty="(Path.Visibility)"><DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Visible}" /></ObjectAnimationUsingKeyFrames></Storyboard></ControlTemplate.Resources><Border x:Name="PART_Border" Background="{TemplateBinding Background}" CornerRadius="{TemplateBinding helpers:ControlsHelper.CornerRadius}"SnapsToDevicePixels="True" UseLayoutRounding="True"><Grid><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions><StackPanel Width="20" Height="30" HorizontalAlignment="Left" Orientation="Horizontal" Margin="10,0"RenderTransformOrigin=".5,.5"x:Name="PART_StackPanel"><Path Data="{StaticResource PathAudioOne}" Width="4" Height="6" Stretch="Fill" Fill="{TemplateBinding Foreground}"/><Path x:Name="PathAudioTwo" Data="{StaticResource PathAudioTwo}" Width="6" StrokeThickness="1.5" Stroke="Transparent" Margin="0,7" Stretch="Fill" Fill="{TemplateBinding Foreground}"/><Path x:Name="PathAudioThree" Data="{StaticResource PathAudioThree}" Width="8" Margin="-3,4" Stretch="Fill" Fill="{TemplateBinding Foreground}" StrokeThickness="2" Stroke="Transparent"/></StackPanel><TextBlock VerticalAlignment="Center" Foreground="{TemplateBinding Foreground}"FontSize="{DynamicResource TitleFontSize}"Grid.Column="1"x:Name="PART_TextBlock"><Run x:Name="PART_RunTimeLength"></Run></TextBlock></Grid></Border><ControlTemplate.Triggers><Trigger Property="IsPlay" Value="True"><Trigger.EnterActions><BeginStoryboard x:Name="PlayBeginStoryboard" Storyboard="{StaticResource PlayStoryboard}"/></Trigger.EnterActions><Trigger.ExitActions><StopStoryboard BeginStoryboardName="PlayBeginStoryboard"/></Trigger.ExitActions></Trigger><Trigger Property="IsRight" Value="True"><Setter Property="Grid.Column" TargetName="PART_TextBlock" Value="0"/><Setter Property="HorizontalAlignment" TargetName="PART_TextBlock" Value="Right"/><Setter Property="Grid.Column" TargetName="PART_StackPanel" Value="1"/><Setter Property="HorizontalAlignment" TargetName="PART_StackPanel" Value="Right"/><Setter Property="RenderTransform" TargetName="PART_StackPanel"><Setter.Value><TransformGroup><RotateTransform Angle="180"/></TransformGroup></Setter.Value></Setter></Trigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter></Style></ResourceDictionary>

二、创建AnimationAudioe.cs代码如下。

using System;
using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Interop;
using WPFDevelopers.Helpers;namespace WPFDevelopers.Controls
{[TemplatePart(Name = RunTemplateName, Type = typeof(Run))]public partial class AnimationAudio : Control{const string RunTemplateName = "PART_RunTimeLength";private Run _run;private TimeSpan _timeSpan;private IntPtr _handle;private AudioWindow _win = null;static string[] mediaExtensions = { ".MP3", ".WAV" };/// <summary>/// 音频路径/// </summary>public string AudioPath{get { return (string)GetValue(AudioPathProperty); }set { SetValue(AudioPathProperty, value); }}public static readonly DependencyProperty AudioPathProperty =DependencyProperty.Register("AudioPath", typeof(string), typeof(AnimationAudio), new PropertyMetadata(string.Empty));/// <summary>/// 是否右侧/// </summary>public bool IsRight{get { return (bool)GetValue(IsRightProperty); }set { SetValue(IsRightProperty, value); }}public static readonly DependencyProperty IsRightProperty =DependencyProperty.Register("IsRight", typeof(bool), typeof(AnimationAudio), new PropertyMetadata(false));public bool IsPlay{get { return (bool)GetValue(IsPlayProperty); }set { SetValue(IsPlayProperty, value); }}public static readonly DependencyProperty IsPlayProperty =DependencyProperty.Register("IsPlay", typeof(bool), typeof(AnimationAudio), new PropertyMetadata(false, new PropertyChangedCallback(OnIsPlayChanged)));private static void OnIsPlayChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){bool newValue = (bool)e.NewValue;var animationAudio = d as AnimationAudio;if(newValue != (bool)e.OldValue){if (newValue){animationAudio.Play();}else{AudioPlayer.Stop();}}}static AnimationAudio(){DefaultStyleKeyProperty.OverrideMetadata(typeof(AnimationAudio), new FrameworkPropertyMetadata(typeof(AnimationAudio)));}public override void OnApplyTemplate(){base.OnApplyTemplate();_run = GetTemplateChild(RunTemplateName) as Run;if (string.IsNullOrWhiteSpace(AudioPath)) return;if (!File.Exists(AudioPath)) return;if (!mediaExtensions.Contains(Path.GetExtension(AudioPath), StringComparer.OrdinalIgnoreCase)) return;_timeSpan = AudioPlayer.GetSoundLength(AudioPath);if (_timeSpan == TimeSpan.Zero) return;_run.Text = $"{_timeSpan.Seconds.ToString()}\"";Width = 80;if (_timeSpan.Seconds > 5){Width += _timeSpan.Seconds;}}private void Play(){if(_win != null){_win.Close();_win = null;}_win = new AudioWindow{Width = 0,Height = 0,Left = Int32.MinValue,Top = Int32.MinValue,WindowStyle = WindowStyle.None,ShowInTaskbar = false,ShowActivated = false,};_win.Show();_win.StopDelegateEvent += _win_StopDelegateEvent;_handle = new WindowInteropHelper(_win).Handle;AudioPlayer.PlaySong(AudioPath, _handle);}private void _win_StopDelegateEvent(){IsPlay = false;_win.Close();_win = null;}}
}

三、新建AudioWindow.cs代码如下。

using System;
using System.Windows;
using System.Windows.Interop;namespace WPFDevelopers.Controls
{public class AudioWindow:Window{const int MM_MCINOTIFY = 0x3B9;public delegate void StopDelegate();public event StopDelegate StopDelegateEvent;protected override void OnSourceInitialized(EventArgs e){base.OnSourceInitialized(e);HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;if (hwndSource != null){hwndSource.AddHook(new HwndSourceHook(this.WndProc));}}IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled){switch (msg){case MM_MCINOTIFY:StopDelegateEvent?.Invoke();break;}return IntPtr.Zero;}}
}

四、新建AnimationAudioExample.xaml代码如下。

<UserControl x:Class="WPFDevelopers.Samples.ExampleViews.AnimationAudioExample"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WPFDevelopers.Samples.ExampleViews"xmlns:wpfdev="https://github.com/WPFDevelopersOrg/WPFDevelopers"mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"><UniformGrid Columns="2" x:Name="MyUniformGrid"><StackPanel Orientation="Horizontal"><wpfdev:BreathLamp Width="60" Height="60" LampEffect="Ripple"IsLampStart="true"Margin="10,0"><Ellipse Width="50" Height="50"><Ellipse.Fill><ImageBrush ImageSource="pack://application:,,,/WPFDevelopers.Samples;component/Images/Breathe/0.jpg"/></Ellipse.Fill></Ellipse></wpfdev:BreathLamp><wpfdev:AnimationAudio x:Name="AnimationAudioLeft" MouseDown="AnimationAudioLeft_MouseDown"/></StackPanel><StackPanel Orientation="Horizontal"HorizontalAlignment="Right"><wpfdev:AnimationAudio x:Name="AnimationAudioRight" IsRight ="true" Background="{DynamicResource SuccessSolidColorBrush}"Foreground="Black"MouseDown="AnimationAudioLeft_MouseDown"/><wpfdev:BreathLamp Width="50" Height="50" LampEffect="Streamer"Background="LightGray"IsLampStart="True"Margin="10,0"><Ellipse Width="43" Height="43"><Ellipse.Fill><ImageBrush ImageSource="pack://application:,,,/WPFDevelopers.Samples;component/Images/Chat/UserImages/yanjinhua.png"/></Ellipse.Fill></Ellipse></wpfdev:BreathLamp></StackPanel></UniformGrid>
</UserControl>

六、新建AnimationAudioExample.xaml.cs下。

using System;
using System.IO;
using System.Windows.Controls;
using WPFDevelopers.Controls;
using WPFDevelopers.Samples.Helpers;namespace WPFDevelopers.Samples.ExampleViews
{/// <summary>/// 微信公众号:WPF开发者/// </summary>public partial class AnimationAudioExample : UserControl{public AnimationAudioExample(){InitializeComponent();AnimationAudioLeft.AudioPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Resources", "Audio", "HelloWPFDevelopes_en.mp3");AnimationAudioRight.AudioPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Resources", "Audio", "HelloWPFDevelopes_zh.mp3");}private void AnimationAudioLeft_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e){var animationAudio = sender as AnimationAudio;var animationAudioList = ElementVisualTreeHelper.FindVisualChild<AnimationAudio>(MyUniformGrid);if (animationAudioList == null) return;if (!animationAudio.IsPlay){animationAudioList.ForEach(h =>{if (h.IsPlay && h != animationAudio){h.IsPlay = false;}});animationAudio.IsPlay = true;}elseanimationAudio.IsPlay = false;}}
}

02


效果预览

鸣谢素材提供者 - 吴锋

源码地址如下

Github:https://github.com/WPFDevelopersOrg

Gitee:https://gitee.com/WPFDevelopersOrg

WPF开发者QQ群: 340500857 | 458041663

Github:https://github.com/WPFDevelopersOrg

出处:https://www.cnblogs.com/yanjinhua

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

转载请著名作者 出处 https://github.com/WPFDevelopersOrg

a36e8a58535806169ca2dccf3c4bab94.png

扫一扫关注我们,

9d654345e01b60c4541e219d450948bb.gif

更多知识早知道!

f7dbb26ca3d83d87fa906e5ac2ed72bc.gif

点击阅读原文可跳转至源代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290090.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

#51CTO学院四周年# 还好没放弃,终于等到你~

作为一个小白&#xff0c;恩&#xff0c;白的不能再白的样子~游走于大佬身旁~每每看见大佬功成名就的样子~我就只能画饼充饥~望梅止渴~还好没放弃~在这里发现了小白变大佬的隧道~这里的人呐~都非常友善~这里的知识啊~性价比都超高~如果有来生&#xff0c;我希望早点遇见你~我们…

开始ubuntu 14.04 的装X模式---终端模式下中文输入,听歌,上irc 开启framebuffer看电影 截图...

先上图吧 卡卡的全是在tty1 下的操作&#xff0c;看电影&#xff0c;听歌&#xff0c;截图 &#xff0c;看图 &#xff0c;上irc 等等&#xff0c;相当适合在小白面前装屁&#xff01; 需要安装的软件&#xff1a; 为了能正常显示中文&#xff1a;安装fbterm sudo apt-get ins…

.NET6中关于Minimal API的简单使用

微信公众号&#xff1a;趣编程ACE收集并分享日常的.NET实战开发技巧,源码获取关注后回复 源码;**如果觉得本公众号对您有帮助&#xff0c;欢迎关注本文来自社区群粉丝投稿.NET6中关于Minimal API的简单使用详细文档参考官网 https://docs.microsoft.com/en-us/aspnet/core/fund…

DVR分布式路由

1. 背景 没有使用DVR的场景&#xff1a; 从图中可以明显看到东西向和南北向的流量会集中到网络节点&#xff0c;这会使网络节点成为瓶颈。 如果启用DVR&#xff0c;如下图&#xff1a; 对于东西向的流量&#xff0c; 流量会直接在计算节点之间传递。 对于南北向的流量&#xff…

求斐波那契数列的特征方程和通项公式

1、斐波那契数列 f(1) 1; f(2) 1; f(3) f(1) f(2);以此内推1 x 1f(x) 1 x 2f(x - 1) f(x - 2) x > 32、特征方程 解释&#xff1a;特征方程是为研究相应的数学对象而引入的一些等式&#xff0c;它因数学对象不同而不…

php实现pdf文件的生成与下载

2019独角兽企业重金招聘Python工程师标准>>> 这个有点复杂的&#xff0c;我们一步一步来说明。 受先我们要下载pdf需要的文件&#xff0c;搜索‘php生成pdf’找到相关进行下载&#xff0c;这里不做介绍 //pdf下载$name $_SESSION[ex_uname];$name_pdf$name..pdf;$u…

window 效率神器:Wox

官方网站 http://www.getwox.com/ 下载后以管理员身份运行&#xff0c;右下角可以看到Wox的图标。点击setting可以进入主界面 如果看不懂可以将语言设置为中文 默认快捷键是Alt space 热键呼出。你理应习惯这个风格。这是你高效率的开始 进入主题&#xff08;Theme&#xff09…

scala入门-01-IDEA安装scala插件

2019独角兽企业重金招聘Python工程师标准>>> 由于本人一直使用IDEA开发Java项目&#xff0c;目前scala也可以使用IDEA开发&#xff0c;下载地址&#xff1a;http://www.jetbrains.com/idea/ Community Edition FREE 和 Ultimate Edition Free 30-day trial都支撑s…

GeneralUpdate20220323里程碑版本发布

大家好我是juster&#xff0c;GeneralUpdate的开源项目作者。这次将发布GeneralUpdate里程碑版本&#xff0c;该版本发生了巨大改变历时4个月的时间终于要和大家见面了。开源不易希望大家能多多支持。可能或多或少会有些bug希望大家多多反馈&#xff0c;这里也有一个小小的心愿…

FFmpeg的HEVC解码器源码简单分析:解码器主干部分

HEVC源码分析文章列表&#xff1a;【解码 -libavcodec HEVC 解码器】FFmpeg的HEVC解码器源码简单分析&#xff1a;概述FFmpeg的HEVC解码器源码简单分析&#xff1a;解析器&#xff08;Parser&#xff09;部分FFmpeg的HEVC解码器源码简单分析&#xff1a;解码器主干部分FFmpeg的…

.NET 产品组问卷调查|和我们分享你的 .NET 使用情况

作为一名 .NET 开发者&#xff0c;是什么让你开始学习 .NET&#xff1f;在你看来 .NET 在哪些场景下最有效&#xff1f;在平时的工作或学习中&#xff0c;你都在哪里学习 .NET 资源&#xff1f;你更希望在哪里看到更多 .NET 本地化内容&#xff1f;你觉得 .NET 的社区推动力如何…

C#+SQL Server数据库系统操作日志的实现完整案例

在开发数据库系统时,通常需要添加系统日志功能。系统日志是用来记录用户、管理员等对系统的操作记录,系统操作日志的实现方式有很多,本文基于C#和SQL Server数据库,通过设计日志记录表、编写操作记录存储过程、前端调用与展示结果等过程,实现操作日志功能完整程序设计流程…

使用机器学习算法在 .NET Core 中运行的 100% C# 开源 AI 聊天机器人平台构建器...

简介BotSharp是一个用于 AI Bot 平台构建器的开源机器学习框架。该项目涉及自然语言理解、计算机视觉和音频处理技术&#xff0c;旨在推动智能机器人助手在信息系统中的开发和应用。开箱即用的机器学习算法让普通程序员可以更快、更轻松地开发人工智能应用程序。地址https://gi…

win下nginx+php+mysql服务器套装_WNMP(Windows+Nginx+PHP+MySQL)安装

这篇文章介绍的内容是关于WNMP(Windows Nginx PHP MySQL) 安装&#xff0c;有着一定的参考价值&#xff0c;现在分享给大家&#xff0c;有需要的朋友可以参考一下最近在开发一个新的项目&#xff0c;环境用的是&#xff1a;Nginx1.10.3 下载地址&#xff1a; http://nginx.o…

本地开发时连接后台数据库时出现的错误,附自救方法

2019独角兽企业重金招聘Python工程师标准>>> 一、跨域问题 现状&#xff1a;后端跨域权限无法打开&#xff0c;现在的浏览器出于安全策略的限制&#xff0c;都是不允许跨域的&#xff0c;但是开发的时候经常需要一些别的域的接口&#xff0c;特别是一些接口不是自己…

Extjs 中的cookie设置

2019独角兽企业重金招聘Python工程师标准>>> 发现Extjs中有两个cookie 其一&#xff1a;设置cookie如下 saveacctisForm.getForm().findField(itemselector).getValue();Ext.util.Cookies.set(saveacct,saveacct); 取cookie中数据如下 var validStatus Ext.util.Co…

Java设计模式----策略模式(Strategy)

1. 策略模式&#xff1a; 策略模式&#xff0c;也称为政策模式,定义如下&#xff1a; 定义一组算法&#xff0c;将每个算法都封装起来&#xff0c;使他们可以相互转化 2. 策略模式的原理是面向对象的继承和多态。策略模式的3个角色 a. Strategy 抽象策略角色 定义每个策略或算…

遥控器原理的分页

索引&#xff1a;前几天看电视&#xff0c;使用遥控器的时候突然想到&#xff0c;我们的数据分页也可以用这种模式。于是敲出来一个类似于遥控器控制电视原理的分页。 现在详细介绍下上图中按钮的作用&#xff1a; 清除按钮&#xff1a;当按下0-9这个几个按钮时&#xff0c;如果…

.NET Core剪裁器升级瘦身引擎,并支持剪裁计划的录制和回放

上周&#xff0c;我发布了对.NET Core程序进行瘦身的开源软件Zack.DotNetTrimmer&#xff0c;与.NET Core内置的剪裁器相比&#xff0c;Zack.DotNetTrimmer不仅对程序的剪裁效果更好&#xff0c;而且还支持WPF、WinForm程序。下面是Zack.DotNetTrimmer与.NET内置的剪裁器的对比…

python 查看当前目录_Python的武器库11:os模块

说到编程语言python&#xff0c;有一个著名的格言"余生太短&#xff0c;只用python"。如果要分析为什么会存在这么一句格言&#xff1f;python的语法并不简单&#xff0c;有复杂难懂的部分&#xff0c;之所以又这样一句格言&#xff0c;是因为python中有很多强大的模…