2015-07-16 2 views
7

Я хочу разработать музыкальное приложение для Windows 10, и мне любопытно интерфейс, предоставленный Groove Music рядом с панелью томов. Я попробовал Google, чтобы получить больше информации об этом, но у меня не было никакого успеха. Когда я играю музыку в Groove Music и я поднять или понизить уровень громкости, имя, а также художник и обложка альбома текущей песни отображается с управлением музыкой рядом с индикатором громкости следующим образом:Взаимодействие с «общесистемным» медиаплеером

screen shot

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

+0

Я также ищу способ доступа к информации о песне, играющей в Groove Music программно. Я ничего не нашел. –

ответ

-1
<MediaElement x:Name="Media" 
       AreTransportControlsEnabled="True"> 
    <MediaElement.TransportControls> 
     <MediaTransportControls 
      Style="{StaticResource MediaTCStyle}"/> 
    </MediaElement.TransportControls> 
</MediaElement> 

Стиль довольно большой поэтому я прилагаю ссылку MediaTransportControls styles and templates Я получил стиль из статьи (ссылка выше) и модифицировал его в своем собственном ResourceDictionary.

+0

Правильно, правильная вещь для использования сейчас - SystemMediaTransportControls', этот ответ привел меня к этому. Все еще любопытно, есть ли какой-либо способ получить доступ к этому как к родному окну, а не к универсальному приложению. – caesay

+0

@caesay 'SystemMediaTransportControls' доступен только для приложений Metro также @DanielFilipov TransportControls предназначены для элемента управления MediaElements по умолчанию в самом Элементе, а не в SystemMediaTransportControls. – Stamos

+0

@Stamos Я согласен, и ваш ответ более ясен, но все же я не понимаю, почему вы поставили бы голосование после того, как другие уже прокомментировали, что это полезно. –

5

Вы должны использовать SystemMediaTransportControls

Вот основные настройки с Play и Pause. Если вам нравится включать дополнительные элементы управления, вы можете использовать доступные свойства для ex.

systemControls.IsNextEnabled = true;

и вы должны добавить case в кнопочного выключателя.

case SystemMediaTransportControlsButton.Next: 
        //handle next song 
        break; 

XAML

<MediaElement x:Name="mediaElement" Height="100" Width="100" AreTransportControlsEnabled="True"/> 

C#

public MainPage() 
{ 
    this.InitializeComponent(); 

    systemControls = SystemMediaTransportControls.GetForCurrentView(); 

    // Register to handle the following system transpot control buttons. 
    systemControls.ButtonPressed += SystemControls_ButtonPressed; 

    mediaElement.CurrentStateChanged += MediaElement_CurrentStateChanged; 


    systemControls.IsPlayEnabled = true; 
    systemControls.IsPauseEnabled = true; 
} 

private void MediaElement_CurrentStateChanged(object sender, RoutedEventArgs e) 
{ 
    switch (mediaElement.CurrentState) 
    { 
     case MediaElementState.Playing: 
      systemControls.PlaybackStatus = MediaPlaybackStatus.Playing; 
      break; 
     case MediaElementState.Paused: 
      systemControls.PlaybackStatus = MediaPlaybackStatus.Paused; 
      break; 
     case MediaElementState.Stopped: 
      systemControls.PlaybackStatus = MediaPlaybackStatus.Stopped; 
      break; 
     case MediaElementState.Closed: 
      systemControls.PlaybackStatus = MediaPlaybackStatus.Closed; 
      break; 
     default: 
      break; 
    } 
} 



void SystemControls_ButtonPressed(SystemMediaTransportControls sender, SystemMediaTransportControlsButtonPressedEventArgs args) 
{ 
    switch (args.Button) 
    { 
     case SystemMediaTransportControlsButton.Play: 
      PlayMedia(); 
      break; 
     case SystemMediaTransportControlsButton.Pause: 
      PauseMedia(); 
      break; 
     case SystemMediaTransportControlsButton.Stop: 
      StopMedia(); 
      break; 
     default: 
      break; 
    } 
} 

private async void StopMedia() 
{ 
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() => 
    { 
     mediaElement.Stop(); 
    }); 
} 

async void PlayMedia() 
{ 
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() => 
    { 
     if (mediaElement.CurrentState == MediaElementState.Playing) 
      mediaElement.Pause(); 
     else 
      mediaElement.Play(); 
    }); 
} 

async void PauseMedia() 
{ 
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() => 
    { 
     mediaElement.Pause(); 
    }); 
} 

Выход

Output

Кроме того, если вы хотите, чтобы все это работало в фоновом режиме, вы будете иметь т о сделать декларацию в Package.appxmanifest для фона Задачи, включить аудио и добавить точку входа, как TestUWP.MainPage

enter image description here

+0

Хороший ответ, но я нашел способ использовать его и из собственного приложения, поэтому я также разместил ответ, подробно описывающий это. – caesay

3

я собираюсь добавить свой вклад в это, даже если есть большой ответ уже на @Stamos, потому что я обнаружил, что на самом деле можно использовать SystemMediaTransportControls из собственного приложения для Windows (а не только для универсального приложения).

Прежде всего, он все еще требует ссылки на универсальные файлы winmd, поэтому он будет работать только на Win10. Они будут расположены в 10 sdk, и вы можете добавить их через обычный Add Reference -> Browse, но вам может потребоваться изменить фильтр в правом нижнем углу диалогового окна на «Все файлы», чтобы они отображались. Они находятся здесь на моем компьютере:

  • Windows.Foundation.UniversalApiContract:
    C: \ Program Files (x86) \ Windows Kits \ 10 \ Ссылки \ Windows.Foundation.UniversalApiContract \ 1.0.0.0 \ Windows.Foundation.UniversalApiContract.winmd
  • Windows.Foundation.FoundationContract:
    C: \ Program Files (x86) \ Windows Kits \ 10 \ References \ Windows.Foundation.FoundationContract \ 2.0.0.0 \ Windows.Foundation.FoundationContract.winmd

После того, как необходимые ссылки, вы будете столкнуться с другой проблемой - вы не можете получить доступ к управлению транспортным через обычный SystemMediaTransportControls.GetForCurrentView(); (он будет бросать исключение), потому что вы на самом деле не является универсальным Посмотреть. Это облегчено с помощью следующего:

SystemMediaTransportControls systemControls = 
    BackgroundMediaPlayer.Current.SystemMediaTransportControls; 

После этого, не стесняйтесь использовать любого из образцов онлайн или ответа Стамоса.

Смежные вопросы