WPF音乐播放器 零基础4个小时左右

news2025/1/17 1:03:12

前言:winfrom转wpf用久的熟手说得最多的是,转回去做winfrom难。。当时不明白。。做一个就知道了。

WPF音乐播放器

入口主程序

 FontFamily="Microsoft YaHei" FontSize="12" FontWeight="ExtraLight"
居中显示
 WindowStartupLocation="CenterScreen" ResizeMode="NoResize"
 Title="音娱乐行音乐播放器" Height="600" Width="1010"
无边框 
<WindowChrome.WindowChrome>
     <WindowChrome GlassFrameThickness="1"/>
 </WindowChrome.WindowChrome>
StackPanel 块  Orientation="Horizontal" 水平显示  HorizontalAlignment="Center" 居中

<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
     <Border Width="28" Height="28" CornerRadius="10">
         <Border.Background>
             <ImageBrush ImageSource="../Assets/Images/Logo.png" Stretch="UniformToFill" 
                         Viewport="-0.3,-0.3,1.6,1.6"
                         Opacity="0.5"/>
         </Border.Background>
         <TextBlock Text="&#xe600;" FontFamily="{StaticResource FF}" VerticalAlignment="Center" HorizontalAlignment="Left"
                FontSize="20" Foreground="ForestGreen" Height="19" Width="18" Margin="-14,0,0,0">
             <TextBlock.Effect>
                 <DropShadowEffect BlurRadius="5" Color="ForestGreen" ShadowDepth="0" Opacity="0.5"/>
             </TextBlock.Effect>
         </TextBlock>
     </Border>
     <TextBlock Text="音娱乐行播放器" VerticalAlignment="Center" Margin="10,0,0,0" Foreground="Orange"
                FontSize="13" FontWeight="Bold"/>
 </StackPanel>

**************

菜单栏目

 <StackPanel Grid.Row="1">
     <RadioButton Content="首页" Tag="&#xe715;" Style="{StaticResource MenuButtonStyle}" IsChecked="True"/>
     <RadioButton Content="有声动态谱" Tag="&#xe715;" Style="{StaticResource MenuButtonStyle}" IsChecked="True"/>
     <RadioButton Content="精品歌单" Tag="&#xe66a;" Style="{StaticResource MenuButtonStyle}"/>
     <RadioButton Content="歌手推荐" Tag="&#xe895;" Style="{StaticResource MenuButtonStyle}"/>
     <RadioButton Content="单曲排行" Tag="&#xe608;" Style="{StaticResource MenuButtonStyle}"/>
     <Label Content="音乐分类" Tag="&#xe62f;" Style="{StaticResource MenuLabelStyle}"/>
     <UniformGrid Columns="3" Margin="40,0,10,0">
         <RadioButton Content="流行" Style="{StaticResource ClassButtonStyle}"/>
         <RadioButton Content="民谣" Style="{StaticResource ClassButtonStyle}"/>
         <RadioButton Content="电子" Style="{StaticResource ClassButtonStyle}"/>
         <RadioButton Content="舞曲" Style="{StaticResource ClassButtonStyle}"/>
         <RadioButton Content="说唱" Style="{StaticResource ClassButtonStyle}"/>
         <RadioButton Content="轻音乐" Style="{StaticResource ClassButtonStyle}"/>
         <RadioButton Content="爵士" Style="{StaticResource ClassButtonStyle}"/>
         <RadioButton Content="乡村" Style="{StaticResource ClassButtonStyle}"/>
         <RadioButton Content="更多" Style="{StaticResource ClassButtonStyle}"/>
     </UniformGrid>
     <Label Content="我的音乐" Tag="&#xe645;" Style="{StaticResource MenuLabelStyle}"/>
     <ItemsControl ItemsSource="{Binding SList}" Margin="40,0,10,0">
         <ItemsControl.ItemTemplate>
             <DataTemplate>
                 <RadioButton Content="{Binding Header}" Tag="{Binding Icon}" 
                              Style="{StaticResource SheetButtonStyle}"/>
             </DataTemplate>
         </ItemsControl.ItemTemplate>
     </ItemsControl>
 </StackPanel>

样式控件

