2015-07-16 14 views
7

Ich möchte eine Musik-App für Windows 10 entwickeln und bin neugierig auf die Benutzeroberfläche von Groove Music neben der Lautstärkeleiste. Ich habe versucht, Google zu googeln, um mehr Informationen darüber zu erhalten, aber ich hatte überhaupt keinen Erfolg. Wenn ich Musik ich spiele in Groove Music und ich heben oder senken Sie die Lautstärke, zeigen die Namen sowie die Künstler und Album-Cover des aktuellen Songs mit Musik steuert bis neben der Lautstärkeanzeige dies:Interagieren mit "systemweit" Media Player

screen shot

Ich frage mich, wie ich diesen Dialog in meiner eigenen App erstellen könnte und welche Windows-APIs ich untersuchen müsste.

+0

Ich bin auch auf der Suche nach einer Möglichkeit, Informationen zu einem Song in Groove Music programmgesteuert zugreifen. Ich habe nichts gefunden. –

Antwort

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

Der Stil ist recht groß, so bin Anbringen ich einen Link MediaTransportControls styles and templates ich den Stil aus dem Artikel (Link oben) bekam und modifiziert es in meinem eigenen Resource.

+0

Richtig, das richtige Ding, um jetzt zu verwenden ist 'SystemMediaTransportControls', diese Antwort führte mich dazu. Immer noch neugierig, ob es eine Möglichkeit gibt, auf diese als native Windows-App anstelle einer universellen App zuzugreifen. – caesay

+0

@caesay 'SystemMediaTransportControls' ist nur für 'Metro'-Apps verfügbar @DanielFilipov TransportControls sind für das MediaElements-Standardsteuerelement im Element selbst und nicht für SystemMediaTransportControls. – Stamos

+0

@Stamos stimme ich zu und Ihre Antwort ist klarer, aber immer noch sehe ich nicht, warum würden Sie eine Abstimmung unten nach anderen bereits kommentiert es ist nützlich. –

5

Sie benötigen SystemMediaTransportControls

Hier zu verwenden ist ein Basis-Setup mit Play und Pause. Wenn Sie mehr Steuerelemente aktivieren möchten, können Sie die verfügbaren Eigenschaften für ex verwenden.

systemControls.IsNextEnabled = true;

und müssen Sie die case im Knopfschalter hinzuzufügen.

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

Ausgabe

Output

Auch wenn Sie alle wollen, dass diese im Hintergrund arbeiten müssen Sie t o eine Erklärung in Package.appxmanifest für einen Hintergrund Aufgaben ausführen, Audio aktivieren und einen Einstiegspunkt wie TestUWP.MainPage

enter image description here

+0

Gute Antwort, aber ich habe einen Weg gefunden, um dies auch von einer nativen App aus zu nutzen, also habe ich auch eine Antwort geschrieben, die das genau beschreibt. – caesay

3

hinzufügen Ich werde meinen Beitrag zu dieser noch hinzuzufügen, obwohl es eine große Antwort ist bereits von @Stamos, weil ich festgestellt habe, dass es tatsächlich möglich ist, SystemMediaTransportControls von einer nativen Windows-App (nicht nur eine universelle App) zu verwenden.

Erstens, es erfordert immer noch einen Verweis auf die universellen winmd Dateien, so dass es nur auf Win10 funktioniert. Sie befinden sich in der 10 SDK, und Sie können sie über die reguläre Add Reference -> Browse hinzufügen, aber Sie müssen möglicherweise den Filter unten rechts im Dialogfeld zu "Alle Dateien" ändern, damit sie angezeigt werden. Sie sind hier auf meinem PC gefunden:

  • Windows.Foundation.UniversalApiContract:
    C: \ Program Files (x86) \ Windows-Kits \ 10 \ Referenzen \ Windows.Foundation.UniversalApiContract \ 1.0.0.0 \ Windows.Foundation.UniversalApiContract.winmd
  • Windows.Foundation.FoundationContract:
    C: \ Programme (x86) \ Windows-Kits \ 10 \ References \ Windows.Foundation.FoundationContract \ 2.0.0.0 \ Windows.Foundation.FoundationContract.winmd

Nachdem Sie die notwendigen Referenzen haben, werden Sie in ein anderes Problem stoßen - Sie nicht die Transportsteuerungen über die üblichen Zugriff auf SystemMediaTransportControls.GetForCurrentView(); (es wird eine Ausnahme), weil man nicht wirklich eine universelle haben Aussicht. Dies wird durch die folgende gelindert:

SystemMediaTransportControls systemControls = 
    BackgroundMediaPlayer.Current.SystemMediaTransportControls; 

Danach, fühlen sich frei, keiner der Proben Antwort online oder Stamos zu verwenden.