当前位置: 首页 > news >正文

渭南华阴建设银行的网站是多少威海微网站建设

渭南华阴建设银行的网站是多少,威海微网站建设,微信网站开发哪家好,做网约车网站系列文章将分步解读音乐播放器核心业务及代码#xff1a; 深入解读.NET MAUI音乐播放器项目#xff08;一#xff09;#xff1a;概述与架构深入解读.NET MAUI音乐播放器项目#xff08;二#xff09;#xff1a;播放内核深入解读.NET MAUI音乐播放器项目#xff08;三…系列文章将分步解读音乐播放器核心业务及代码 深入解读.NET MAUI音乐播放器项目一概述与架构深入解读.NET MAUI音乐播放器项目二播放内核深入解读.NET MAUI音乐播放器项目三界面与交互 为什么想起来这个项目了呢 这是一个Windows Phone 8的老项目2014年用作为兴趣写了个叫“番茄播放器”的App顺便提高编程技能。 这个项目的架构历经多次迁移从WP8到UWP再到Xamarin.Forms。去年底随着MAUI的正式发布又尝试把它迁移到MAUI上来。 虽然历经数次迁移但命名空间和播放内核的代码基本没怎么改动这个项目随着解决方案升级依赖库、API调用方式的变更见证了微软在移动互联网领域的动荡。我偶然发现8年前提交到微软商店的App竟然还能够打开下载页面 - Microsoft应用商店但由于我手边没有一台Windows Phone设备也没法让它在任何的模拟器中跑起来。也只能从商店截图和源代码中重温这个物件和那段时光。 这个项目现在已经没有任何的商业价值但我知道它对于我意味着什么曾给我带来的在编程时的那种欣喜和享受可以说真正让我知道什么叫“Code 4 Fun”——编程带来的快乐对于那时刚进入社会的我树立信心和坚持道路有莫大的帮助。 这个项目可能从来就没有价值。那么写博文和开源能发挥多少价值就算多少吧。 当下在.Net平台上有不少开源的音频封装库如Plugin.Maui.Audio本项目没有依赖任何音频的第三方库希望大家以学习的态度交流如果您有更好的实现方式欢迎在文章下留言。因为代码年代久远且近年来没有重构C#语言版本和代码写法上会有不少繁冗这里还要向大家说声抱歉。 架构 使用Abp框架我之前写过如何 将Abp移植进.NET MAUI项目本项目也是按照这篇博文完成项目搭建。 跨平台 使用.NET MAU实现跨平台支持从Xamarin.Forms移植的应用可以在Android和iOS平台上顺利运行。 播放内核是由分部类提供跨平台支持的在Xamarin.Forms时代需要维护不同平台的项目MAUI是单个项目支持多个平台。 MAUI 应用项目包含 一个 Platform 文件夹每个子文件夹表示 .NET MAUI 可以面向的平台 每个文件夹代表了每个平台特定的代码, 在默认的情况下 编译阶段仅仅会编译当前选择的平台文件夹代码。 这属于利用分部类和方法创建平台特定内容详情请参考官方文档 如IMusicControlService在项目中分部类实现 MatoMusic.Core\Impl\MusicControlService.cs MatoMusic.Core\Platforms\Android\MusicControlService.cs MatoMusic.Core\Platforms\iOS\MusicControlService.cs MatoMusic.Core\Platforms\Windows\MusicControlService.cs核心类 在设计播放内核时从用户的交互路径思考抽象出了曲目管理器IMusicInfoManager和播放控制服务IMusicControlService 播放器行为和曲目操作行为在各自领域相互隔离通过生产-消费模型数据流转和消息通知冒泡协调一致。尽量规避了大规模使用线程锁以及复杂的线程同步逻辑。在跨平台方案中通过分部类实现了这些接口类图如下 音乐播放相关服务类MusicRelatedService是播放控制服务的一层封装在实际播放器业务逻辑上利用封装的代码能更方便的完成任务。 项目遵循MVVM设计模式MusicRelatedViewModel作为音乐播放相关ViewModel的基类包含了曲目管理器IMusicInfoManager和播放控制服务IMusicControlService对象通过双向绑定开发者可以从表现层轻松进行音乐控制和曲目访问 ViewModelBase是个基础类它继承自AbpServiceBase封装了Abp框架通用功能的调用。比如Setting、Localization和UnitOfWork功能。并且实现了INotifyPropertyChanged它为绑定类型的每个属性提供变更事件。 核心类图如下 定义 Queue - 歌曲队列当前用于播放歌曲的有序列表Playlist - 歌单存储可播放内容的集合用于收藏曲目添加到我的最爱等。PlaylistEntry - 歌单条目可播放内容关联一个本地音乐或在线音乐信息MyFavourite - 我的最爱一个id为0的特殊的歌单不可编辑和删除用于记录点亮歌曲小红心MusicInfo - 曲目信息AlbumInfo - 专辑信息ArtistInfo - 艺术家信息BillboardInfo - 排行榜在线音乐歌单 曲目 曲目包含 Title - 音乐标题AlbumTitle - 专辑标题GroupHeader - 标题头用于列表分组显示的依据Url - 音频文件地址Artist - 艺术家Genre - 流派IsFavourite - 是否已“我最喜爱”IsPlaying - 是否正在播放AlbumArtPath - 封面图片Duration - 歌曲总时长 如果配合模糊搜索控件需要实现IClueObject使用方式请参考AutoComplete控件 public class MusicInfo : ObservableObject, IBasicInfo, IClueObject { .. } public Liststring ClueStrings {get{var result new Liststring();result.Add(Title);result.Add(Artist);result.Add(AlbumTitle);return result;} }它继承自ObservableObject构造函数中注册属性更改事件 IsFavourite更改时将调用MusicInfoManager将当前曲目设为或取消设为“我最喜爱” private void MusicInfo_PropertyChanged(object sender, PropertyChangedEventArgs e) {var MusicInfoManager IocManager.Instance.ResolveMusicInfoManager();if (e.PropertyName nameof(IsFavourite)){if (IsFavourite){MusicInfoManager.CreatePlaylistEntryToMyFavourite(this);}else{MusicInfoManager.DeletePlaylistEntryFromMyFavourite(this);}} }曲目集合 曲目集合是歌单音乐专辑或者艺术家演唱者创作的音乐的抽象它包含 Title - 标题歌单音乐专辑或者艺术家名称GroupHeader - 标题头用于列表分组显示的依据Musics - 曲目信息集合AlbumArtPath - 封面图片Count - 歌曲集合曲目数Time - 歌曲集合总时长 它继承自ObservableObject AlbumInfoArtistInfoPlaylistInfoBillboardInfo 都是曲目集合的子类 Musics是曲目集合的内容类型为ObservableCollectionMusicInfo双向绑定时提供队列变更事件。 集合曲目数和集合总时长依赖这个变量 public int Count Musics.Count();public string Time {get{var totalSec Math.Truncate((double)Musics.Sum(c (long)c.Duration));var totalTime TimeSpan.FromSeconds(totalSec);var time totalTime.ToString(g);return time;} }当集合内容增删时同步通知歌曲集合曲目数以及总时长变更 private void _musics_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) {if (e.Action NotifyCollectionChangedAction.Remove || e.Action NotifyCollectionChangedAction.Add){RaisePropertyChanged(nameof(Time));RaisePropertyChanged(nameof(Count));} }GroupHeader标题头一般取得是标题的首字母若标题为中文则使用Microsoft.International.Converters.PinYinConverter获取中文第一个字的拼音首字母跨平台实现方式如下 private partial string GetGroupHeader(string title) {string result string.Empty;if (!string.IsNullOrEmpty(title)){if (Regex.IsMatch(title.Substring(0, 1), ^[\u4e00-\u9fa5]$)){try{var chinese new ChineseChar(title.First());result chinese.Pinyins[0].Substring(0, 1);}catch (Exception ex){return string.Empty;}}else{result title.Substring(0, 1);}}return result;}GroupHeader用于列表分组显示的内容将在后续文章中阐述 数据库 应用程序里使用Sqlite作为播放列表歌单设置等数据的持久化 使用CodeFirst方式用EF初始化Sqlite数据库文件mato.db 在MatoMusic.Core项目的appsettings.json中添加本地sqlite连接字符串 ConnectionStrings: {Default: Data Sourcefile:{0};},...这里文件是一个占位符通过代码hardcode到配置文件 在MatoMusicCoreModule.cs中重写PreInitialize并设置Configuration.DefaultNameOrConnectionString public override void PreInitialize() {LocalizationConfigurer.Configure(Configuration.Localization);Configuration.Settings.Providers.AddCommonSettingProvider();string documentsPath Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), MatoMusicConsts.LocalizationSourceName);var configuration AppConfigurations.Get(documentsPath, development);var connectionString configuration.GetConnectionString(MatoMusicConsts.ConnectionStringName);var dbName mato.db;string dbPath Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), MatoMusicConsts.LocalizationSourceName, dbName);Configuration.DefaultNameOrConnectionString String.Format(connectionString, dbPath);base.PreInitialize(); } 接下来定义实体类 播放队列 定义于\MatoMusic.Core\Models\Entities\Queue.cs public class Queue : FullAuditedEntitylong {[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]public override long Id { get; set; }public long MusicInfoId { get; set; }public int Rank { get; set; }public string MusicTitle { get; set; } } 歌单 定义于\MatoMusic.Core\Models\Entities\Playlist.cs public class Playlist : FullAuditedEntitylong {[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]public override long Id { get; set; }public string Title { get; set; }public bool IsHidden { get; set; }public bool IsRemovable { get; set; }public ICollectionPlaylistItem PlaylistItems { get; set; } } 歌单条目 定义于\MatoMusic.Core\Models\Entities\PlaylistItem.cs public class PlaylistItem : FullAuditedEntitylong {[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]public override long Id { get; set; }public int Rank { get; set; }public long PlaylistId { get; set; }[ForeignKey(PlaylistId)]public Playlist Playlist { get; set; }public string MusicTitle { get; set; }public long MusicInfoId { get; set; } } 配置 数据库上下文对象MatoMusicDbContext定义如下 public class MatoMusicDbContext : AbpDbContext {//Add DbSet properties for your entities...public DbSetQueue Queue { get; set; }public DbSetPlaylist Playlist { get; set; }public DbSetPlaylistItem PlaylistItem { get; set; }...MatoMusic.EntityFrameworkCore是应用程序数据库的维护和管理项目依赖于Abp.EntityFrameworkCore。 在MatoMusic.EntityFrameworkCore项目中csproj文件中引用下列包 PackageReference IncludeAbp.EntityFrameworkCore Version7.4.0 / PackageReference IncludeMicrosoft.EntityFrameworkCore Version7.0.0 / PackageReference IncludeMicrosoft.EntityFrameworkCore.Sqlite Version7.0.0 / PackageReference IncludeMicrosoft.EntityFrameworkCore.Sqlite.Design Version1.1.6 / PackageReference IncludeMicrosoft.EntityFrameworkCore.Tools Version7.0.0在该项目MatoMusicEntityFrameworkCoreModule.cs 中将注册上下文对象并在程序初始化运行迁移此时将在设备上生成mato.db文件 public override void PostInitialize() {Helper.WithDbContextHelper.WithDbContextMatoMusicDbContext(IocManager, RunMigrate);if (!SkipDbSeed){SeedHelper.SeedHostDb(IocManager);} }public static void RunMigrate(MatoMusicDbContext dbContext) {dbContext.Database.Migrate(); }项目地址 GitHub:MatoMusic 下一章将介绍播放器核心功能播放服务类
http://www.dnsts.com.cn/news/158188.html

