为DataGrid模板列设置绑定以播放音频

时间:2019-01-14 17:01:22

标签: c# wpf wpfdatagrid mediaelement

我有一个DataGrid,它显示一组包含WAV文件名的数据。我已将该列设置为“模板”列,其中包含一个带有用户单击以播放音频的“播放”图标的按钮。单击该按钮后,该图标将变为“停止”图标。只要用户单击按钮,所有这些都可以使用,但是我碰到了墙,试图为“播放当前行的音频”添加键盘快捷键。 -我可以轻松地查找数据项,找到文件名并启动音频,但是找不到用于更改图标的按钮。

Getting a control from a DataGridCell提供了一种从DataGridCell查找控件的方法,但附带注释通常通常不需要这样做,而是使用数据绑定。所以我的问题是,如何正确设置绑定,以使我不必去寻找控件?

我看到的另一篇文章说使用MediaElement(How to create a datagrid with wav-files in WPF),但是我找不到任何关于绑定的内容,因此我遇到了同样的问题-需要查找控件,以便可以从中控制它代码,这与我在按钮上遇到的问题相同。

这是我到目前为止的简化版本:

XAML-

<DataGrid Name="grdAudioData" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <!-- Other columns go here... -->
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Height="25" Width="25" Command="local:AudioGridWindow.PlayAudio" CommandParameter="{Binding}">
                        <Image Source="../icons/Play_16xLGc.png"/>
                    </Button>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

C#代码:

public partial class AudioGridWindow : Window {
  public class LineDataItem {
    /* other data goes here ... */
    public string WavFileName { get; set; }
  }

  private MediaPlayer m_mediaPlayer = new MediaPlayer();
  private Button m_currentlyPlayingButton - null;

  public AudioGridWindow(IList<LineDataItem> lineData) {
    InitializeComponent();
    grdAudioData.ItemsSource = lineData;
  }

  private void OnCommand_PlayAudio(object sender, ExecutedRoutedEventArgs e) {
    Button clickedButton = (Button)e.OriginalSource;
    Button oldButton = m_currentlyPlayingButton;

    // stop any audio that is currently playing
    if(m_currentlyPlayingButton != null) {
      m_mediaPlayer.Stop();
      Image imgStop = new Image();
      imgStop.Source = (BitmapImage)TryFindResource("imgStop");
      m_currentlyPlayingButton .Content = imgStop;
    }

    // If the user clicked a different button than the one that was playing before
    // start new audio
    if(clickedButton != oldButton)
    {
      m_currentlyPlayingButton = clickedButton;
      LineDataItem selectedItem = (LineDataItem)grdAudioData.SelectedItem;

      // Play the audio:
      Uri audioFile = new Uri(selectedItem.WavFileName);
      m_mediaPlayer.Open(audioFile);
      m_mediaPlayer.Play();

      // Change the icon on the play button to "stop"
      Image imgStop = new Image();
      imgStop.Source = (BitmapImage)TryFindResource("imgStop");
      m_currentlyPlayingButton .Content = imgStop;
    }
  }
}

这适用于单击按钮播放音频-按钮在绑定中通过,因此我可以从结构中提取文件名并播放音频。我会跟踪按钮,以便在音频停止时可以将图标改回来。我可以轻松地通过键盘快捷键播放音频,但是这样做时不能更改按钮上的图标。

0 个答案:

没有答案