MenuButtonStyle 样式 
// <Border 没法放两个以上对象 需要<StackPanel  包起来  <TextBlock 图标 <ContentPresente 内容
// <ControlTemplate.Triggers> 控件触发器  <Style.Triggers>样式触发器
  <Style TargetType="RadioButton" x:Key="MenuButtonStyle">
       <Setter Property="Foreground" Value="#B1AFBA"/>
       <Setter Property="GroupName" Value="A"/>
       <Setter Property="Template">
           <Setter.Value>
               <ControlTemplate TargetType="RadioButton">
                   <Border BorderBrush="Transparent" BorderThickness="2,0,0,0" 
                           Name="border" Height="30" Margin="0,3">
                       <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" 
                                   VerticalAlignment="Center" Margin="20,0,0,0">
                           <TextBlock Text="{TemplateBinding Tag}" FontFamily="{StaticResource FF}"
                                      FontSize="18"/>
                           <ContentPresenter VerticalAlignment="Center" Margin="10,0,0,0"/>
                       </StackPanel>
                   </Border>
                   <ControlTemplate.Triggers>
                       <Trigger Property="IsChecked" Value="True">
                           <Setter TargetName="border" Property="BorderBrush" Value="#AA6063FB"/>
                       </Trigger>
                   </ControlTemplate.Triggers>
               </ControlTemplate>
           </Setter.Value>
       </Setter>
       <Style.Triggers>
           <Trigger Property="IsChecked" Value="True">
               <Setter Property="Foreground" Value="#6063FB"/>
           </Trigger>
       </Style.Triggers>
   </Style>
MenuLabelStyle 样式
 <Style TargetType="Label" x:Key="MenuLabelStyle">
     <Setter Property="Foreground" Value="#555"/>
     <Setter Property="Template">
         <Setter.Value>
             <ControlTemplate TargetType="Label">
                 <Border BorderBrush="Transparent" BorderThickness="2,0,0,0" 
                         Name="border" Height="30" Margin="0,3">
                     <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" 
                                 VerticalAlignment="Center" Margin="20,0,0,0">
                         <TextBlock Text="{TemplateBinding Tag}" FontFamily="{StaticResource FF}"
                                    FontSize="18"/>
                         <ContentPresenter VerticalAlignment="Center" Margin="10,0,0,0"/>
                     </StackPanel>
                 </Border>
             </ControlTemplate>
         </Setter.Value>
     </Setter>
 </Style>

ClassButtonStyle 样式
        <Style TargetType="RadioButton" x:Key="ClassButtonStyle">
            <Setter Property="Foreground" Value="#B1AFBA"/>
            <Setter Property="FontSize" Value="11"/>
            <Setter Property="GroupName" Value="A"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="RadioButton">
                        <Border Height="24" Background="#EEE" Margin="1" CornerRadius="3"
                                Name="border">
                            <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center"/>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter TargetName="border" Property="Background" Value="#116063FB"/>
                            </Trigger>
                            <Trigger Property="IsChecked" Value="True">
                                <Setter TargetName="border" Property="BorderBrush" Value="#AA6063FB"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <Trigger Property="IsChecked" Value="True">
                    <Setter Property="Foreground" Value="#6063FB"/>
                </Trigger>
            </Style.Triggers>
        </Style>

后台绑定数据

指定关系

 DataContext = new MainViewModel();

右侧内容

 <!--右侧内容-->
 <Grid Grid.Column="1">
     <Grid.RowDefinitions>
         <RowDefinition Height="50"/>
         <RowDefinition/>
     </Grid.RowDefinitions>
     <TextBox Height="28" Width="180" HorizontalAlignment="Left"
              Style="{StaticResource SearchTextBoxStyle}"
              VerticalContentAlignment="Center" Margin="30,0"/>


     <!--页面内容  VerticalScrollBarVisibility="Hidden" 隐藏滚动条-->
     <ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Hidden">
         <Grid Margin="30,0">
             <p:FirstPage/>  fistpage 页面
         </Grid>
     </ScrollViewer>
 </Grid>

爬虫

