WPF 在定时器刻度上播放声音 - 不重复声音

WPF Play sound on Timer tick - doesn't repeat sound

我刚开始构建节拍器应用程序,但我遇到了在计时器滴答声中播放样本声音的问题。我设置了定时器滴答声,例如调用每 1 秒播放一次声音的方法。然后出现了一个问题,声音只播放了一次,没有更多。

那么,我的问题 - 如何在每个计时器滴答声中播放声音?

  <Window x:Class="Metronome.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <StackPanel Grid.Column="0">
        <TextBox Name="textBox1" /> 
        <Button Name="button1" Content="Start" Click="button1_Click" />
        <MediaElement Name="mediaElement1" Source="MetroBar1.wav" LoadedBehavior="Manual" />
    </StackPanel>
</Grid>

      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Windows;
      using System.Windows.Controls;
      using System.Windows.Data;
      using System.Windows.Documents;
      using System.Windows.Input;
      using System.Windows.Media;
      using System.Windows.Media.Imaging;
      using System.Windows.Navigation;
      using System.Windows.Shapes;
      using System.Windows.Threading;

      namespace Metronome
 {
public partial class MainWindow : Window
{
    const int secInMin = 60;
    int beatRate;
    double beatPerMsec;

    DispatcherTimer timer1;

    public MainWindow()
    {
        InitializeComponent();

        timer1 = new DispatcherTimer();
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        //beatRate = Convert.ToInt16(textBox1.Text);
        //beatPerMsec = Math.Pow((beatRate / secInMin), -1) * 1000;   //Amount of beats (timer ticks) per msec
       // timer1.Tick += new EventHandler(metronome_Run);
        timer1.Tick += metronome_Run;
        //timer1.Interval = new TimeSpan(0, 0, 0, 0, Convert.ToInt16(beatPerMsec));
        timer1.Interval = new TimeSpan(0, 0, 1);
        timer1.Start();
    }

    private void metronome_Run(object sender, EventArgs e)
    {
        mediaElement1.Play();
    }
}

}

来自 MSDN:

MediaElement.Play()

Plays media from the current position.

MediaElement 播放结束后不会自动重置位置。在调用 Play.

之前,您需要手动将 Position 重置回开头
private void metronome_Run(object sender, EventArgs e)
{
    mediaElement1.Position = new TimeSpan(0);
    mediaElement1.Play();
}

根据声音文件的长度,在调用 Play 之前调用 Stop 可能更安全。 Stop 将自动重置回开头,并中断任何当前播放的声音。

private void metronome_Run(object sender, EventArgs e)
{
    mediaElement1.Stop();
    mediaElement1.Play();
}