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