数据绑定

 <TextBlock Text="热门专辑" VerticalAlignment="Center" FontWeight="Bold"
                Foreground="#555"/>
 <ListBox Grid.Row="1" BorderThickness="0" Background="Transparent"
          ItemsSource="{Binding AlbumList}" ScrollViewer.HorizontalScrollBarVisibility="Hidden">
     <ListBox.ItemsPanel>
         <ItemsPanelTemplate>
             <VirtualizingStackPanel Orientation="Horizontal"/>  水平显示
         </ItemsPanelTemplate>
     </ListBox.ItemsPanel>
     <ListBox.ItemContainerStyle>  模板
         <Style TargetType="ListBoxItem">
             <Setter Property="Template">
                 <Setter.Value>
                     <ControlTemplate TargetType="ListBoxItem">  关键 控件模板
                         <ContentPresenter Margin="5"/>
                     </ControlTemplate>
                 </Setter.Value>
             </Setter>
         </Style>
     </ListBox.ItemContainerStyle>
     <ListBox.ItemTemplate>
         <DataTemplate>    数据模板
             <Grid>
<Grid.RowDefinitions>
    <RowDefinition/>
    <RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<Border Width="100" Height="100" CornerRadius="5" >
    <Border.Background>
        <ImageBrush ImageSource="{Binding Cover}"/>
    </Border.Background>
    <Border.Effect>
        <DropShadowEffect BlurRadius="5" 
                              ShadowDepth="0" Color="Gray" Opacity="0.5"/>
    </Border.Effect>
</Border>

数据列表绑定

数据细节处理

ps:学wpf没有个大屏是个阻力哈哈哈

播放控制器

 DataContext.PlayDownloadCommand,RelativeSource
播放命令指向信息


<Style TargetType="ListBoxItem">
     <Setter Property="Template">
         <Setter.Value>
             <ControlTemplate TargetType="ListBoxItem">
                 <Grid Background="Transparent" Name="root">
                     <ContentPresenter/>

                     <TextBlock Grid.Column="3" 
                                VerticalAlignment="Center" 
                                HorizontalAlignment="Center"
                                Margin="100,0,0,0"
                                FontSize="11" 
                                Name="tb_control" 
                                Visibility="Collapsed">
                         <Hyperlink TextDecorations="None" 
                                    Command="{Binding DataContext.PlayDownloadCommand,RelativeSource={RelativeSource AncestorType=Window}}"
                                    CommandParameter="{Binding}">播放</Hyperlink>
                         <Hyperlink TextDecorations="None">添加</Hyperlink>
                     </TextBlock>
                 </Grid>
                 <ControlTemplate.Triggers>
                     <Trigger Property="IsMouseOver" Value="True">
                         <Setter TargetName="root" Property="Background" Value="#44ECEAF6"/>
                         <Setter TargetName="tb_control" Property="Visibility" Value="Visible"/>
                     </Trigger>
                 </ControlTemplate.Triggers>
             </ControlTemplate>
         </Setter.Value>
     </Setter>
 </Style>

指向信息帮助类 有点深入自己看

public class Command<T> : ICommand
{
    public event EventHandler? CanExecuteChanged;

    public bool CanExecute(object? parameter)
    {
        return true;
    }

    public void Execute(object? parameter)
    {
        dynamic param = parameter;
        DoExecute?.Invoke(param);
    }

    public Action<T> DoExecute { get; set; }

    public Command(Action<T> action)
    {
        DoExecute = action;
    }
}

public class Command : Command<object>
{
    public Command(Action action) : base(obj => action?.Invoke()) { }
}

其他类似

小经验

分界线 深吭来了

    public async void Play(SongModel song)
    {
        var options = new LaunchOptions { Headless = true };
       
        // 这里有个深坑哈  先要跑一边 下载运行环境 后 注释掉 
       // await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultChromiumRevision);
        //注意 两个using
        using (var browser = await Puppeteer.LaunchAsync(options))
        using (var page = await browser.NewPageAsync())
        {
            await page.GoToAsync(song.Url);
            //请求之后 就是用语法  有就获取src
            var jsSelectAllAnchors = @"Array.from(document.querySellectorAll('audio')).map(a=>a.src);";
            var urls=await page.EvaluateExpressionAsync<string[]>(jsSelectAllAnchors);
            if (urls != null&&urls.Length>0)
            {
                wc.DownloadFile(urls[0],"./songs/"+song.SongName+".mp3");   
            }
        }


    }

