Добавление проигрывателя Windows Media в приложение WPF

Автор: Диптимайя Патра (Diptimaya Patra)

Добавление проигрывателя Windows Media в приложение WPF. В этой статье будет рассматриваться использование модели COM проигрывателя Windows Media и элемента управления ActiveX в WPF.

Создание проекта WPF

Запустите Visual Studio 2008, создайте пустое решение Visual Studio и назовите его WPFCOM.

Добавьте в решение проект приложения WPF и назовите его WMPInWPF.

И давайте на некоторое время забудем об этом.

Теперь добавим библиотеку элементов управления Windows Forms и назовем ее MediaLibrary.

Сейчас необходимо точно выполнить следующие этапы.

1) Добавление ссылки на "wmp.dll" на вкладке COM.

После добавления библиотеки dll в проект MediaLibrary изменяется следующая структура.

Теперь постройте проект и добавьте этот компонент в панель элементов, щелкнув ее правой кнопкой мыши, выбрав в меню пункт "Add Tab" ("Добавить вкладку") и назвав его "COM Controls".

Как показано выше, добавьте библиотеку dll, выбрав пункт "Choose Items" ("Выбрать элементы") и указав библиотеку DLL, импортированную в проект, т.е. wmp.dll

После нажатия кнопки "ОК" в показанном выше диалоговом окне можно будет увидеть, что элемент управления "Windows Media Player" добавлен в панель элементов.

Как можно видеть на рисунке выше, у нас есть элемент управления "Windows Media Player", и нужно просто перетащить его на поверхность конструктора пользовательского элемента управления.

Результат будет подобен показанному на следующем рисунке.

Теперь нам нужно закрепить его в центре, чтобы он заполнил свойство Dock пользовательского элемента управления.

Наш элемент управления заполнит пользовательский элемент управления, как показано ниже.

Следующий важный этап — повторное построение проекта.

После построения проекта соответствующие библиотеки DLL создаются в папке BIN проекта:

Мы успешно получили эти библиотеки DLL и построили пользовательский элемент управления.

Прежде чем продолжить, давайте изменим имя UserControl на что-нибудь более понятное, например на WMPControl.

Теперь необходимо создать ссылку проекта в проекте приложения WPF.

И что более важно, найти в выходной папке проекта UserControl следующую библиотеку DLL.

Теперь, когда ссылка добавлена, необходимо добавить две дополнительные библиотеки DLL, System.Windows.Forms и WindowsFormsIntegration, как показано ниже.

Теперь, когда у нас все готово для перехода к проекту, построим решение еще раз для проверки, что все на месте.

Итак, решение успешно построено; теперь мы будем проектировать наше приложение WPF. Давайте сделаем это следующим образом.

Мы создадим кнопку Browse, которая будет добавлять папку в приложение и воспроизводимые файлы мультимедиа в ListBox. Когда элемент ListBox выбирается, должно начинаться воспроизведение выбранного файла мультимедиа.

Как можно видеть на рисунке выше, мы успешно добавили кнопку и поле со списком с левой стороны окна, и теперь добавим в область с зеленой границей наш пользовательский элемент управления.

Но сначала необходимо вставить некоторые сборки в XAML, чтобы этот пользовательский элемент управления стал доступным в XAML. Давайте сделаем это.

Представление кода приведенного выше изображения

<Window x:Class="WMPInWPF.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:windowForms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
    xmlns:activeXControl="clr-namespace:AxWMPLib;assembly=AxInterop.WMPLib"
    Title="Windows Media Player In WPF" Height="378" Width="544">
    <Grid Background="Black">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="134*" />
            <ColumnDefinition Width="388*" />
        </Grid.ColumnDefinitions>
        <Button Height="23" x:Name="btnBrowse"
                Click="btnBrowse_Click" Width="100"
                Content="Browse" Margin="0,3,0,0"
                VerticalAlignment="Top"/>
        <ListBox Margin="0,32,0,0" Background="{x:Null}"
                 SelectionChanged="MediaChanged"
                 x:Name="lbMediaFiles" Foreground="White" />
        <WindowsFormsHost x:Name="winFormsHost" Grid.Column="1">
            <activeXControl:AxWindowsMediaPlayer x:Name="activeXMediaPlayer"/>
        </WindowsFormsHost>
    
    </Grid>
