2015-07-16 14 views
7

Desidero sviluppare un'app musicale per Windows 10 e sono curioso dell'interfaccia fornita da Groove Music accanto alla barra del volume. Ho provato su Google per ottenere maggiori informazioni a riguardo, ma non ho avuto alcun successo. Quando sto riproduzione di musica in Groove Musica e io alzare o abbassare il volume, il nome così come l'artista e copertina dell'album del brano corrente presentano con comandi per la musica accanto al indicatore del volume questo:Interagire con lettore multimediale "system-wide"

screen shot

Mi chiedevo come avrei potuto creare questa finestra di dialogo nella mia app e quali API di Windows dovrei esaminare.

+0

Sto anche cercando un modo per accedere a informazioni su una canzone che suona in Groove Music al livello di programmazione. Non ho trovato nulla. –

risposta

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

lo stile è abbastanza grande in modo che io sto allegando un link MediaTransportControls styles and templates ho ottenuto lo stile dal articolo (link qui sotto) e modificato nel mio ResourceDictionary.

+0

Giusto, la cosa giusta da usare ora è "SystemMediaTransportControls', questa risposta mi ha portato ad esso. Ancora curioso di sapere se esiste un modo per accedervi come app nativa per Windows invece di un'app universale. – caesay

+0

@caesay 'SystemMediaTransportControls' è disponibile solo per le app 'Metro' anche @DanielFilipov TransportControls sono per il controllo predefinito di MediaElements nell'elemento stesso non in SystemMediaTransportControls. – Stamos

+0

@Stamos Sono d'accordo e la tua risposta è più chiara ma ancora non vedo perché dovresti mettere giù un voto dopo che altri già commentati sono utili. –

5

è necessario utilizzare SystemMediaTransportControls

Qui è una configurazione di base con Play e Pausa. Se ti piace abilitare più controlli puoi fare usando le proprietà disponibili per es.

systemControls.IsNextEnabled = true;

e si deve aggiungere il case nel l'interruttore del tasto.

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(); 
    }); 
} 

uscita

Output

Inoltre, se si desidera che tutto questo funzioni in background si avrà t o fare una dichiarazione in Package.appxmanifest per uno sfondo Tasks, attivare l'audio e aggiungere un punto di ingresso come TestUWP.MainPage

enter image description here

+0

Buona risposta, ma ho trovato un modo per usarlo anche da un'app nativa, quindi ho anche postato una risposta in dettaglio. – caesay

3

ho intenzione di aggiungere il mio contributo a questo anche se c'è già una grande risposta da @Stamos, perché ho scoperto che è effettivamente possibile utilizzare SystemMediaTransportControls da un'app nativa di Windows (non solo un'app universale).

Per prima cosa, richiede comunque un riferimento ai file universali winmd, quindi funzionerà solo su Win10. Saranno posizionati nel 10 sdk e potranno essere aggiunti tramite il normale Add Reference -> Browse ma potrebbe essere necessario cambiare il filtro in basso a destra nella finestra di dialogo in "Tutti i file" affinché vengano visualizzati. Si trovano qui sul mio PC:

  • Windows.Foundation.UniversalApiContract:
    C: \ Program Files (x86) \ Windows Kits \ 10 \ Riferimenti \ Windows.Foundation.UniversalApiContract \ 1.0.0.0 \ Windows.Foundation.UniversalApiContract.winmd
  • Windows.Foundation.FoundationContract:
    C: \ Programmi (x86) \ Kit di Windows \ 10 \ Riferimenti \ Windows.Foundation.FoundationContract \ 2.0.0.0 \ Windows.Foundation.FoundationContract.winmd

Dopo aver ottenuto i riferimenti necessari, si incorrerà in un altro problema - non è possibile accedere ai controlli di trasporto tramite la solita SystemMediaTransportControls.GetForCurrentView(); (sarà un'eccezione) perché in realtà non hanno un universale vista. Questo è alleviato utilizzando la seguente:

SystemMediaTransportControls systemControls = 
    BackgroundMediaPlayer.Current.SystemMediaTransportControls; 

Dopo questo, si sentono liberi di utilizzare qualsiasi dei campioni in linea o risposta Stamos'.

Problemi correlati