遇到的问题 jsSelectAllAnchors 这里面的命令哪里来的 写错了一个单词 找了有点久 

细节UI 播放控制台

双击

跑起来了 

简单的播放 可以下载播放 下载延迟很耗时间 

小编表示 wpf 界面代码写起来 这还是有点底子 ,写起来 比vue webfrom react 都麻烦=.=。。。。。

.net几行代码音乐API各排行榜 热搜 入库-CSDN博客

ABP.Next系列02 搭个API框架要多久 项目下载 运行 -Fstyle_【abp vnext】下载并运行web api项目详细教程文档-CSDN博客

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

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

相关文章

【越界写null字节】ACTF2023 easy-netlink

前言 最近在矩阵杯遇到了一道 generic netlink 相关的内核题&#xff0c;然后就简单学习了一下 generic netlink 相关概念&#xff0c;然后又找了一到与 generic netlink 相关的题目。简单来说 generic netlink 相关的题目仅仅是将用户态与内核态的交互方式从传统的 ioctl 变成…

以sqlilabs靶场为例,讲解SQL注入攻击原理【42-53关】

【Less-42】 使用 or 11 -- aaa 密码&#xff0c;登陆成功。 找到注入点&#xff1a;密码输入框。 解题步骤&#xff1a; # 获取数据库名 and updatexml(1,concat(0x7e,(select database()),0x7e),1) -- aaa# 获取数据表名 and updatexml(1,concat(0x7e,(select group_conca…

CSS函数: translate、translate3d的使用

translate()和translate3d()函数可以实现元素在指定轴的平移的功能。函数使用在CSS转换属性transform的属性值。实现转换的函数类型有&#xff1a; translate()&#xff1a;2D平面实现X轴、Y轴的平移translate3d()&#xff1a;3D空间实现位置的平移translateX()&#xff1a;实…

Spring Boot整合Jasypt 库实现配置文件和数据库字段敏感数据的加解密

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

idea如何根据路径快速在项目中快速打卡该页面

在idea项目中使用快捷键shift根据路径快速找到该文件并打卡 双击shift(连续按两下shift) -粘贴文件路径-鼠标左键点击选中跳转的路径 自动进入该路径页面 例如&#xff1a;我的实例路径为src/views/user/govType.vue 输入src/views/user/govType或加vue后缀src/views/user/go…

ChatGLM2-6b的本地部署

** 大模型玩了一段时间了&#xff0c;一直没有记录&#xff0c;借假期记录下来 ** ChatGlm2介绍&#xff1a; chatglm2是清华大学发布的中英文双语对话模型&#xff0c;具备强大的问答和对话功能&#xff0c;拥有长达32K的上下文&#xff0c;可以输出比较长的文本。6b的训练参…

Python:处理矩阵之NumPy库(上)

目录 1.前言 2.Python中打开文件操作 3.初步认识NumPy库 4.使用NumPy库 5.NumPy库中的维度 6.array函数 7.arange函数 8.linspace函数 9.logspace函数 10.zeros函数 11.eye函数 前言 NumPy库是一个开源的Python科学计算库&#xff0c;它提供了高性能的多维数组对象、派生对…

linux centos redis-6.2.6一键安装及配置密码

linux centos redis-6.2.6一键安装及配置密码 redis基本原理一、操作阶段&#xff0c;开始安装 redis基本原理 redis作为非关系型nosql数据库&#xff0c;一般公司会作为缓存层&#xff0c;存储唯一会话id&#xff0c;以及请求削峰作用 一、数据结构 Redis支持多种数据结构&a…

操作系统期末复习整理知识点

操作系统的概念&#xff1a;①控制和管理整个计算机系统的硬件和软件资源&#xff0c;并合理地组织调度计算机的工作和资源的分配&#xff1b;②提供给用户和其他软件方便的接口和环境&#xff1b;③是计算机中最基本的系统软件 功能和目标&#xff1a; ①操作系统作为系统资源…

【JAVASE】详讲JAVA语法