</Window>

Теперь, когда у нас есть пользовательский элемент управления, добавленный в XAML, мы можем двигаться дальше и добавить этот элемент управления в сетку.

Представление кода приведенного выше изображения

<Window x:Class="WMPInWPF.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:windowForms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
    xmlns:activeXControl="clr-namespace:AxWMPLib;assembly=AxInterop.WMPLib"
    Title="Windows Media Player In WPF" Height="378" Width="544">
    <Grid Background="Black">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="134*" />
            <ColumnDefinition Width="388*" />
        </Grid.ColumnDefinitions>
        <Button Height="23" x:Name="btnBrowse"
                Click="btnBrowse_Click" Width="100"
                Content="Browse" Margin="0,3,0,0"
                VerticalAlignment="Top"/>
        <ListBox Margin="0,32,0,0" Background="{x:Null}"
                 SelectionChanged="MediaChanged"
                 x:Name="lbMediaFiles" Foreground="White" />
        <WindowsFormsHost x:Name="winFormsHost" Grid.Column="1">
            <activeXControl:AxWindowsMediaPlayer x:Name="activeXMediaPlayer"/>
        </WindowsFormsHost>
    </Grid>
</Window>

Проект будет выглядеть следующим образом:

Теперь давайте создадим код для события SelectionChanged элемента ListBox и для события нажатия кнопки для кнопки Browse.

Добавьте следующий код для просмотра папки и выведения списка файлов мультимедиа в поле со списком (ListBox).

Представление кода приведенного выше изображения

List<string> mediaFileList;
string mediaFolder = string.Empty;


private void btnBrowse_Click(object sender, RoutedEventArgs e)

{
    mediaFileList = new List<string>();

    System.Windows.Forms.FolderBrowserDialog fbd = new
        System.Windows.Forms.FolderBrowserDialog();

    if (fbd.ShowDialog()!= System.Windows.Forms.DialogResult.Cancel)

    {

        mediaFolder = fbd.SelectedPath;
        DirectoryInfo dir = new DirectoryInfo(mediaFolder);
        foreach (FileInfo file in dir.GetFiles("*.*", SearchOption.AllDirectories))

        {
    
            if (file.Extension == ".wmv" || file.Extension == ".avi")

            {
    
                mediaFileList.Add(file.Name);

            }

        }

    

        if (mediaFileList != null)

        {

            lbMediaFiles.ItemsSource = null;
            lbMediaFiles.ItemsSource = mediaFileList;

        }

    }
    
}

Теперь в обработчике события SelectionChanged элемента управления ListBox нам нужно открыть выбранный файл мультимедиа. Добавьте следующий код:

Представление кода приведенного выше изображения

private void MediaChanged(object sender, SelectionChangedEventArgs e)

{

    if (lbMediaFiles.SelectedIndex != -1)

    {

        AxWMPLib.AxWindowsMediaPlayer axWmp =

           winFormsHost.Child as AxWMPLib.AxWindowsMediaPlayer;

        activeXMediaPlayer.URL = mediaFolder +

                                 "\\" +
    
                                 lbMediaFiles.SelectedItem.ToString();

    }

}

Это все. Давайте запустим приложение, чтобы протестировать его.

На рисунке выше показано диалоговое окно просмотра папки FolderBrowserDialog, которое открывается при нажатии кнопки Browse.

Файлы мультимедиа выбираются с левой стороны после выбора пути папки.

При выборе элемента мультимедиа в списке должно начаться его воспроизведение.

Можно также загрузить демонстрационный проект, который использовался в данном примере.

Надеюсь, эта статья будет полезной.