2016-06-30 5 views
-3

alle. Ich habe ein Problem bei der Entwicklung meines Testmedienplayers in C# festgestellt. Ich denke, ich habe den ganzen Code, aber wenn ich die Datei öffne, fängt es an zu spielen, aber Fortschrittsbalken bewegt sich nicht. Hier ist der Code:C# ProgressBar zeigt keinen Fortschritt im Media Player

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Runtime.InteropServices.WindowsRuntime; 
using Windows.Foundation; 
using Windows.Foundation.Collections; 
using Windows.UI.Xaml; 
using Windows.UI.Xaml.Controls; 
using Windows.UI.Xaml.Controls.Primitives; 
using Windows.UI.Xaml.Data; 
using Windows.UI.Xaml.Input; 
using Windows.UI.Xaml.Media; 
using Windows.UI.Xaml.Navigation; 
using Windows.Media; 
using Windows.Storage; 
using Windows.Storage.Pickers; 
using System.Threading; 
using System.Windows; 


namespace App1 

{ 


public sealed partial class MainPage : Page 
{ 


    public MainPage() 
    { 
     this.InitializeComponent(); 

     DispatcherTimer timer = new DispatcherTimer(); 
     timer.Interval = TimeSpan.FromSeconds(1); 
     timer.Tick += timer_Tick; 
     timer.Start(); 

    } 
    TimeSpan _position; 

    private async void Open_Click(object sender, RoutedEventArgs e) 
    { 
     var openPicker = new FileOpenPicker(); 

     openPicker.SuggestedStartLocation = PickerLocationId.VideosLibrary; 

     openPicker.FileTypeFilter.Add(".wmv"); 

     openPicker.FileTypeFilter.Add(".mp4"); 

     openPicker.FileTypeFilter.Add(".mp3"); 
     var file = await openPicker.PickSingleFileAsync(); 

     if (file != null) 

     { 

      var stream = await file.OpenAsync(FileAccessMode.Read); 


      videoMediaElement.SetSource(stream, file.ContentType); 


     } 
    } 

    private void Play_Click(object sender, RoutedEventArgs e) 
    { 
     if(videoMediaElement.PlaybackRate != 1) 
     { 
      videoMediaElement.DefaultPlaybackRate = 1; 

     } 

     videoMediaElement.Play(); 

    } 

    private void Stop_Click(object sender, RoutedEventArgs e) 
    { 
     videoMediaElement.Stop(); 
    } 

    private void ProgressBar_ValueChanged(object sender, RangeBaseValueChangedEventArgs e) 
    { 

    } 

    private void timer_Tick(object sender, object e) 
    { 
     if (videoMediaElement.Source != null && videoMediaElement.NaturalDuration.HasTimeSpan) 
     { 
      ProgressBar.Minimum = 0; 
      ProgressBar.Maximum = videoMediaElement.NaturalDuration.TimeSpan.TotalSeconds; 
      ProgressBar.Value = videoMediaElement.Position.TotalSeconds; 
     } 
    } 

    private void videoMediaElement_MediaOpened(object sender, RoutedEventArgs e) 
    { 
     _position = videoMediaElement.NaturalDuration.TimeSpan; 
     ProgressBar.Minimum = 0; 
     ProgressBar.Maximum = _position.TotalSeconds; 
    } 
} 
} 

und XAML:

<Page 
x:Class="App1.MainPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="using:App1" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d"> 

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <Button x:Name="Open" Content="Open" HorizontalAlignment="Left" Margin="60,564,0,0" VerticalAlignment="Top" Width="299" Click="Open_Click"/> 
    <Button x:Name="Play" Content="Play" HorizontalAlignment="Left" Margin="393,564,0,0" VerticalAlignment="Top" Width="299" Click="Play_Click"/> 
    <Button x:Name="Stop" Content="Stop" HorizontalAlignment="Left" Margin="737,564,0,0" VerticalAlignment="Top" Width="299" Click="Stop_Click"/> 
    <ProgressBar x:Name="ProgressBar" 

       HorizontalAlignment="Left" Height="16" Margin="60,665,0,0" VerticalAlignment="Top" Width="1185" ValueChanged="ProgressBar_ValueChanged"/> 
    <Slider x:Name="slider" HorizontalAlignment="Left" Margin="1082,557,0,0" VerticalAlignment="Top" Width="163"/> 
    <MediaElement x:Name="videoMediaElement" HorizontalAlignment="Left" Height="491.884" Margin="4.22,58.023,0,0" VerticalAlignment="Top" Width="1270.501" RenderTransformOrigin="0.5,0.5" UseLayoutRounding="False" d:LayoutRounding="Auto" MediaOpened="videoMediaElement_MediaOpened"> 
     <MediaElement.RenderTransform> 
      <CompositeTransform Rotation="0.111"/> 
     </MediaElement.RenderTransform> 
    </MediaElement> 

</Grid> 

plz help !! Ich habe 2 Tage verschwendet und bei Google habe ich keine echte Lösung gefunden. Vielen Dank!

+0

Haben Sie Ihr "timer_Tick" -Ereignis getestet, um den Wert von 'TotalSeconds' zu überprüfen? – C4u

+0

ja. Debugger zeigte keine Fehler .. Ich weiß nicht, was du meinst? – user6533736

Antwort

0

Nun, ich schaute auf Ihren Code und fand Ihr Problem. Es scheint, dass die Methode SetSource() die Quelle von Mediaelement nicht wirklich festlegt. Ich habe keine Idee warum. Vielleicht wird dir hier jemand helfen. Es gibt mehrere Dinge, auf die ich hinweisen kann.

  1. Sie beginnen diese Fortschrittsbalken zu füllen, bevor der Film startet. Welches ist ein Problem. Sie könnten Ihren Timer nicht im MainPage-Konstruktor, sondern in Ihrem Play_Click-Ereignis oder in diesem Fall, in dem Ihr Film automatisch in Ihrem Open_Click-Ereignis startet, initialisieren.
  2. Wie ich bereits erwähnt habe, da die Quelle immer Null ist, wird der Fortschrittsbalken niemals gefüllt. Glücklicherweise gibt es eine Möglichkeit zu überprüfen, ob das Videoelement gerade läuft. Ersetzen Sie diese:

    if (videoMediaElement.Source = null & & videoMediaElement.NaturalDuration.HasTimeSpan!)

mit diesem:

if (videoMediaElement.CurrentState == MediaElementState.Playing) 

Hoffnung, das hilft.

+0

Danke! Das hat mein Problem gelöst. ProgressBar wird jetzt geladen, wie es sollte. Aber noch eine weitere Frage kam mir in den Sinn: 1. Was meinst du mit der Methode SetSource()? 2. Wenn ich den Timer im Play_Click-Ereignis initialisiere, wird es 2 Timer anzeigen oder wird es automatisch auf 1 Timer gesetzt? Jedenfalls würde ich dir ein Bier kaufen, wenn du in meiner Nähe wärst. – user6533736

+0

Sie verwenden SetSource, um die Datei in Ihr Medienelement zu laden. Dadurch wird jedoch nicht die Quelleigenschaft festgelegt, die Sie auf Null überprüfen. Über den Timer. Es wird nicht zweimal initialisiert, wenn Sie es nur initialisieren. Wenn meine Antwort Ihnen geholfen hat, es als korrekt zu markieren, dann ist das der Grund für SO. :) –