在本文中,您将会了解到关于Silverlight中调用麦克风模拟录音机设备,存储为WAV音频的新资讯,并给出一些关于11.Silverlight中为自定义控件添加鼠标双击属性,Silverlight模
在本文中,您将会了解到关于Silverlight中调用麦克风模拟录音机设备,存储为WAV音频的新资讯,并给出一些关于11.Silverlight中为自定义控件添加鼠标双击属性,Silverlight模拟鼠标双击、Silverlight 2学习教程(六): Silverlight托管代码调用Javascript中的JSON对象、Silverlight 5 beta新特性系列:6.Silverlight 5新增低延迟声音效果类SoundEffect.支持wav音乐格式、silverlight 学习笔记 (三): silverlight中的数据绑定的实用技巧。
本文目录一览:- Silverlight中调用麦克风模拟录音机设备,存储为WAV音频
- 11.Silverlight中为自定义控件添加鼠标双击属性,Silverlight模拟鼠标双击
- Silverlight 2学习教程(六): Silverlight托管代码调用Javascript中的JSON对象
- Silverlight 5 beta新特性系列:6.Silverlight 5新增低延迟声音效果类SoundEffect.支持wav音乐格式
- silverlight 学习笔记 (三): silverlight中的数据绑定
Silverlight中调用麦克风模拟录音机设备,存储为WAV音频
Silverlight实用窍门系列:41.Silverlight中调用麦克风模拟录音机设备,存储为WAV音频
在Silverlight 4中支持了麦克风设置的调用,在本节中我们将调用麦克风设备,然后进行录音,并且将录制的声音存取为Wav音频文件。
第一步、首先我们从AudioSink类派生一个音频接收器类:WavAudioSink。其代码如下所示:
{
// 设置需要记录的内存流
private MemoryStream _stream;
// 设置当前的音频格式
private AudioFormat _format;
public Stream backingStream
{
get { return _stream; }
}
public AudioFormat CurrentFormat
{
get { return _format; }
}
protected override void OnCaptureStarted()
{
_stream = new MemoryStream(1024);
}
protected override void OnCaptureStopped()
{
}
protected override void OnFormatChange(AudioFormat audioFormat)
{
if (audioFormat.WaveFormat != WaveFormatType.Pcm)
throw new InvalidOperationException( "WavAudioSink只支持PCM音频格式");
_format = audioFormat;
}
protected override void OnSamples( long sampleTime, long sampleDuration,
byte[] sampleData)
{
// 新的音频数据到达,将它们写入流
_stream.Write(sampleData, 0, sampleData.Length);
}
}
第二步、然后我们将编写一个保存音频的函数类,以保存读取到的音频数据:
{
public static void SavePcmToWav(Stream rawData, Stream output, AudioFormat audioFormat)
{
if (audioFormat.WaveFormat != WaveFormatType.Pcm)
throw new ArgumentException( "Only PCM coding is supported.");
BinaryWriter bwOutput = new BinaryWriter(output);
// -- RIFF 块
bwOutput.Write( "RIFF".tochararray());
// 包的总长度
// 计算的数据长度加上数据头的长度没有数据
// 写数据(44 - 4 ("RIFF") - 4 (当前数据))
bwOutput.Write(( uint)(rawData.Length + 36));
bwOutput.Write( "WAVE".tochararray());
// -- FORMAT 块
bwOutput.Write( "fmt ".tochararray());
// FORMAT 块的长度 (Binary, 总是 0x10)
bwOutput.Write(( uint)0x10);
// 总是 0x01
bwOutput.Write(( ushort)0x01);
// 通道数( 0x01=单声道, 0x02=立体声)
bwOutput.Write(( ushort)audioFormat.Channels);
// 采样率 (Binary, Hz为单位)
bwOutput.Write(( uint)audioFormat.SamplesPerSecond);
// 字节每秒
bwOutput.Write(( uint)(audioFormat.BitsPerSample * audioFormat.SamplesPerSecond *
audioFormat.Channels / 8));
// 每个样品字节: 1=8 bit 单声道, 2=8 bit 立体声 or 16 bit 单声道, 4=16 bit 立体声
bwOutput.Write(( ushort)(audioFormat.BitsPerSample * audioFormat.Channels / 8));
// 每个样品字节
bwOutput.Write(( ushort)audioFormat.BitsPerSample);
// -- DATA 块
bwOutput.Write( "data".tochararray());
// DATA数据块的长度
bwOutput.Write(( uint)rawData.Length);
// 原始PCM数据如下
// 复位rawData地位,记住它的原点位置
// 恢复底。
long originalRawDataStreamPosition = rawData.Position;
rawData.Seek(0, SeekOrigin.Begin);
//追加到输出流中的所有数据从rawData流
byte[] buffer = new byte[4096];
int read;
// 循环读取字节数据
while ((read = rawData.Read(buffer, 4096)) > 0)
{
bwOutput.Write(buffer, read);
}
//开始写入数据
rawData.Seek(originalRawDataStreamPosition, SeekOrigin.Begin);
}
}
第三步、然后再MainPage.xaml中我们添加三个按钮,分别是开始记录音频、停止录制音频、保存音频文件三个按钮。
< Button Content= "开始录制" Height= "28" HorizontalAlignment= "Left"
Margin= "30,15,0" Name= "btnRecord" VerticalAlignment= "Top"
Width= "71" Click= "btnRecord_Click" />
< Button Content= "停止录制" Height= "28" HorizontalAlignment= "Left"
Margin= "150,0" Name= "btnStopRecord" VerticalAlignment= "Top"
Width= "71" Click= "btnStopRecord_Click" />
< Button Content= "保存音频" Height= "28" HorizontalAlignment= "Left"
Margin= "268,0" Name= "btnSaveWav" VerticalAlignment= "Top"
Width= "71" Click= "btnSaveWav_Click" />
< /Grid>
第四步、最后在MainPage.xaml.cs代码中我们进行录制、停止、保存音频的操作如下所示:
{
public MainPage()
{
InitializeComponent();
btnRecord.IsEnabled = true;
btnStopRecord.IsEnabled = false;
btnSaveWav.IsEnabled = false;
}
//声明私有变量
private WavAudioSink _wavSink;
private CaptureSource _captureSource;
private SaveFileDialog _saveFileDialog = new SaveFileDialog()
{ Filter = "Audio files (*.wav)|*.wav" };
private void btnRecord_Click( object sender, RoutedEventArgs e)
{
//初始化_captureSource
var audioDevice = CaptureDeviceConfiguration.GetDefaultAudioCaptureDevice();
_captureSource = new CaptureSource() { AudioCaptureDevice = audioDevice };
//有默认设置的设备且可以用来录制音频
if (CaptureDeviceConfiguration.AllowedDeviceAccess ||
CaptureDeviceConfiguration.RequestDeviceAccess())
{
//判断当前没有开始录制音频
if (_captureSource.State == CaptureState.Stopped)
{
//初始化WavAudioSink
_wavSink = new WavAudioSink();
_wavSink.CaptureSource = _captureSource;
//开始录制音频
_captureSource.Start();
}
}
btnRecord.IsEnabled = false;
btnStopRecord.IsEnabled = true;
btnSaveWav.IsEnabled = false;
}
private void btnStopRecord_Click( object sender, RoutedEventArgs e)
{
//如果当前状态为开始录制,则停止录制
if (_captureSource.State == CaptureState.Started)
{
_captureSource.Stop();
}
btnRecord.IsEnabled = false;
btnStopRecord.IsEnabled = false;
btnSaveWav.IsEnabled = true;
}
private void btnSaveWav_Click( object sender, RoutedEventArgs e)
{
if (_saveFileDialog.ShowDialog() == false)
{
return;
}
//保存Wav文件
Stream stream = _saveFileDialog.OpenFile();
SaveWAVHelper.SavePcmToWav(_wavSink.backingStream, stream, _wavSink.CurrentFormat);
stream.Close();
MessageBox.Show( "你的音频已经保存");
btnRecord.IsEnabled = true;
btnStopRecord.IsEnabled = false;
btnSaveWav.IsEnabled = false;
}
}
通过以上步骤我们就可以开始调用麦克风录制音频文件了,本实例采用Silverlight 4.0+VS2010编写,如需源码请点击 SL4Audio.zip 下载。其效果图如下所示:
本文来自程兴亮的博客,原文地址:http://www.cnblogs.com/chengxingliang/archive/2011/05/16/2046981.html
11.Silverlight中为自定义控件添加鼠标双击属性,Silverlight模拟鼠标双击
Silverlight中是没有鼠标左键双击事件的。在实际项目中,我们只能够模拟鼠标双击事件。其原理如下:控件接受到第一次单击事件,此时开始设置一 个计时器,在计时器的时间范围内收到第二次点击事件,那么执行双击事件应该执行的程序段。如果计时器在规定的时间范围内并未接收到第二次点击事件,那么执 行单击事件。
一般情况下,windows默认的鼠标双击间隔在200毫秒以内,所以在程序中我们设置超时时间为200毫秒。
首先我们贴出鼠标双击类的所有源代码,此代码是在网上查找到的,进行了一部分的修改。类的注释在源码中已经写明:
- using System;
- using System.Threading;
- using System.Windows;
- using System.Windows.Input;
- using System.Windows.Threading;
- namespace SLDoubleClick
- {
- public delegate void MouseLeftDoubleDownEventHandler(object sender, MouseButtonEventArgs e);
- /// <summary>
- /// 定义了双击事件的类
- /// </summary>
- public class DoubleClick
- {
- /// <summary>
- /// 双击事件定时器
- /// </summary>
- private dispatcherTimer doubleClickTimer;
- /// <summary>
- /// 是否单击
- /// </summary>
- private bool isOnceClick;
- /// <summary>
- /// 双击事件
- /// </summary>
- public MouseLeftDoubleDownEventHandler mouseLeftDoubleDown;
- /// <summary>
- /// 拥有双击事件的UI
- /// </summary>
- private UIElement owner;
- /// <summary>
- /// 实例化DoubleClick
- /// </summary>
- /// <param name="owner">具有双击事件的UI</param>
- public DoubleClick(UIElement owner)
- {
- this.owner = owner;
- this.bindEvent();
- }
- /// <summary>
- /// 绑定事件
- /// </summary>
- private void bindEvent()
- {
- //初始化时设置控件左键单击时触发的鼠标点击事件
- this.owner.MouseLeftButtonDown += (new MouseButtonEventHandler(this.owner_MouseLeftButtonDown));
- dispatcherTimer timer = new dispatcherTimer();
- //设置单击事件时间间隔
- timer.Interval = (new TimeSpan(0, 0, 200));
- this.doubleClickTimer = timer;
- //初始化时设置在200毫秒之内部调用此事件,如果超过200毫秒还没有得到第二次点击,则调用此事件
- this.doubleClickTimer.Tick += (new EventHandler(this.doubleClickTimer_Tick));
- }
- /// <summary>
- /// 此事件在超过200毫秒未接收到第二次点击时触发。确定本次是单击事件。
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void doubleClickTimer_Tick(object sender, EventArgs e)
- {
- this.isOnceClick = false;
- this.doubleClickTimer.Stop();
- }
- private void owner_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
- {
- if (!this.isOnceClick)
- { //点击第一次之后开始计时,并且设置此时为单击一次
- this.isOnceClick = true;
- this.doubleClickTimer.Start();
- }
- else
- { //在200毫秒的时间间隔之内并且触发doubleClickTimer_Tick事件。则执行鼠标左键双击事件。
- this.mouseLeftDoubleDown(sender, e);
- }
- }
- }
上面一段源代码在项目中,可以直接拷贝创建不用修改它,也可以不必看它的运行原理。我们右键点击项目名称,然后“添加”-->“新建项”,新建一个名为Uc.xaml自定义控件类,Uc.xaml.cs代码如下:
- private DoubleClick MouseDoubleClick;
- private bool isDoubleClick;
- /// <summary>
- /// 是否允许双击
- /// </summary>
- public bool IsDoubleClick
- {
- get { return isDoubleClick; }
- set {
- isDoubleClick = value;
- if (isDoubleClick == true)
- {
- MouseDoubleClick = new DoubleClick(this);
- this.MouseDoubleClick.mouseLeftDoubleDown += new MouseLeftDoubleDownEventHandler(full_mouseLeftDoubleDown);
- this.Cursor = Cursors.Hand;
- }
- else
- {
- }
- }
- }
- private void full_mouseLeftDoubleDown(object sender, MouseButtonEventArgs e)
- {
- MessageBox.Show("你双击了此矩形框");
- }
在自定义控件中自定义一个属性,然后设置属性为Ture是实例化DoubleClick类,为此类的mouseLeftDoubleDown事件加载事件 方法,在此方法中实现需要进行的双击操作。最后我们在MainPage.xaml.cs代码中编写以下代码即可创建可设置是否允许双击的自定义控件。
- Uc uc = new Uc();
- uc.IsDoubleClick = true;
- this.LayoutRoot.Children.Add(uc);
本实例采用VS2010+Silverlight 4.0编写 如需要源码点击 http://files.cnblogs.com/chengxingliang/SLDoubleClick.rar 下载。
Silverlight 2学习教程(六): Silverlight托管代码调用Javascript中的JSON对象
在上一篇Blog文章中,讲述了JavaScript与Silverlight托管代码相互调用的一些方法。实际上,HtmlWindow的GetProperty方法和Invoke/InvokeSelf方法的返回值是Object类型的,代表 DOM对象或者JavaScript对象(HtmlDocument、HtmlElement、HtmlObject、ScriptObject)的返回值自动作为最接近的类型进行返回,但是,程序开发人员仍然需要明确地将该对象转换成相应的类型。所有的数字,由于跨浏览器的原因,都作为Double类型返回,如果需要Int32类型,则执行Convert.ToInt32()方法即可。
在现代的Web应用中,JSON的使用越来越频繁。Silverlight 2中要调用JavaScript中的JSON对象,首先在托管代码中声明一个类,类的属性与JSON对象的属性一致(不必完全一致),然后在托管代码中将ScriptObject对象转换成声明的这个类型即可。
下面是一个完整的例子:
Page.xaml:
xmlns ="http://schemas.microsoft.com/client/2007"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
Width ="600" Height ="480" >
< Grid x:Name ="LayoutRoot" Background ="White" >
< Canvas Canvas.Top ="20" >
< TextBlock Canvas.Top ="10" Canvas.Left ="20" > 请输入您的姓名: </ TextBlock >
< TextBox x:Name ="UserInput" Width ="200" Height ="30" Canvas.Top ="40" Canvas.Left ="20" ></ TextBox >
< TextBlock x:Name ="Msg" Canvas.Top ="90" Canvas.Left ="20" Foreground ="Navy" FontSize ="18" Width ="500" ></ TextBlock >
< Button Click ="Button_Click" Content ="单击我" FontSize ="24" Width ="160" Height ="60" x:Name ="BtnTest" Canvas.Top ="160" Canvas.Left ="20" ></ Button >
< Button Click ="JSONButton_Click" Content ="JavaScript JSON 对象测试" FontSize ="24" Width ="300" Height ="50" Canvas.Top ="240" Canvas.Left ="20" ></ Button >
< TextBlock x:Name ="Msg2" Canvas.Top ="300" Canvas.Left ="20" Foreground ="Navy" FontSize ="18" Width ="500" ></ TextBlock >
< TextBlock x:Name ="Msg3" Canvas.Top ="320" Canvas.Left ="20" Foreground ="Navy" FontSize ="18" Width ="500" ></ TextBlock >
</ Canvas >
</ Grid >
</ UserControl >
Page.xaml.cs:
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.browser;
using System.Runtime.Serialization.Json;
namespace SilverlightApplication1
{
public partial class Page : UserControl
{
public Page()
{
InitializeComponent();
}
private void Button_Click( object sender, RoutedEventArgs e)
{
string UserInputContent = this .UserInput.Text;
if (UserInputContent.Equals(String.Empty))
{
UserInputContent = " Hello Silverlight World! " ;
}
else
{
UserInputContent = " 你好, " + UserInputContent;
}
HtmlWindow win = HtmlPage.Window;
this .Msg.Text = UserInputContent;
win.Alert( " Silverlight 里面弹出的对话框。 " + UserInputContent);
// 执行页面中的js函数:
win.Eval( " getArraytest() " );
Object[] args = { " 将此参数传递给 js 函数 " };
win.Invoke( " getArrayTest " , args);
// 如果页面中的值
HtmlDocument doc = HtmlPage.Document;
doc.GetElementById( " UserName " ).SetAttribute( " value " , this .UserInput.Text);
}
[ScriptableMember()]
public string InterInvole()
{
string username = HtmlPage.Document.GetElementById( " UserName " ).GetAttribute( " value " );
this .UserInput.Text = username;
this .Msg.Text = " 您输入了: " + username;
return " 你从js脚本中调用了 Silverlight 里面的方法。 " ;
}
private void JSONButton_Click( object sender, RoutedEventArgs e)
{
ScriptObject so = HtmlPage.Window.Invoke( " ReturnObject " , null ) as ScriptObject;
Staple s = so.ConvertTo < Staple > ();
this .Msg2.Text = " 大家好,我在 JavaScript JSON 对象中的名称是: " + s.UserName;
}
// 接受Html页面传递的 JSON 字符串
[ScriptableMember()]
public void ReveiveJSON( string jsonString)
{
// 注意引用:System.Runtime.Serialization.Json
DataContractJsonSerializer json = new DataContractJsonSerializer( typeof (Staple));
System.IO.MemoryStream ms = new System.IO.MemoryStream(System.Text.Encoding.Unicode.GetBytes(jsonString));
Staple staple = new Staple();
staple = (Staple)json.Readobject(ms);
Msg3.Text = " UserId = " + staple.UserId.ToString() + " , UserName = " + staple.UserName;
}
}
public class Staple
{
public string UserName { set ; get ; }
public Double UserId { set ; get ; }
}
}
App.xaml.cs:
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.browser;
namespace SilverlightApplication1
{
public partial class App : Application
{
public App()
{
this .Startup += this .Application_Startup;
this .Exit += this .Application_Exit;
this .UnhandledException += this .Application_UnhandledException;
InitializeComponent();
}
private void Application_Startup( object sender, StartupEventArgs e)
{
// Load the main control
Page p = new Page();
HtmlPage.RegisterScriptableObject( " SilverlightApplicationExample " , p);
// 请注意这里的定义方法,如果这里的p写成 new Page(),则Javascript基本不能给 UserInput 赋值!
this .RootVisual = p;
}
private void Application_Exit( object sender, EventArgs e)
{
}
private void Application_UnhandledException( object sender, ApplicationUnhandledExceptionEventArgs e)
{
}
}
}
SilverlightApplication1TestPage.aspx:
<% @ Register Assembly = " System.Web.Silverlight " Namespace = " System.Web.UI.SilverlightControls " TagPrefix = " asp " %>
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html xmlns ="http://www.w3.org/1999/xhtml" >
< head runat ="server" >
< title > Silverlight 2托管代码与Javascript交互的例子 </ title >
< script type ="text/javascript" >
// <!{CDATA[
// 定义全局变量:
var testvar = " 孟宪会 " ;
// 定义全局函数:
function getArraytest()
{
if (arguments.length > 0 )
{
alert( " js 对话框:您传递了参数。 " + arguments[ 0 ]);
return arguments[ 0 ];
}
else
{
alert( " js 对话框:无参数调用。 " );
return " js 函数返回值 " ;
}
}
function SetUserName()
{
alert(SilverlightPlugin.Content.SilverlightApplicationExample.InterInvole());
}
var Staple = {
UserId: 100 ,
UserName: ' 孟宪会 ' ,
SayHello: function (){alert( this .UserName)}
};
function ReturnObject()
{
return Staple;
}
function SendJSONToSilverlight()
{
SilverlightPlugin.Content.SilverlightApplicationExample.ReveiveJSON(JSON.stringify(Staple));
}
// 定义Silverlight插件对象
var SilverlightPlugin = null ;;
function pluginLoaded(sender)
{
SilverlightPlugin = sender.get_element();
}
// ]]>
</ script >
< script src ="json2.js" type ="text/javascript" ></ script >
<!-- http://www.JSON.org/json2.js -->
</ head >
< body style ="height: 100%; margin: 0;" >
< form id ="form1" runat ="server" >
< div style ="border: 2px solid #EEE; margin: 20px;padding:20px" >
请输入你的名字: < input id ="UserName" type ="text" value ="" />
< input type ="button" onclick ="SetUserName()" value ="将名字传递到 Silverlight" /> < input type ="button" onclick ="SendJSONToSilverlight()" value ="将JSON传递到 Silverlight" />
</ div >
< br />
< div style ="border: 2px solid #EEE;margin: 20px;" >
< asp:ScriptManager ID ="ScriptManager1" runat ="server" >
</ asp:ScriptManager >
< asp:Silverlight ID ="Xaml1" runat ="server" OnPluginLoaded ="pluginLoaded" Source ="~/ClientBin/SilverlightApplication1.xap" Version ="2.0" Width ="600px" Height ="480px" />
</ div >
</ form >
</ body >
</ html >
单击“JavaScript JSON 对象测试”按钮,运行结果如下:
Silverlight 5 beta新特性系列:6.Silverlight 5新增低延迟声音效果类SoundEffect.支持wav音乐格式
在Silverlight 5中新增了一个SoundEffect类和SoundEffectInstance类用以加载wav格式的音乐,这样可以很及时的为动画添加音效。
现在我们看如何使用这两个类来控制播放wav音乐,首先引入mav音乐格式的文件(音频采样大小必须为16或者8位不能是24位,采用PCM编码,22.5,44.1 or 48khz的采样率)如下图属性:
其次将引入的wav格式音乐文件在项目中右键点击其属性设置其“生成操作”为“内容”,如下图所示:
现在我们准备XAML代码以控制SoundEffectInstance类的属性,调节音乐播放效果:
- <Grid x:Name="LayoutRoot" Background="White">
- <!--准备3个Silder控件以控制音乐效果-->
- <Slider Height="135" HorizontalAlignment="Left" Margin="62,38,0"
- Name="SlVolume" VerticalAlignment="Top" Width="62"
- Orientation="Vertical" Maximum="1" Value="0.5" />
- <Slider Height="135" HorizontalAlignment="Left" Margin="162,0"
- Name="SlPitch" VerticalAlignment="Top" Width="62"
- Orientation="Vertical" Value="0" Maximum="1" Minimum="-1" />
- <Slider Height="135" HorizontalAlignment="Left" Margin="262,0"
- Name="SlPan" VerticalAlignment="Top" Width="62"
- Orientation="Vertical" Value="0" Maximum="1" Minimum="-1" />
- <!--显示名称-->
- <TextBlock Height="23" HorizontalAlignment="Left" Margin="71,179,0"
- Name="textBlock1" Text="音量调节" VerticalAlignment="Top" />
- <TextBlock Height="23" HorizontalAlignment="Left" Margin="166,0"
- Name="textBlock2" Text="高低音调节" VerticalAlignment="Top" />
- <TextBlock Height="23" HorizontalAlignment="Left" Margin="271,0"
- Name="textBlock3" Text="声道平衡" VerticalAlignment="Top" />
- </Grid>
第一步:加载相应的事件
- public MainPage()
- {
- InitializeComponent();
- //第一步:加载相应的事件
- Loaded += new RoutedEventHandler(MainPage_Loaded);
- this.SlVolume.ValueChanged+=
- new RoutedPropertyChangedEventHandler<double>(SlVolume_ValueChanged);
- this.SlPitch.ValueChanged+=
- new RoutedPropertyChangedEventHandler<double>(SlPitch_ValueChanged);
- this.SlPan.ValueChanged+=
- new RoutedPropertyChangedEventHandler<double>(SlPan_ValueChanged);
- }
第二步:加载声音WAV文件
第三步:设置声音文件初始化播放属性
- void MainPage_Loaded(object sender, RoutedEventArgs e)
- {
- GetSound();
- }
- SoundEffect _soundEffect;
- SoundEffectInstance instance;
- public void GetSound()
- {
- //第二步:加载声音WAV文件
- var laserStream =
- Application.GetResourceStream(new Uri("zhizu.wav", UriKind.RelativeOrAbsolute));
- _soundEffect = SoundEffect.FromStream(laserStream.Stream);
- //第三步:设置声音文件初始化播放属性
- instance = _soundEffect.CreateInstance();
- //Pitch变调效果属性,是高低音平衡调节,该值在-1到1之间设置
- instance.Pitch = 0.0f;
- //Pan声像调节属性,它用于调节该路声源在空间的分布图像。
- instance.Pan = 0.0f;
- //Volume属性是音量大小调节,该值范围是0-1
- instance.Volume = 0.5f;
- instance.Play();
- }
第四步:根据Silder控件值的变化动态调节声音属性
- private void SlVolume_ValueChanged(object sender,
- RoutedPropertyChangedEventArgs<double> e)
- {
- //第四步:调节声音属性
- instance.Volume = float.Parse(e.NewValue.ToString());
- this.textBlock1.Text = "音量调节" + e.NewValue.ToString();
- }
- private void SlPitch_ValueChanged(object sender,
- RoutedPropertyChangedEventArgs<double> e)
- {
- //第四步:调节声音属性
- instance.Pitch = float.Parse(e.NewValue.ToString());
- this.textBlock2.Text = "高低音调节" + e.NewValue.ToString();
- }
- private void SlPan_ValueChanged(object sender,
- RoutedPropertyChangedEventArgs<double> e)
- {
- //第四步:调节声音属性
- instance.Pan = float.Parse(e.NewValue.ToString());
- this.textBlock3.Text = "声像调节" + e.NewValue.ToString();
- }
注意SoundEffectInstance类的3个音乐效果属性Volume,Pitch,Pan如下:
- SoundEffectInstance.Pitch
- //Pitch变调效果属性,是高低音平衡调节,该值在-1到1之间设置
- //当往-1调节时,即往低音调调节
- //当往+1调节时,即往高音调调节
- //如果是0则正常音高
- SoundEffectInstance.Volume
- //Volume属性是音量大小调节,该值范围是0-1
- SoundEffectInstance.Pan
- //Pan声像调节属性,它用于调节该路声源在空间的分布图像。
- //当往-1调节时,相当于把该路声源放在听音的左边。
- //当往+1调节时,相当于把该路声源放在听音的右边。
- //若把它置于中间位置0时,相当于把该路声源放在听音的正中。
- //Pan属性是左右声道平衡,该值在-1到1之间设置
最后我们来看运行效果如下图,如果要听试听效果请点击 SL5SoundEffect.zip 下载源码。
silverlight 学习笔记 (三): silverlight中的数据绑定
在前面的笔记中讲过了在silverlight中作为UI层只负责界面的展示,而与viewmodel的联系是通过绑定方式,其绑定可以是数据的绑定也可以是事件的绑定。那么我们需要了解下究竟在UI中绑定的实现。
一、绑定语法
绑定可以在设计时绑定也可以在后台绑定,通常我们在设计时进行绑定,数据绑定语法是: 属性=“{Binding 类属性,Mode=绑定方式}”,如下:
当然在silverlight中除了与实体类的属性绑定外还支持元素间属性的绑定,即一个控件的属性绑定另一个控件的属性如:<TextBlock Text="{Binding Text.Length,ElementName=txUserid}" />
二、绑定方式
在Silverlight ,支持OneTime、OneWay、TwoWay三种形式的数据绑定。
简单的说:OneTime模式下:控件与数据绑定后,能自动显示数据,一旦显示完成后,这二者就没有任何关联了。(即自动解除绑定)
OneWay模式下:控件与数据绑定后,除自动显示数据外,显示完成后,控件与数据源仍有单向关联,即如果数据源以后发生了变化,控件上的值也会自动变化.
TwoWay模式下:控件与数据源的关联是双向的,即数据源的变化会影响控件上的值,反过来控件上的任何值变化也会影响数据源本身发生变化。
实际开发中,我们的数据源通常不会是某一个现成控件的属性,多半是xml/数据库等对应的实体类,这里要注意的是,如果控件与自定义类绑定, 自定义类必须实现INotifyPropertyChanged接口
在MVVM模式中由于View从viewmodel中提取数据所以viewmodel类必须从INotifyPropertyChanged接口继承而来,通常viewmodel中会定义一个或多个Model类的实体公布给View,所以Model类也将从INotifyPropertyChanged接口继承。这样才能保障数据源的变化与UI控件上值的变化进行及时更新。
需要提醒的是在silverlight中的UI的更新是在控件失去焦点后发生的。
三、事件绑定
在silverlight中除了能将UI控件中的属性进行数据绑定外,还可以将UI控件中的事件进行绑定。在MVVM模式中,viewmodel将会向View暴露所有Vew要用到的事件属性,而这些事件属性都将继承ICommand接口。其实现方式如下:
1、在viewmodel中公布事件属性
3、定义事件处理函数
4、在UI中定义事件绑定
关于Silverlight中调用麦克风模拟录音机设备,存储为WAV音频的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于11.Silverlight中为自定义控件添加鼠标双击属性,Silverlight模拟鼠标双击、Silverlight 2学习教程(六): Silverlight托管代码调用Javascript中的JSON对象、Silverlight 5 beta新特性系列:6.Silverlight 5新增低延迟声音效果类SoundEffect.支持wav音乐格式、silverlight 学习笔记 (三): silverlight中的数据绑定的相关信息,请在本站寻找。
本文标签: