2017-09-26 135 views
0

我刚开始构建节拍器应用程序,但我在计时器刻度上播放示例声音时遇到了麻烦。我设置计时器刻度,例如调用每1秒播放一次声音的方法。然后它出现了一个问题,即声音只播放一次,没有更多。WPF播放声音定时器刻度 - 不重复声音

所以,我的问题 - 如何做到这一点在每个计时器滴答声播放声音?

<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(); 
    } 
} 

}

+1

为什么要写Math.Pow(a/b,-1)而不是b/a? :) – Adassko

回答

4

从MSDN:

MediaElement.Play()

从当前位置播放媒体。

MediaElement在完成播放后不会自动重置其位置。在致电Play之前,您需要手动重置Position

private void metronome_Run(object sender, EventArgs e) 
{ 
    mediaElement1.Position = new TimeSpan(0); 
    mediaElement1.Play(); 
} 

这可能是更安全的主叫Play,这取决于你的声音文件的长度之前调用StopStop将自动重置回开始,并中断任何当前正在播放的声音。

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

谢谢,是秒的方式似乎更好,因为当我使用mediaElement.Position时,我可以听到节拍不稳定。 –