这篇你将收获到以下知识&#xff1a; &#xff08;1&#xff09;方法重载 &#xff08;2&#xff09;方法签名 一&#xff1a;方法重载 什么是方法重载&#xff1f; 在一个类中&#xff0c;出现了多个方法的名称相同&#xff0c;但是它们的形参列表是不同的&#xff0c;那…

【Linux系统编程】进程地址空间

目录 前言 进程虚拟地址空间的引入 进程地址空间的概念 进一步理解进程地址空间 为什么需要进程地址空间&#xff1f; 系统层面理解malloc/new内存申请 前言 首先&#xff0c;在我们学习C语言的时候一定会见过如下这张图。&#xff08;没见过也没关系&#xff0c;接下来…

移除重复节点---链表

面试题 02.01. 移除重复节点 - 力扣&#xff08;LeetCode&#xff09; 链表指针p和curr 与head指向同一块空间&#xff1b; p和head来比较相同的值&#xff0c;遇到一样的值、就改变这个空间里面struct的成员变量next指针指向的地址&#xff0c;跳向next的next再比较&#xf…

PDF编辑与转换的终极工具智能PDF处理Acrobat Pro DC

Acrobat Pro DC 2023是一款功能全面的PDF编辑管理软件&#xff0c;支持创建、编辑、转换、签署和共享PDF文件。它具备OCR技术&#xff0c;可将扫描文档转换为可编辑文本&#xff0c;同时提供智能PDF处理技术&#xff0c;确保文件完整性和可读性。此外&#xff0c;软件还支持电子…

目标检测数据集 - 智能零售柜商品检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍&#xff1a;智能零售柜商品检测数据集&#xff0c;真实智能零售柜监控场景采集高质量商品图片数据&#xff0c;数据集含常见智能零售柜商品图片&#xff0c;包括罐装饮料类、袋装零食类等等。数据标注标签包含 113 个商品类别&#xff1b;适用实际项目应用&#xff…

Python 基于阿里云的OSS对象存储服务实现本地文件上云框架

Python 基于阿里云的OSS对象存储服务实现将文件上云框架 文章目录 Python 基于阿里云的OSS对象存储服务实现将文件上云框架一、前言二、阿里云配置1、获取用户AKEY和AKeySecret2、创建Bucket 三、Python 阿里云oss上云框架1、安装oss2依赖库2、阿里云oss python 一、前言 未来…

C++11 列表初始化(initializer_list),pair

1. {} 初始化 C98 中&#xff0c;允许使用 {} 对数组进行初始化。 int arr[3] { 0, 1, 2 };C11 扩大了 {} 初始化 的使用范围&#xff0c;使其可用于所有内置类型和自定义类型。 struct Date {int _year;int _month;int _day;Date(int year, int month, int day):_year(year…

基于某评论的TF-IDF下的LDA主题模型分析

完整代码&#xff1a; import numpy as np import re import pandas as pd import jieba from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.decomposition import LatentDirichletAllocationdf1 pd.read_csv(小红书评论.csv) # 读取同目录下csv文件…

ssm613个性化旅游攻略定制系统设计与实现+jsp【已测试】

前言&#xff1a;&#x1f469;‍&#x1f4bb; 计算机行业的同仁们&#xff0c;大家好&#xff01;作为专注于Java领域多年的开发者&#xff0c;我非常理解实践案例的重要性。以下是一些我认为有助于提升你们技能的资源&#xff1a; &#x1f469;‍&#x1f4bb; SpringBoot…

【Python教程】1-注释、变量、标识符与基本操作

在整理自己的笔记的时候发现了当年学习python时候整理的笔记&#xff0c;稍微整理一下&#xff0c;分享出来&#xff0c;方便记录和查看吧。个人觉得如果想简单了解一名语言或者技术&#xff0c;最简单的方式就是通过菜鸟教程去学习一下。今后会从python开始重新更新&#xff0…

SQL Chat:从SQL到SPEAKL的数据库操作新纪元

引言 SQL Chat是一款创新的、对话式的SQL客户端工具。 它采用自然语言处理技术&#xff0c;让你能够像与人交流一样&#xff0c;通过日常对话的形式对数据库执行查询、修改、创建及删除操作 极大地简化了数据库管理流程&#xff0c;提升了数据交互的直观性和效率。 在这个框…