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

前言: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博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VBA中类的解读及应用第十二讲:限制复选选择,类模块的代码讲解

《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。 类&#xff0c;是非常抽象的&#xff0c;更具研究的价值。随着我们学习、应用VBA的深入&#xff0…

C++:栈(stack)、队列(queue)、优先级队列(priority_queue)

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《C&#xff1a;栈&#xff08;stack&#xff09;和队列&#xff08;queue&#xff09;》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 文章目录 :map…

鸿蒙开发 之 ArkUI自定义组件

1.自定义组件 2.自定义构建函数 3.自定义公共样式函数 3.1Styles装饰器&#xff0c;仅可封装组件通用属性 3.2Extend装饰器&#xff0c;仅可定义在全局&#xff0c;可以设置组件特有属性 4.代码示例 头部组件封装 Component export struct Header{private title: ResourceStrb…

54.WEB渗透测试-信息收集- 端口、目录扫描、源码泄露(2)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;53.WEB渗透测试-信息收集-端口、目录扫描、源码泄露&#xff08;1&#xff09; 关于源码…

crlfuzzcrlfsuite

都是用来检测crlf漏洞的&#xff0c;原理也很简单&#xff0c;都是提交带有回车和行换的payload去测试&#xff0c;总体感觉crlfuzz更好用一点&#xff0c;因为可以看到整个payload&#xff0c;crlfsuite我暂时没找到这个访问的网址在哪里 1.crlfuzz 需要配置go语言环境&…

使用tftpd更新开发板内核

我们升级内核可以通过原厂提供的升级软件来进行&#xff0c;比如瑞芯微的RKDevTool.exe&#xff0c;只不过这种方式必须通过指定的OTG升级口&#xff0c;还得借助按键进入loader模式后才可以。 其实还可以利用一些通用的工具来进行升级&#xff0c;比如tftpd工具。 下载地址p…

PSTI法案和 ETSI EN 303 645测试流程

PSTI法案和 ETSI EN 303 645测试流程: 如何证明符合英国PSTI法案要求? 最低要求是满足PSTI法案关于密码、软件维护周期和漏洞报告的三个要求&#xff0c;并对这些要求提供评估报告等技术文件&#xff0c;同时进行符合性自我声明。我们建议采用ETSI EN 303 645进行英国PSTI法…

古字画3d立体在线数字展览馆更高效便捷

在数字时代的浪潮中&#xff0c;大连图书馆以崭新的面貌跃然屏幕之上——3D全景图书馆。这座承载着城市文化精髓与丰富知识资源的数字图书馆&#xff0c;利用前沿的三维建模技术&#xff0c;为我们呈现了一个全新的知识世界。 随时随地&#xff0c;无论您身处何地&#xff0c;只…

南师大GIS、测绘考研,选哪个导师比较好?

GIS是南师大地科院的王牌专业&#xff0c;而地科院的地理学又是南京师大唯一的双一流学科&#xff0c;所以地科院是南京师大科研经费投入最多&#xff0c;基金项目申请最多的学院。 选择研究生导师要从研究方向、学术能力、个人品行、师资诸多方面综合考虑。今天我为大家整理了…

AR和AP重分类(Regroup)[FAGLF101/OBBU/OBBV]

一、为什么AR和AP科目需要重分类 1.1 执行操作的前提(重要) 存在AR的当月总余额在贷方&#xff08;客户贷项凭证、预收账款等&#xff09;或AP的当月总余额在借方&#xff08;供应商贷项凭证、预收账款等&#xff09;&#xff0c;这种情况下无法真实的反映出资产和负债情况&…

【运维项目经历|028】Cobbler自动化部署平台构建项目

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…

捋一捋C++中的逻辑运算(一)——表达式逻辑运算

注意&#xff0c;今天要谈的逻辑运算是C语言编程中的“与或非”逻辑运算&#xff0c;不是数学集合中的“交并补”逻辑运算。而编程中的逻辑运算又包括表达式逻辑运算和位逻辑运算&#xff0c;本章介绍表达式逻辑运算&#xff0c;下一章介绍位逻辑运算。 目录 一、几个基本的概…

Kubernetes小记

Kubernetes 集群 架构 一个有效的 Kubernetes 部署称为集群&#xff0c;可以将 Kubernetes 集群分为两个部分&#xff1a;控制平面与计算设备&#xff08;或称为节点&#xff09;控制组件 控制平面 K8s 集群的神经中枢,负责处理重要的工作&#xff0c;以确保容器以足够的数量…

ws2812 arduino

问题 乱闪 电源问题 gpio 系统问题 中断式发送 asrpro 上电初始化 引脚 输出 并 写入0 系统启动后 设置引脚复用 gpio (据说为电源问题&#xff0c;调低亮度可&#xff0c;但usb上还是出现 双循环闪 呼吸灯 计数 int s0[3] {0,11,10}; int s1[3] {1,0,11}; int *a[2] {…

Nginx作为下载站点

grep -Ev ^$|# /usr/local/nginx/conf/nginx.conf > /opt/nginx.txt cat /opt/nginx.txt > /usr/local/nginx/conf/nginx.conf用上面的指令提取最小化的配置文件 vim /usr/local/nginx/conf/nginx.conf [rootlocalhost ~]# cat /usr/local/nginx/conf/nginx.conf worker…

充电宝哪个牌子值得买?一文看懂充电宝哪个牌子更好用!

在这个快节奏的数字时代&#xff0c;智能手机、平板电脑等电子设备已成为我们日常生活中不可或缺的一部分。然而&#xff0c;这些智能设备的电池续航能力往往难以满足我们全天候的需求&#xff0c;尤其是在出行、旅行或紧急情况下&#xff0c;电量告急成了许多人的“电量焦虑”…

【C语言训练题库】扫雷->简单小游戏!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 1. 题目 2. 解析 3. 代码 4. 小结 1. 题目 小sun上课的时候非常喜欢玩扫雷。他现小sun有一个初始的雷矩阵&#xff0c;他希望你帮他生成一个扫雷矩阵。 扫雷…

【STREAMPARK】streampark构建运行git应用

1、新建项目 2、填写git 信息 包含地址 账号 密码 以及pom&#xff08;默认读取项目根目录下的pom&#xff09; 3、添加应用 4、填写 要部署的应用的信息 &#xff0c;提交 5、然后构建运行 6、运行失败&#xff0c;查看日志详情&#xff1b;成功&#xff0c;查看应用…

DHCP、FTP

DHCP、FTP DHCP&#xff08;动态主机配置协议&#xff09; 服务器配置好了地址池 192.168.233.10 192.168.233.20 客户端从地址池当中随机获取一个ip地址&#xff0c;ip地址会发生变化&#xff0c;使用服务端提供的ip地址&#xff0c;时间限制&#xff0c;重启之后也会更换。…

对 SQL 说“不”~

开发人员注意&#xff01; 您在当前的应用程序架构中是否面临这些问题&#xff1f; 对 SQL 数据库的高吞吐量。SQL 数据库中的瓶颈。 内存数据存储将是解决问题的方案。Redis 是市场上最受欢迎的内存数据存储和缓存选项。Redis 拥有广泛的生态系统&#xff0c;因为主要科技巨…