Модификация приложения Silverlight : простой проигрыватель MP 3-файлов
Простой проигрыватель MP3-файлов. Для начала добавим два простеньких класса. Один класс будет отвечать за свойства MP3-файла: имя и путь. Добавим класс для проекта WPF-приложения: выделим имя проекта (LWP17Silverlight) и выполним: Проект -> Добавить класс... (Shift+Alt+C): в открывшемся окне в поле Имя указываем DataItem . cs. Код файла будет таким:
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace LWP17Silverlight
{
public class DataItem
{
private string nameItem;
private string pathItem;
public string NameItem
{
get { return nameItem; }
set { nameItem = value; }
}
public string PathItem
{
get { return pathItem; }
set { pathItem = value; }
}
}
}
Второй класс будет содержать всего две функции, которые будут работать со временем воспроизведения файла. Класс назовём ProgressConverter (файл ProgressConverter.cs) с кодом:
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Data;
namespace LWP17Silverlight
{
public class ProgressConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return ((TimeSpan)value).TotalSeconds;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return TimeSpan.FromSeconds((double)value);
}
}
}
В файле MainPage.xaml в коде XAML найдём:
|
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Добавим после:
xmlns:lwp17="clr-namespace:LWP17Silverlight"
Найдём:
mc:Ignorable="d" d:DesignHeight="480" d:DesignKeyDown="UserControl_KeyDown">
Добавим после:
<UserControl.Resources>
<lwp17:ProgressConverter x:Key="progress"></lwp17:ProgressConverter>
</UserControl.Resources>
Основным элементом, реализующим работу непосредственно «начинки» проигрывателя станет MediaElement (Панель элементов: ). Добавляем его на страницу в ячейку [0, 1] (строка: 0, столбец: 1). Код элемента будет таким:
<MediaElement x:Name="mediaElement" Grid.Column="1" Height="23" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" AutoPlay="True" IsMuted="False" Stretch=”Fill” />
Установленные свойства:
XAML- код имени элемента: | x:Name=”mediaElement” |
AutoPlay: | True |
Stretch: | Fill |
HorizontalAligment: | Stretch |
VetricalAligment: | Bottom |
Height: | 23 |
Width: | Auto |
IsMuted: | Нет галочки |
Второй немаловажный элемент нашего проигрывателя, будет являться списком всех доступных композиций для прослушивания. Список мы поместим в DataGrid и будем выводить в нём композиции по имени, записанному в специальном XML-файле нашего «сайта».
Перетягиваем с панели элементов в самую правую внизу страницы [4, 1] DataGrid ( ). Код, основанный на изменении свойств элемента:
|
|
<sdk:DataGrid AutoGenerateColumns="False" ItemsSource="{Binding}" Grid.Column="1" Grid.Row="4" Height="Auto" HorizontalAlignment="Stretch" Name="songList" VerticalAlignment="Stretch" DataContext="{Binding}" />
Не забудем привязать данные к свойствам DataContext и ItemSource:
Для этого выберем любое из свойств, нажмём на Привязка..., далее в пункте Источник дважды щёлкнем по DataContext.
Далее редактируем свойство Columns (жмём «...»):
Рис. 4. 1. Редактор коллекции: Columns
В списке Выбрать элемент выбираем DataGridTextColumn, жмём дважды добавить. Свойства первого столбца такие:
XAML -код поля привязки: | Binding=”{Binding NameItem}” |
ACanUserSort: | Нет галочки |
Header: | Имя композиции |
IsReadOnly: | Галочка |
Width: | Auto |
Для второго столбца:
XAML- код поля привязки: | Binding=”{Binding PathItem}” |
ACanUserSort: | Нет галочки |
Header: | Путь к композиции |
IsReadOnly: | Галочка |
Width: | Star |
Итоговый XAML-код:
<sdk:DataGrid AutoGenerateColumns="False" ItemsSource="{Binding}" Grid.Column="1" Grid.Row="4" Height="Auto" HorizontalAlignment="Stretch" Name="songList" VerticalAlignment="Stretch" DataContext="{Binding}">
<sdk:DataGrid.Columns>
<sdk:DataGridTextColumn Binding="{Binding NameItem}" CanUserReorder="True" CanUserResize="True" CanUserSort="False" Header="Имя композиции" IsReadOnly="True" />
|
|
<sdk:DataGridTextColumn Binding="{Binding PathItem}" CanUserReorder="True" CanUserResize="True" CanUserSort="False" Header="Путь к композиции" IsReadOnly="True" />
</sdk:DataGrid.Columns>
</sdk:DataGrid>
Дальше последовательно размещаем остальные элементы проигрывателя. Выглядеть это будет следующим образом:
Рис. 4. 2. Расстановка элементов на странице MainPage . xaml проекта WPF приложения Silverlight
Первым элемент будет являться шапкой нашего MP3-проигрывателя с простым текстовым блоком. Расположим его в [0, 1] ячейке сетки. Код TextBlock будет таким:
<TextBlock FontSize="20" Height="34" Name="tbTitle" Text="Простой проигрыватель MP3-файлов" VerticalAlignment="Center" Grid.Column="1" HorizontalAlignment="Center" />
Чуть ниже в ячейке [1, 1] расположим элемент, выполняющий функции временной дорожки композиции (расположение ползунка будет отвечать за положение на шкале воспроизведения файла), а также два TextBlock. Первый будет статическими, второй же будет отражать текущий статус воспроизведений:
<TextBlock Grid.Row="1" Grid.Column="1" Height="23" HorizontalAlignment="Center" Name="textBlock4" Text="Воспроизведение:" VerticalAlignment="Top" />
|
|
<TextBlock Grid.Row="1" Grid.Column="1" Height="23" HorizontalAlignment="Center" Name="textBlock5" Text="Статус:" VerticalAlignment="Bottom" />
Временная дорожка: Slider ( ). Привязку (свойство Value для элемента Slider) данных к ползунку (Position) осуществим через класс ProgressConvetrter на основе данных элемента medaiElement:
XAML-код элемента будет таким:
<Slider x:Name="sliderProcess" Grid.Row="1" Grid.Column="1" Minimum="0" Maximum="230" Value="{Binding ElementName=mediaElement, Path=Position, Mode=TwoWay, Converter={StaticResource progress}}" IsEnabled="False" />
В ячейку [2, 1] вставим кнопки проигрывателя и два дополнительных слайдера. Кнопки, последовательно будут выполнять функции: остановки, воспроизведения, паузы и выключения звука. Первый слайдер будет ответственен за уровень громкости, второй за баланс левого и правого наушника (колонки) в режиме стерео-воспроизведения.
Кнопка «Стоп»:
<Button x:Name="buttonStop" Content="Стоп" Grid.Row="2" Grid.Column="1" Height="23" HorizontalAlignment="Left" VerticalAlignment="Center"></Button>
Кнопка «Воспроизвести:
<Button x:Name="buttonPlay" Content="Воспроизвести" Grid.Row="2" Grid.Column="1" Height="23" HorizontalAlignment="Left" Margin="70,23,0,23" VerticalAlignment="Center"></Button>
Кнопка «Пауза»:
<Button x:Name="buttonPause" Content="Пауза" Grid.Row="2" Grid.Column="1" Height="23" HorizontalAlignment="Left" Margin="170,23,0,23" VerticalAlignment="Center"></Button>
Кнопка «Заглушить»:
<Button x:Name="buttonMuted" Content="Заглушить" Grid.Row="2" Grid.Column="1" Height="23" HorizontalAlignment="Left" Margin="240,23,0,23" VerticalAlignment="Center"></Button>
TextBlock и Slider отвечающий за громкость:
<Slider LargeChange="0.1" Maximum="1" SmallChange="0.01" Value="{Binding Volume, ElementName=mediaElement, Mode=TwoWay, UpdateSourceTrigger=Default}" Grid.Column="1" Grid.Row="2" Height="25" VerticalAlignment="Top" HorizontalAlignment="Right" />
<TextBlock Height="23" HorizontalAlignment="Right" Margin="0,0,98,0" Name="textBox6" Text="Громкость:" VerticalAlignment="Top" Grid.Column="1" Grid.Row="2" />
TextBlock и Slider отвечающий за баланс:
<Slider LargeChange="0.1" Maximum="1" Minimum="-1" Name="sliderBalance" Value="{Binding Path=Balance, ElementName=mediaElement, Mode=TwoWay, UpdateSourceTrigger=Default}" Grid.Column="1" Grid.Row="2" HorizontalAlignment="Right" Height="25" VerticalAlignment="Bottom" />
<TextBlock Height="23" HorizontalAlignment="Right" Margin="0,0,116,0" Name="textBox7" Text="Баланс:" VerticalAlignment="Bottom" Grid.Column="1" Grid.Row="2" />
В ячейку [3, 1] вставляем единственный TextBlock:
<TextBlock FontSize="12" Height="23" HorizontalAlignment="Center" Name="textBlock8" Text="Список доступных MP3-файлов:" VerticalAlignment="Center" Grid.Column="1" Grid.Row="3" />
Перед тем, как работать с событиями элементов и кодом приложения, добавим необходимые ресурсы «сайта» (веб-проекта). Создаём последовательно две папки (Resource -> MP 3). Для создания папки выделяем имя веб-проекта, далее выполняем Проект -> Создать папку:
Собственно веб-проект и импорт ресурсов MP3-файлов в конечную папку проекта необходим для «эмуляции» работы приложения Silverlight с неким сайтом. В конечном итоге, страница с Silverlight-приложением получает удалённо сами файлы (путь, имя файла и содержимое).
В конечную папку импортируем несколько композиций, выполняем: Проект -> Добавить существующий элемент... (Shift+Alt+A). Пусть в этой папке будут храниться несколько MP3-файлов:
Теперь в папке Resource создаём XML-файл с именем MusicList . xml (Проект -> Добавить новый элемент... (Ctrl+Shift+A), следующего содержания:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<music open="1" path="Resource/MЗ3/Atrium_Sun_-_Abyss_(Original_Mix).mp3" name="Abyss (Original Mix)">Atrium Sun</music>
<music open="1" path="Resource/MP3/Daniel_Barbosa_-_Asian_Gardens_(Feat._Shen_Shen).mp3" name="Asian Gardens (Feat. Shen Shen)">Daniel Barbosa</music>
<music open="1" path="Resource/MP3/Elena_-_Zombie_(Ambient_Vocal_Edit).mp3" name="Zombie (Ambient Vocal Edit)">Elena</music>
</root>
Атрибуты для элемента music:
path: содержит полный путь до файла с указанием имени файла и расширения;
name: содержит отображаемое в списке имя (для страницы);
значение: содержит автора композиции.
Перейдём к функциональности кода главной страницы MainPage . xaml . cs: в начало файла добавим следующий код:
// Для MP3-проигрывателя
using System.Xml;
using System.IO;
using System.Windows.Threading;
using System.Windows.Browser;
Найдём:
public MainPage()
{
Добавим до:
public List<DataItem> DataItems;
public bool boolIsMuted = false;
private TimeSpan timeDuration; // Интервал времени
Найдём:
// Подключаем событие Loaded чтобы подключить события на этапе загрузки страницы
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
Добавим после:
this.XmlProcessMethod();
Найдём:
// Переключение в полноэкранный или оконный режимы
App.Current.Host.Content.IsFullScreen = !App.Current.Host.Content.IsFullScreen;
}
Добавим после:
/// <summary>
/// Функция использует асинхронную загрузку данных из XML-файла
/// и подписывается на событие для объекта WebClient DownLoadXmlComplete
/// и событие MeidaEnded объекта MediaElement
/// </summary>
private void XmlProcessMethod()
{
WebClient webClient = new WebClient();
webClient.DownloadStringAsync(new Uri(HtmlPage.Document.DocumentUri, "Resource/MusicList.xml"));
webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(this.DownLoadXmlComplete);
mediaElement.MediaEnded += new RoutedEventHandler(mediaElement_MediaEnded);
}
/// <summary>
/// Загрузка музыки согласно данные XML-файла и конвертирование данных в список.
/// Привязка свойства ItemSource элемента DataGrid к данному списку.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DownLoadXmlComplete(object sender, DownloadStringCompletedEventArgs e)
{
using (XmlReader reader = XmlReader.Create(new StringReader(e.Result)))
{
DataItems = new List<DataItem>();
while (reader.Read())
{
if (reader.IsStartElement() && reader.GetAttribute("open") == "1")
{
string pathMusic = reader.GetAttribute("path").ToString();
string nameMusic = reader.GetAttribute("name").ToString();
DataItem dataItem = new DataItem();
dataItem.NameItem = nameMusic;
dataItem.PathItem = pathMusic;
DataItems.Add(dataItem);
}
}
this.DataContext = DataItems;
}
}
Инициализируем события. Событие SelectionChanged элемента DataGrid:
private void songList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
sliderProcess.IsEnabled = true;
mediaElement.Position = new TimeSpan(0); // Обнуляем слайдер воспроизведения
DataItem selectItem = (DataItem)songList.SelectedItem; // Получаем выбранный в списке элемент
mediaElement.Source = new Uri(HtmlPage.Document.DocumentUri, selectItem.PathItem); // Меняем источник
mediaElement.Play(); // Запускаем композицию
textBlock4.Text = "Воспроизведение: " + selectItem.NameItem.ToString();
}
Событие MediaEnded элемента MediaElement:
private void mediaElement_MediaEnded(object sender, RoutedEventArgs e)
{
textBlock5.Text = "Статус: Воспроизведение завершено";
mediaElement.Pause();
mediaElement.Position = TimeSpan.Zero;
}
Событие MediaOpened элемента MediaElement:
private void mediaElement_MediaOpened(object sender, RoutedEventArgs e)
{
textBlock5.Text = "Статус: Воспроизведение начато";
// Получаем общее время композиции
timeDuration = mediaElement.NaturalDuration.HasTimeSpan ? mediaElement.NaturalDuration.TimeSpan : TimeSpan.FromMilliseconds(0);
sliderProcess.Maximum = timeDuration.TotalSeconds;
}
Событие CurrenyStateChanged элемента MediaElement:
private void mediaElement_CurrentStateChanged(object sender, RoutedEventArgs e)
{
textBlock5.Text = "Статус: " + mediaElement.CurrentState.ToString();
if (mediaElement.CurrentState != MediaElementState.Playing
&& mediaElement.CurrentState != MediaElementState.Paused)
{ this.sliderProcess.IsEnabled = false; }
else { this.sliderProcess.IsEnabled = true; }
}
События Click элемента всех кнопок поочерёдно:
private void buttonStop_Click(object sender, RoutedEventArgs e)
{
mediaElement.Position = TimeSpan.Zero;
mediaElement.Stop();
}
private void buttonPlay_Click(object sender, RoutedEventArgs e)
{
mediaElement.Play();
}
private void buttonPause_Click(object sender, RoutedEventArgs e)
{
mediaElement.Pause();
}
private void buttonMuted_Click(object sender, RoutedEventArgs e)
{
if (!boolIsMuted)
{
textBlock5.Text = "Статус: Звук выключен";
buttonMuted.Content = "Включить";
mediaElement.IsMuted = true;
boolIsMuted = true;
}
else
{
textBlock5.Text = "Статус: Звук включен";
buttonMuted.Content = "Заглушить";
mediaElement.IsMuted = false;
boolIsMuted = false;
}
}
Компилируем, проверяем работоспособность. Запускаем страницу, выбираем любой MP3-файл в списке доступных файлов, слушаем (если конечно есть на чём слушать J), перемещаем ползунок по композиции, жмём на кнопку «Пауза», уменьшаем громкость, меняем баланс на левый наушник или на правый, выключаем и включаем звук.
Рис. 4. 3. Результат работы приложения Silverlight: воспроизведение выбранной композиции
Дата добавления: 2019-09-13; просмотров: 194; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!