<Window x:Class="音乐播放器.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:音乐播放器"
mc:Ignorable="d"
Title="MainWindow" Height="700" Width="1100" ResizeMode="NoResize" Loaded="Window_Loaded" WindowStartupLocation="CenterScreen">
<Grid>
<!--列-->
<Grid.RowDefinitions>
<RowDefinition Height="35"></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<!--行-->
<Grid.ColumnDefinitions>
<ColumnDefinition Width="300"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid x:Name="bg" Grid.Row="0" Grid.Column="0" Grid.RowSpan="2" Grid.ColumnSpan="2">
<Grid.Background>
<ImageBrush ImageSource="img/1.jpg" Stretch="Fill" Opacity="0.8"></ImageBrush>
</Grid.Background>
</Grid>
<Menu Grid.Row=" 0" Grid.Column="0" Grid.ColumnSpan="2">
<MenuItem>
<MenuItem.Icon>
<Image Source="img/Query.ico" Margin="4,0,-8,-4"></Image>
</MenuItem.Icon>
<MenuItem.Header>
<Label>文件</Label>
</MenuItem.Header>
<MenuItem Name="DR" Click="DR_Click">
<MenuItem.Header>
<Label Width="60" Margin="0,0,-40,0">音乐导入</Label>
</MenuItem.Header>
<MenuItem.Icon>
<Image Source="img/open.ico"></Image>
</MenuItem.Icon>
</MenuItem>
<MenuItem Name="QC" Click="QC_Click">
<MenuItem.Header>
<Label Margin="0,0,-40,0">清空播放</Label>
</MenuItem.Header>
<MenuItem.Icon>
<Image Source="img/sc.png"></Image>
</MenuItem.Icon>
</MenuItem>
<MenuItem x:Name="TC" Click="TC_Click">
<MenuItem.Header>
<Label Margin="0,0,-40,0">退出</Label>
</MenuItem.Header>
<MenuItem.Icon>
<Image Source="img/Close.png"></Image>
</MenuItem.Icon>
</MenuItem>
</MenuItem>
<MenuItem>
<MenuItem.Header>
<Label>系统设置</Label>
</MenuItem.Header>
<MenuItem.Icon>
<Image Source="img/Update.png"></Image>
</MenuItem.Icon>
<MenuItem>
<MenuItem.Header>
<Label Margin="0,0,-40,0">个性化背景</Label>
</MenuItem.Header>
<MenuItem.Icon>
<Image Source="img/v.png"></Image>
</MenuItem.Icon>
<MenuItem Name="DH" Click="DH_Click">
<MenuItem.Header>
<Label Margin="0,0,-40,0">大海</Label>
</MenuItem.Header>
</MenuItem>
<MenuItem Name="LJ" Click="LJ_Click">
<MenuItem.Header>
<Label Margin="0,0,-40,0">林间</Label>
</MenuItem.Header>
</MenuItem>
<MenuItem Name="SJ" Click="SJ_Click">
<MenuItem.Header>
<Label Margin="0,0,-40,0">山间</Label>
</MenuItem.Header>
</MenuItem>
<Separator></Separator>
<MenuItem>
<MenuItem.Header>
<Label Margin="0,0,-40,0">自定义</Label>
</MenuItem.Header>
<MenuItem x:Name="TK" Click="TK_Click">
<MenuItem.Header>
<Label>图库</Label>
</MenuItem.Header>
</MenuItem>
</MenuItem>
</MenuItem>
<MenuItem x:Name="Size" Click="Size_Click">
<MenuItem.Header>
<Label Margin="0,0,-40,0">设置字体</Label>
</MenuItem.Header>
<MenuItem.Icon>
<Image Source="img/bb.png"></Image>
</MenuItem.Icon>
<MenuItem Name="ST" Click="ST_Click">
<MenuItem.Header>
<Label>宋体</Label>
</MenuItem.Header>
</MenuItem>
<MenuItem Name="KT" Click="KT_Click">
<MenuItem.Header>
<Label>楷体</Label>
</MenuItem.Header>
</MenuItem>
<MenuItem Name="WR" Click="WR_Click">
<MenuItem.Header>
<Label>微软雅黑</Label>
</MenuItem.Header>
</MenuItem>
</MenuItem>
</MenuItem>
</Menu>
<TreeView Grid.Row="1" Grid.Column="0" Opacity="0.5" Name="qw">
<TreeViewItem Name="MusicList" >
<TreeViewItem.ContextMenu>
<ContextMenu>
<MenuItem Header="删除" Click="MenuItem_Click">
</MenuItem>
</ContextMenu>
</TreeViewItem.ContextMenu>
<TreeViewItem.Header>
<Label>音乐库</Label>
</TreeViewItem.Header>
</TreeViewItem>
<TreeViewItem>
<TreeViewItem.Header>
<Label>我喜欢</Label>
</TreeViewItem.Header>
</TreeViewItem>
</TreeView>
<Grid Grid.Row="1" Grid.Column="1">
<Grid.RowDefinitions>
<RowDefinition Height="40"></RowDefinition>
<RowDefinition Height="40"></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition Width="100"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Label Name="MusName" Grid.ColumnSpan="2" VerticalContentAlignment="Center" HorizontalContentAlignment="Left" FontSize="20">未播放歌曲</Label>
<Label Name="NowTime" Grid.Row="1" Grid.Column="0" HorizontalContentAlignment="Right" FontSize="20" VerticalContentAlignment="Center">00:00</Label>
<Label Name="EndTime" Grid.Row="1" Grid.Column="2" HorizontalContentAlignment="Left" FontSize="20" VerticalContentAlignment="Center">00:00</Label>
<Border x:Name="bd" Grid.Column="1" Grid.Row="1" Height="14" Width="680" BorderThickness="1" BorderBrush="Black" Background="Gray" MouseLeftButtonDown="bd_MouseLeftButtonDown">
<Label Name="valueLb" Background="Green" Width="0" HorizontalAlignment="Left"></Label>
</Border>
<Grid Grid.Row="2" Grid.Column="1">
<Grid.RowDefinitions>
<RowDefinition Height="37*"/>
<RowDefinition Height="520*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition Width="80"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Border x:Name="UpBtn" MouseEnter="UpBtn_MouseEnter" MouseLeave="UpBtn_MouseLeave" MouseLeftButtonDown="UpBtn_MouseLeftButtonDown" MouseLeftButtonUp="UpBtn_MouseLeftButtonUp" Width="50" Height="50" HorizontalAlignment="Right" VerticalAlignment="Top" Grid.RowSpan="2" >
<Border.Background>
<ImageBrush ImageSource="img/92.png"></ImageBrush>
</Border.Background>
</Border>
<Border x:Name="StartBtn" Tag="true" MouseEnter="UpBtn_MouseEnter" MouseLeave="UpBtn_MouseLeave" MouseLeftButtonDown="UpBtn_MouseLeftButtonDown" MouseLeftButtonUp="UpBtn_MouseLeftButtonUp" Grid.Column="1" Width="50" Height="50" VerticalAlignment="Top" Margin="15,0" Grid.RowSpan="2">
<Border.Background>
<ImageBrush ImageSource="img/开始.png"></ImageBrush>
</Border.Background>
</Border>
<Border x:Name="DownBtn" MouseEnter="UpBtn_MouseEnter" MouseLeave="UpBtn_MouseLeave" MouseLeftButtonDown="UpBtn_MouseLeftButtonDown" MouseLeftButtonUp="UpBtn_MouseLeftButtonUp" Grid.Column="2" Width="50" Height="50" HorizontalAlignment="Left" VerticalAlignment="Top" Grid.RowSpan="2" >
<Border.Background>
<ImageBrush ImageSource="img/94.png"></ImageBrush>
</Border.Background>
</Border>
</Grid>
</Grid>
<Grid Grid.Row="3" Grid.Column="1">
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition Height="50"></RowDefinition>
</Grid.RowDefinitions>
<Label Name="lbLrc" Grid.Row="1" HorizontalContentAlignment="Center" FontSize="25" Content="未找到对应歌词"></Label>
</Grid>
<MediaElement x:Name="mediaElement" HorizontalAlignment="Left" Height="188" Margin="0,771,0,-215" Grid.Row="1" VerticalAlignment="Top" Width="250"/>
</Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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;
using System.Windows.Forms;
using System.IO;
using System.Windows.Threading;
using System.Text.RegularExpressions;
namespace 音乐播放器
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
List<string> lrcList = new List<string>();
private void Window_Loaded(object sender, RoutedEventArgs e)
{
DirectoryInfo info = new DirectoryInfo(@"../../music");
if (info.Exists==true)
{
info.CreateSubdirectory("music");
}
mediaElement.LoadedBehavior = MediaState.Manual;
mediaElement.MediaOpened += MediaElement_MediaOpened;
timer.Interval = TimeSpan.FromMilliseconds(10);
timer.Tick += Timer_Tick;
DirectoryInfo directory = new DirectoryInfo(path);
FileInfo[] files = directory.GetFiles();
List<string> fileNames = new List<string>();
for (int i = 0; i < files.Length; i++)
{
fileNames.Add(files[i].Name);
}
DrMusic(fileNames, false);
}
private void Timer_Tick(object sender, EventArgs e)
{
NowTime.Content = mediaElement.Position.ToString("hh':'mm':'ss");
double bl = 0;
if (mediaElement.NaturalDuration.HasTimeSpan)
{
bl = mediaElement.Position.TotalSeconds / mediaElement.NaturalDuration.TimeSpan.TotalSeconds;
}
if (bl >= 0.9999999)
{
timer.Stop();
}
valueLb.Width = bd.Width * bl;
SetChat();
}
private void SetChat()
{
for (int i = 0; i < lrcList.Count; i++)
{
//当前播放时间
double nowt = mediaElement.Position.TotalMilliseconds;
string geci = "";
double current = GetLrcTime(i, out geci);
if (i< lrcList.Count-1)
{
double next = GetLrcTime(i + 1, out string str);
if (current <=nowt&&nowt<next)
{
lbLrc.Content = geci;
return;
}
}
else
{
lbLrc.Content = geci;
}
}
}
/// <summary>
/// 获取当前这句歌词的时间,以毫秒形式运算
/// </summary>
/// <param name="index">歌词索引</param>
private double GetLrcTime(int index, out string chat)
{
double time = 0;
chat = "";
string []everyChat= lrcList[index].Split(new char[] { '[', ']' });
string patten = @"^(\d{2}:){1,2}(\d{2}.\d{2})$";
if (Regex.IsMatch(everyChat[1],patten))
{
chat = everyChat[2];
string t = everyChat[1];
if (everyChat[1].Length<=8)
{
t = "00:" + everyChat[1];
}
TimeSpan ts;
if (TimeSpan.TryParse(t, out ts))
{
//判断的歌词的时间
time = ts.TotalMilliseconds;
}
}
return time;
}
DispatcherTimer timer = new DispatcherTimer();
TimeSpan time;
private void MediaElement_MediaOpened(object sender, RoutedEventArgs e)
{
time = mediaElement.NaturalDuration.TimeSpan;
EndTime.Content = time.ToString("hh':'mm':'ss");
}
//判断如果文件路径不存在则创建
string path =@"music/";
string lrcpath = @"lrc/";
private void DR_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "(*.mp3,*.wav,)|*.mp3;*.wav;";
dialog.Multiselect = true;
dialog.InitialDirectory = "C:\\";
System.Windows.Forms.DialogResult result = dialog.ShowDialog();
//文件多选
//之选音乐格式文件
if (result == System.Windows.Forms.DialogResult.OK)
{
DrMusic(dialog.FileNames.ToList(), true);
}
}
private void DrMusic(List<string> list, bool isDr)
{
foreach (string item in list)
{
FileInfo info = new FileInfo(item);
bool ishave = false;
foreach (TreeViewItem tree in MusicList.Items)
{
if (tree.Header.ToString() == info.Name)
{
ishave = true;
}
}
if (!ishave)
{
TreeViewItem mus = new TreeViewItem();
//1.音乐名称不包含扩展名
mus.Header = info.Name;
MusicList.Items.Add(mus);
mus.MouseDoubleClick += Mus_MouseDoubleClick1;
if (isDr)
{
info.CopyTo(path + info.Name, true);
string name = item.Substring(0, item.LastIndexOf('.'));
FileInfo lrcInfor = new FileInfo(name + ".lrc");
if (lrcInfor.Exists)
{
lrcInfor.CopyTo(lrcpath + lrcInfor.Name);
}
}
}
}
}
//MediaPlayer player = new MediaPlayer();
private void Mus_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
TreeViewItem item = sender as TreeViewItem;
string muPath = path + item.Header+item.Tag;
PlayMusic(muPath, out lrcList);
}
private void TC_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
private void DH_Click(object sender, RoutedEventArgs e)
{
Image image = new Image();
image.Source = new BitmapImage(new Uri("img/1.jpg",UriKind.Relative));
image.Stretch = Stretch.Fill;
bg.Children.Add(image);
}
private void LJ_Click(object sender, RoutedEventArgs e)
{
Image image = new Image();
image.Source = new BitmapImage(new Uri("img/2.jpg", UriKind.Relative));
image.Stretch = Stretch.Fill;
bg.Children.Add(image);
}
private void SJ_Click(object sender, RoutedEventArgs e)
{
Image image = new Image();
image.Source = new BitmapImage(new Uri("img/3.jpg", UriKind.Relative));
image.Stretch = Stretch.Fill;
bg.Children.Add(image);
}
//清空列表
private void QC_Click(object sender, RoutedEventArgs e)
{
MusicList.Items.Clear();
mediaElement.Stop();
}
//删除
private void MenuItem_Click(object sender, RoutedEventArgs e)
{
var item = qw.SelectedItem;
TreeViewItem tree = item as TreeViewItem;
FileInfo file = new FileInfo(path + tree.Header);
file.Delete();
MusicList.Items.Remove(item);
mediaElement.Stop();
}
private void Mus_MouseDoubleClick1(object sender, MouseButtonEventArgs e)
{
TreeViewItem item = sender as TreeViewItem;
string muPath = path + item.Header;
PlayMusic(muPath, out lrcList);
}
private void UpBtn_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
Border img = sender as Border;
img.Width = img.Height = 52;
img.BorderThickness = new Thickness(1);
img.BorderBrush = Brushes.Black;
}
private void UpBtn_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
{
Border img = sender as Border;
img.Width = img.Height = 50;
img.BorderThickness = new Thickness(0);
}
ImageBrush brush;
private void UpBtn_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Border img = sender as Border;
brush = img.Background as ImageBrush;
if (img.Name == "UpBtn")
{
img.Background = new ImageBrush(new BitmapImage(new Uri("../../img/93.png", UriKind.Relative)));
}
else if (img.Name == "StartBtn")
{
if (img.Tag.ToString() == "true")
{
img.Tag = "false";
mediaElement.Pause();
img.Background = new ImageBrush(new BitmapImage(new Uri("../../img/暂停.png", UriKind.Relative)));
}
else if (img.Tag.ToString() == "false")
{
mediaElement.Play();
img.Tag = "true";
img.Background = new ImageBrush(new BitmapImage(new Uri("../../img/开始.png", UriKind.Relative)));
}
}
else if (img.Name == "DownBtn")
{
img.Background = new ImageBrush(new BitmapImage(new Uri("../../img/95.png", UriKind.Relative)));
}
}
private void UpBtn_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
Border img = sender as Border;
if (img.Name == "StartBtn")
{
return;
}
img.Background = brush;
}
void PlayMusic(string path, out List<string> mlrc)
{
string musicChat = "";
FileInfo file = new FileInfo(path);
string musicName = file.Name.Substring(0, file.Name.LastIndexOf('.'));
MusName.Content = musicName;
FileInfo info = new FileInfo(lrcpath+musicName+".lrc");
if (info.Exists)
{
StreamReader reader = new StreamReader(lrcpath + musicName + ".lrc",Encoding.Default);
musicChat = reader.ReadToEnd();
}
mlrc = musicChat.Split( new char[] { '\r', '\n' }).ToList();
timer.Start();
mediaElement.Source = new Uri(path, UriKind.Relative);
mediaElement.Play();
}
//自定义背景
private void TK_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog open = new OpenFileDialog();
open.Filter = "(*.jpg,*.png,)|*.jpg;*.png;";
System.Windows.Forms.DialogResult result = open.ShowDialog();
if (result==System.Windows.Forms.DialogResult.OK)
{
string back = open.FileName;
zdybj(back);
}
}
//自定义背景的方法
private void zdybj(string back)
{
Image img = new Image();
img.Source = new BitmapImage(new Uri(back, UriKind.RelativeOrAbsolute));
img.Stretch = Stretch.Fill;
bg.Children.Add(img);
}
//进度条快进/快退
private void bd_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Point point = e.GetPosition(bd);
mediaElement.Clock = null;
string[] points = point.ToString().Split(',');
double jindu = double.Parse((Convert.ToDouble(points[0]) / bd.Width).ToString("0.00"));
mediaElement.Position = new TimeSpan(0, 0, 0, 0, (int)(jindu * time.TotalMilliseconds));
}
private void Size_Click(object sender, RoutedEventArgs e)
{
FontSize size = new FontSize();
}
private void ST_Click(object sender, RoutedEventArgs e)
{
}
private void KT_Click(object sender, RoutedEventArgs e)
{
}
private void WR_Click(object sender, RoutedEventArgs e)
{
}
}
}