相关文章:

  • 自己如何做购物网站如何修改公司网站内容
  • 网站模板目录一个新品牌怎样营销推广
  • wordpress 插件路径seo优化能提高网站的流量吗
  • 北京市住房城乡建设部网站古镇免费网站建设
  • 做网站纸张大小邢台ps网络设计
  • 起重机网站怎么做只做一页的网站多少钱
  • 公司需要一个简单的网站保定市网站制作
  • 海口公司网站建设西安市建设工程交易信息网
  • 贵阳网络营销推广专家大连网站seo顾问
  • 做静态网站步骤如何优化关键词提升相关度
  • 一键网站建站系统房屋设计软件有哪些
  • 给企业做网站用什么程序机械类外贸网站建设
  • 制作app免费网站模板下载什么是网络广告营销
  • 邵阳做网站的公司网站的关键词
  • 中国人做外贸网站都卖什么wordpress 工具安装教程
  • 站长怎么添加网站内容二级域名注册平台
  • 做轮播海报的网站网站后台上传图片失败
  • 哪个网站做的游戏好玩wordpress mu下载
  • 网站访客qq号码获取mine-video wordpress
  • 网站地图无法生成2023一般纳税人企业所得税怎么算
  • 如何找网站制作wordpress 国产主题
  • 青岛网站制作设计设计工作一般多少工资
  • 大型大型网站制作兰州网站建设运营方案
  • 品牌建设 网站网站建设费属于哪个税种
  • 外贸网站优势注册公司流程和费用公司注册
  • 标准网站建设合同网站备案每年一次
  • 古董交易网站怎么做泰州做网站淘宝
  • 中国建设银行网站签名通下载郑州的建设网站有哪些手续费
  • 微页制作网站模板下载天津网站建设优化企业
  • 贵阳建网站做任务领积分兑换别的网站上的会员