2011-08-29 6 views
0

요구 사항이 있습니다. wpf를 사용하여 창에서 여러 오디오 노래를 재생해야합니다. 누구든지이 기능을 구현하는 가장 좋은 방법을 제안 할 수 있습니까?목록에서 여러 곡을 선택하고 재생하는 방법은 무엇입니까?

창이 있습니다. 목록 상자에 노래 목록이 표시됩니다. 사용자는 목록 상자에서 여러 곡을 선택하고 재생을 클릭 할 수 있어야합니다.

사용자가 선택한 모든 오디오 노래를 하나씩 재생해야합니다.

귀하의 도움에 감사드립니다.

답변

1

가장 쉬운 방법은 ListBox 컨트롤의 ItemsSource 속성을 일부 컬렉션 (예 : "SongList")에 바인딩하는 것입니다. 사용자가 양식에 버튼을 클릭하면

<ListBox Name="lstSongs" ItemsSource="{Binding Path=SongList}" SelectionMode="Extended" Grid.Row="1" /> 

다음 노래

<MediaElement Name="player" MediaEnded="MediaElement_MediaEnded" LoadedBehavior="Play" UnloadedBehavior="Stop" Source="{Binding Path=CurrentlyPlaying}" /> 

의 페이지 듣기에 MediaElement에 컨트롤이 현재 선택한 항목을 대기열에 추가됩니다. 현재 선택된 항목은 ListBox.SelectedItems 속성을 읽어 보면 알 수 있습니다.

private void cmdQueueItems_Click(object sender, RoutedEventArgs e) 
{ 
    Queue = lstSongs.SelectedItems.OfType<Uri>().ToList(); 
    playNext(); 
} 

는 그런 다음 큐의 첫 번째 항목을 재생을 시작하고, MediaElement.MediaEnded 이벤트가 발생할 때 사용할 수가있는 경우, 큐의 다음 항목에 현재 재생중인 항목을 대체합니다.

private void MediaElement_MediaEnded(object sender, RoutedEventArgs e) 
{ 
    playNext(); 
} 

사용자가 미리 정의 된 중지 버튼을 누를 때까지이 작업을 수행합니다.

playNext() 방법은 단순히

private void playNext() 
{ 
    CurrentlyPlaying = Queue.FirstOrDefault(); 

    if (CurrentlyPlaying != null) 
     Queue.Remove(CurrentlyPlaying); 
} 

MainWindow.xaml.cs를

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string name) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 

    public List<Uri> Queue { get; private set; } 

    #region CurrentlyPlaying Definition 

    private Uri _CurrentlyPlaying = null; 

    public Uri CurrentlyPlaying 
    { 
     get 
     { 
      return _CurrentlyPlaying; 
     } 
     set 
     { 
      _CurrentlyPlaying = value; 
      OnPropertyChanged("CurrentlyPlaying"); 
     } 
    } 

    #endregion // end of CurrentlyPlaying region 

    public System.Collections.ObjectModel.ObservableCollection<Uri> SongList { get; private set; } 

    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = this; 

     SongList = new System.Collections.ObjectModel.ObservableCollection<Uri>(); 

     SongList.Add(new Uri(@"E:\Music\_relaxation\African Drums - Tribal Music.mp3")); 
     SongList.Add(new Uri(@"E:\Music\Disturbed\Disturbed - A Welcme Burden.mp3")); 
    } 

    private void cmdQueueItems_Click(object sender, RoutedEventArgs e) 
    { 
     Queue = lstSongs.SelectedItems.OfType<Uri>().ToList(); 
     playNext(); 
    } 

    private void cmdSkipItem_Click(object sender, RoutedEventArgs e) 
    { 
     playNext(); 
    } 

    private void MediaElement_MediaEnded(object sender, RoutedEventArgs e) 
    { 
     playNext(); 
    } 

    private void playNext() 
    { 
     CurrentlyPlaying = Queue.FirstOrDefault(); 

     if (CurrentlyPlaying != null) 
      Queue.Remove(CurrentlyPlaying); 
    } 
} 

MainWindow를합니다 (CurrentlyPlaying 속성이 INotifyPropertyChanged.PropertyChanged 이벤트를 발생하는지 확인) 것 .xaml

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition /> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 

    <MediaElement Name="player" MediaEnded="MediaElement_MediaEnded" LoadedBehavior="Play" UnloadedBehavior="Stop" Source="{Binding Path=CurrentlyPlaying}" /> 
    <ListBox Name="lstSongs" ItemsSource="{Binding Path=SongList}" SelectionMode="Extended" Grid.Row="1" /> 
    <Button Content="Play selected" Click="cmdQueueItems_Click" Grid.Row="2" /> 
    <Button Content="Skip" Click="cmdSkipItem_Click" Grid.Row="3" /> 
</Grid> 
+0

나에게 내가 목록 상자에서이 노래를 선택한 – Radhika

+0

도움 그때 내가 플레이 버튼을 클릭 한 큐에 추가하세요? 내가 어떻게해야 뭐야 큐 근처 오류를 얻고있다 ...하지만 재생되지 않는 ... 어떻게해야합니까? – Radhika

+0

바인딩을 올바르게 설정 했습니까? 우리는 유효합니까? 내 소식을 전체 소스로 업데이트했습니다. – fatty

관련 문제