2013-02-01 43 views
2

第一篇文章,所以要溫柔和抱歉的長篇文章,但要儘可能提供更多的細節。WPF Mediaelement mediaopened事件沒有從代碼背後觸發,但從按鈕點擊處理程序發起

我有一個用戶控件內的MediaElement控件,將LoadedBehaviour屬性設置爲手動,見下文。當我點擊「打開」按鈕時,處理程序代碼包括播放媒體,以便我可以在MediaOpened事件處理程序中準備好持續時間,它可以成功執行。當我只需要媒體長度時,MediaOpened處理程序停止播放。

我也想在程序的開始加載一個播放列表,並用信息填充一個數據網格,其中一個元素是媒體的長度。

XAML

<MediaElement Grid.Row="5" Name="MediaEL" Grid.ColumnSpan="6" MediaOpened="MediaEL_MediaOpened" LoadedBehavior="Manual" Height="169" /> 

    <DataGrid Grid.Row="1" Grid.ColumnSpan="6" Name="dgPlayList" AutoGenerateColumns="False" Height="300" > 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding Position}" Header="#" Width="30"/> 
      <DataGridTextColumn Binding="{Binding Title}" Header="Title" Width="182"/> 
      <DataGridTextColumn Binding="{Binding Time}" Header="Time" Width="50"/> 
      <DataGridCheckBoxColumn Binding="{Binding Dnp}" Header="Dnp" Width="35"/> 
      <DataGridTextColumn Binding="{Binding Location}" Visibility="Hidden" /> 
     </DataGrid.Columns> 
    </DataGrid> 

C#

private void btnOpen_Click(object sender, RoutedEventArgs e) 
    { 
     System.Windows.Forms.OpenFileDialog ofd = new System.Windows.Forms.OpenFileDialog(); 

     if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
     { 
      MediaEL.Source = new Uri(ofd.FileName); 
      btnPlay.IsEnabled = true; 
      MediaEL.Visibility = Visibility.Hidden; 
      SettingTime = true; 
      MediaEL.Play(); 
     } 
    } 

    private void MediaEL_MediaOpened(object sender, RoutedEventArgs e) 
    { 
     if (MediaEL.NaturalDuration.HasTimeSpan) 
     { 
      TimeSpan ts = MediaEL.NaturalDuration.TimeSpan; 
      Length.Content = FormatLength(ts.TotalSeconds); // make it look like 00:00:00 
      seekBar.Maximum = ts.TotalSeconds; 
      seekBar.SmallChange = 1; 
      seekBar.LargeChange = Math.Min(10, ts.Seconds/10); 
     } 
     if (!SettingTime) 
      timer.Start(); 
     else 
     { 
      SettingTime = false; 
      MediaEL.Stop(); 
      MediaEL.Visibility = Visibility.Visible; 
      MediaEL.Close(); 
     } 
    } 

dgPlayList.ItemsSource = LoadPlayListData();在窗口加載的方法中調用


我已經在foreach語句下面的方法中註釋掉了,直到我找到一個工作。

現在的問題是,當試圖獲得媒體長度來填充數據網格時間列MediaOpened事件不會觸發,我不明白爲什麼不,並已經用盡了主題的搜索。
任何想法將不勝感激!
謝謝,吉姆

C#

private ObservableCollection<PlayListEntry> LoadPlayListData() 
    { 
     var playListEntries = new ObservableCollection<PlayListEntry>(); 
     var position = 1; 
     var bPlay = false; 

     var doc = new XmlDocument(); 
     doc.Load(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase) + @"/mpcplaylist.xml"); 

     var root = doc.DocumentElement; 
     var nodes = root.SelectNodes("/playlist/media"); 

     XmlNode node = nodes[0]; 

     if (node.InnerXml.Contains("title")) 
     { 
      var xmlElement = node["title"]; 
      if (xmlElement != null) 
       Title = xmlElement.InnerText; 
     } 

     if (node.InnerXml.Contains("artist")) 
     { 
      var xmlElement = node["artist"]; 
      if (xmlElement != null) 
       Artist = xmlElement.InnerText; 
     } 

     if (node.InnerXml.Contains("location")) 
     { 
      var xmlElement = node["location"]; 
      if (xmlElement != null) 
       Location = xmlElement.InnerText; 
     } 

     if (node.InnerXml.Contains("include")) 
     { 
      var xmlElement = node["include"]; 
      if (xmlElement != null) 
       Include = xmlElement.InnerText; 
     } 

     if (Include == "No") 
      bPlay = true; 
     else 
      bPlay = false; 

     //foreach (XmlNode node in nodes) 
     //{ 
     // if (node.InnerXml.Contains("title")) 
     // { 
     //  var xmlElement = node["title"]; 
     //  if (xmlElement != null) 
     //   Title = xmlElement.InnerText; 
     // } 

     // if (node.InnerXml.Contains("artist")) 
     // { 
     //  var xmlElement = node["artist"]; 
     //  if (xmlElement != null) 
     //   Artist = xmlElement.InnerText; 
     // } 

     // if (node.InnerXml.Contains("location")) 
     // { 
     //  var xmlElement = node["location"]; 
     //  if (xmlElement != null) 
     //   Location = xmlElement.InnerText; 
     // } 

     // if (node.InnerXml.Contains("include")) 
     // { 
     //  var xmlElement = node["include"]; 
     //  if (xmlElement != null) 
     //   Include = xmlElement.InnerText; 
     // } 

     // if (Include == "No") 
     //  bPlay = true; 
     // else 
     //  bPlay = false; 


      MediaEL.Source = new Uri(Location); 

      SettingTime = true; 

      MediaEL.Play(); 

      Medialength = Length.Content.ToString(); 

      playListEntries.Add(new PlayListEntry() 
      { 
       Dnp = bPlay, 
       Position = position++, 
       Time = Medialength, 
       Title = Title, 
       Location = Location 
      }); 


     //} 

     return playListEntries; 
    } 
+0

很奇怪,你沒有得到任何反饋這裏...我有類似的問題,並會盡快給你當我找到一個解決方案。 – Sheridan

回答

0

好了,我沒有設法找到我的版本你的問題的一個完整的解決方案,但我確定是什麼原因造成我的問題與MediaPlayer對象。我的應用程序(和內部媒體播放器)都工作得很好,但在包含音頻的文件夾的權限發生變化後,它停止工作。

該文件夾被更改爲只允許讀取訪問,所以mediaPlayer仍然應該能夠訪問這些文件。然而,似乎它在打開任何文件之前需要更高級別的許可。我使用WindowsIdentity.Impersonate方法對此進行了測試,給予了對MediaPlayer.Open方法調用的完全權限,但沒有任何更改。

最後,我嘗試將本地文件系統上的音頻文件的路徑傳遞給MediaPlayer.Open方法,並且嘿presto,它像以前一樣再次運行!也許你應該試試這最後一步,看看你的問題是否也是由安全權限造成的。

更新>>

是的,原來是一個權限錯誤。 IT部門搞砸了我的訪問權限,所以MediaPlayer(或繼承我的訪問權限的應用程序)無法打開音頻文件。在給我正確的權利後,MediaPlayer開始再次正常工作。

我希望這有助於。

2

解決方案是...

我從xml播放列表中抓取第一個條目並設置source屬性,然後調用play方法獲取持續時間。現在在Media Opened事件中,我抓取下一個條目,並執行相同的操作,直到列表中的所有媒體項目的持續時間爲止。

這是關鍵有媒體打開事件獲得第一個處理後的下一個條目。

這就是說我有線程和控制的另一個問題,但我會爲此創建一個新帖子。

感謝, 吉姆

相關問題