GVKun编程网logo

Silverlight中调用麦克风模拟录音机设备,存储为WAV音频

7

在本文中,您将会了解到关于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音频

Silverlight中调用麦克风模拟录音机设备,存储为WAV音频

Silverlight实用窍门系列:41.Silverlight中调用麦克风模拟录音机设备,存储为WAV音频

在Silverlight 4中支持了麦克风设置的调用,在本节中我们将调用麦克风设备,然后进行录音,并且将录制的声音存取为Wav音频文件。 第一步、首先我们从AudioSink类派生一个音频接收器类:WavAudioSink。其代码如下所示: public class WavAudioSink:AudioSink { //设置需
  

  在Silverlight 4中支持了麦克风设置的调用,在本节中我们将调用麦克风设备,然后进行录音,并且将录制的声音存取为Wav音频文件。

  第一步、首先我们从AudioSink类派生一个音频接收器类:WavAudioSink。其代码如下所示:

public  class WavAudioSink:AudioSink
{
     // 设置需要记录的内存流
     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  class SaveWAVHelper
  {
     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中我们添加三个按钮,分别是开始记录音频、停止录制音频、保存音频文件三个按钮。

 < Grid x:Name= "LayoutRoot"  Background= "White">
        < 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 partial  class MainPage : UserControl
    {
     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模拟鼠标双击

11.Silverlight中为自定义控件添加鼠标双击属性,Silverlight模拟鼠标双击

        Silverlight中是没有鼠标左键双击事件的。在实际项目中,我们只能够模拟鼠标双击事件。其原理如下:控件接受到第一次单击事件,此时开始设置一 个计时器,在计时器的时间范围内收到第二次点击事件,那么执行双击事件应该执行的程序段。如果计时器在规定的时间范围内并未接收到第二次点击事件,那么执 行单击事件。

        一般情况下,windows默认的鼠标双击间隔在200毫秒以内,所以在程序中我们设置超时时间为200毫秒。

        首先我们贴出鼠标双击类的所有源代码,此代码是在网上查找到的,进行了一部分的修改。类的注释在源码中已经写明:

 

 
 
  1. using System; 
  2. using System.Threading; 
  3. using System.Windows; 
  4. using System.Windows.Input; 
  5. using System.Windows.Threading; 
  6.  
  7. namespace SLDoubleClick 
  8. public delegate void MouseLeftDoubleDownEventHandler(object sender, MouseButtonEventArgs e); 
  9.  
  10. /// <summary> 
  11. /// 定义了双击事件的类 
  12. /// </summary> 
  13. public class DoubleClick 
  14. /// <summary> 
  15. /// 双击事件定时器 
  16. /// </summary> 
  17. private dispatcherTimer doubleClickTimer; 
  18.  
  19. /// <summary> 
  20. /// 是否单击 
  21. /// </summary> 
  22. private bool isOnceClick; 
  23.  
  24. /// <summary> 
  25. /// 双击事件 
  26. /// </summary> 
  27. public MouseLeftDoubleDownEventHandler mouseLeftDoubleDown; 
  28.  
  29. /// <summary> 
  30. /// 拥有双击事件的UI 
  31. /// </summary> 
  32. private UIElement owner; 
  33.  
  34. /// <summary> 
  35. /// 实例化DoubleClick 
  36. /// </summary> 
  37. /// <param name="owner">具有双击事件的UI</param> 
  38. public DoubleClick(UIElement owner) 
  39. this.owner = owner; 
  40. this.bindEvent(); 
  41.  
  42. /// <summary> 
  43. /// 绑定事件 
  44. /// </summary> 
  45. private void bindEvent() 
  46. //初始化时设置控件左键单击时触发的鼠标点击事件 
  47. this.owner.MouseLeftButtonDown += (new MouseButtonEventHandler(this.owner_MouseLeftButtonDown)); 
  48. dispatcherTimer timer = new dispatcherTimer(); 
  49. //设置单击事件时间间隔 
  50. timer.Interval = (new TimeSpan(0, 0, 200)); 
  51. this.doubleClickTimer = timer; 
  52. //初始化时设置在200毫秒之内部调用此事件,如果超过200毫秒还没有得到第二次点击,则调用此事件 
  53. this.doubleClickTimer.Tick += (new EventHandler(this.doubleClickTimer_Tick)); 
  54. /// <summary> 
  55. /// 此事件在超过200毫秒未接收到第二次点击时触发。确定本次是单击事件。 
  56. /// </summary> 
  57. /// <param name="sender"></param> 
  58. /// <param name="e"></param> 
  59. private void doubleClickTimer_Tick(object sender, EventArgs e) 
  60. this.isOnceClick = false
  61. this.doubleClickTimer.Stop(); 
  62.  
  63. private void owner_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
  64. if (!this.isOnceClick) 
  65. { //点击第一次之后开始计时,并且设置此时为单击一次 
  66. this.isOnceClick = true
  67. this.doubleClickTimer.Start(); 
  68. else 
  69. { //在200毫秒的时间间隔之内并且触发doubleClickTimer_Tick事件。则执行鼠标左键双击事件。 
  70. this.mouseLeftDoubleDown(sender, e); 

        上面一段源代码在项目中,可以直接拷贝创建不用修改它,也可以不必看它的运行原理。我们右键点击项目名称,然后“添加”-->“新建项”,新建一个名为Uc.xaml自定义控件类,Uc.xaml.cs代码如下:

 

 
 
  1. private DoubleClick MouseDoubleClick; 
  2.       private bool isDoubleClick; 
  3.       /// <summary> 
  4.       /// 是否允许双击 
  5.       /// </summary> 
  6.       public bool IsDoubleClick 
  7.       { 
  8.           get { return isDoubleClick; } 
  9.           set {  
  10.               isDoubleClick = value; 
  11.               if (isDoubleClick == true
  12.               { 
  13.                   MouseDoubleClick = new DoubleClick(this); 
  14.                   this.MouseDoubleClick.mouseLeftDoubleDown += new MouseLeftDoubleDownEventHandler(full_mouseLeftDoubleDown); 
  15.                   this.Cursor = Cursors.Hand;                 
  16.               } 
  17.               else 
  18.               {  
  19.                    
  20.               } 
  21.           } 
  22.       } 
  23.       private void full_mouseLeftDoubleDown(object sender, MouseButtonEventArgs e) 
  24.       { 
  25.           MessageBox.Show("你双击了此矩形框"); 
  26.       } 

         在自定义控件中自定义一个属性,然后设置属性为Ture是实例化DoubleClick类,为此类的mouseLeftDoubleDown事件加载事件 方法,在此方法中实现需要进行的双击操作。最后我们在MainPage.xaml.cs代码中编写以下代码即可创建可设置是否允许双击的自定义控件。

 
 
  1. Uc uc = new Uc(); 
  2.           uc.IsDoubleClick = true
  3.           this.LayoutRoot.Children.Add(uc); 

        本实例采用VS2010+Silverlight 4.0编写 如需要源码点击 http://files.cnblogs.com/chengxingliang/SLDoubleClick.rar 下载。

Silverlight 2学习教程(六): Silverlight托管代码调用Javascript中的JSON对象

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:

< UserControl  x:Class ="SilverlightApplication1.Page"
    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;
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;
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:

<% @ Page Language = " C# "  AutoEventWireup = " true "   %>

<% @ 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 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类的属性,调节音乐播放效果:

 

 
 
  1. <Grid x:Name="LayoutRoot" Background="White"
  2. <!--准备3个Silder控件以控制音乐效果--> 
  3. <Slider Height="135" HorizontalAlignment="Left" Margin="62,38,0" 
  4. Name="SlVolume" VerticalAlignment="Top" Width="62" 
  5. Orientation="Vertical" Maximum="1" Value="0.5" /> 
  6. <Slider Height="135" HorizontalAlignment="Left" Margin="162,0" 
  7. Name="SlPitch" VerticalAlignment="Top" Width="62" 
  8. Orientation="Vertical" Value="0" Maximum="1" Minimum="-1" /> 
  9. <Slider Height="135" HorizontalAlignment="Left" Margin="262,0" 
  10. Name="SlPan" VerticalAlignment="Top" Width="62" 
  11. Orientation="Vertical" Value="0" Maximum="1" Minimum="-1" /> 
  12. <!--显示名称--> 
  13. <TextBlock Height="23" HorizontalAlignment="Left" Margin="71,179,0" 
  14. Name="textBlock1" Text="音量调节" VerticalAlignment="Top" /> 
  15. <TextBlock Height="23" HorizontalAlignment="Left" Margin="166,0" 
  16. Name="textBlock2" Text="高低音调节" VerticalAlignment="Top" /> 
  17. <TextBlock Height="23" HorizontalAlignment="Left" Margin="271,0" 
  18. Name="textBlock3" Text="声道平衡" VerticalAlignment="Top" /> 
  19. </Grid> 

        第一步:加载相应的事件

 

 
 
  1. public MainPage() 
  2. InitializeComponent(); 
  3. //第一步:加载相应的事件 
  4. Loaded += new RoutedEventHandler(MainPage_Loaded); 
  5. this.SlVolume.ValueChanged+= 
  6. new RoutedPropertyChangedEventHandler<double>(SlVolume_ValueChanged); 
  7. this.SlPitch.ValueChanged+= 
  8. new RoutedPropertyChangedEventHandler<double>(SlPitch_ValueChanged); 
  9. this.SlPan.ValueChanged+= 
  10. new RoutedPropertyChangedEventHandler<double>(SlPan_ValueChanged); 

        第二步:加载声音WAV文件

        第三步:设置声音文件初始化播放属性

 

 
 
  1. void MainPage_Loaded(object sender, RoutedEventArgs e) 
  2. GetSound(); 
  3. SoundEffect _soundEffect; 
  4. SoundEffectInstance instance; 
  5. public void GetSound() 
  6. //第二步:加载声音WAV文件 
  7. var laserStream = 
  8. Application.GetResourceStream(new Uri("zhizu.wav", UriKind.RelativeOrAbsolute)); 
  9. _soundEffect = SoundEffect.FromStream(laserStream.Stream); 
  10.  
  11. //第三步:设置声音文件初始化播放属性 
  12. instance = _soundEffect.CreateInstance(); 
  13.  
  14. //Pitch变调效果属性,是高低音平衡调节,该值在-1到1之间设置 
  15. instance.Pitch = 0.0f; 
  16.  
  17. //Pan声像调节属性,它用于调节该路声源在空间的分布图像。 
  18. instance.Pan = 0.0f; 
  19.  
  20. //Volume属性是音量大小调节,该值范围是0-1 
  21. instance.Volume = 0.5f; 
  22. instance.Play(); 

        第四步:根据Silder控件值的变化动态调节声音属性

 

 
 
  1. private void SlVolume_ValueChanged(object sender, 
  2. RoutedPropertyChangedEventArgs<double> e) 
  3. //第四步:调节声音属性 
  4. instance.Volume = float.Parse(e.NewValue.ToString()); 
  5. this.textBlock1.Text = "音量调节" + e.NewValue.ToString(); 
  6.  
  7. private void SlPitch_ValueChanged(object sender, 
  8. RoutedPropertyChangedEventArgs<double> e) 
  9. //第四步:调节声音属性 
  10. instance.Pitch = float.Parse(e.NewValue.ToString()); 
  11. this.textBlock2.Text = "高低音调节" + e.NewValue.ToString(); 
  12.  
  13. private void SlPan_ValueChanged(object sender, 
  14. RoutedPropertyChangedEventArgs<double> e) 
  15. //第四步:调节声音属性 
  16. instance.Pan = float.Parse(e.NewValue.ToString()); 
  17. this.textBlock3.Text = "声像调节" + e.NewValue.ToString(); 

        注意SoundEffectInstance类的3个音乐效果属性Volume,Pitch,Pan如下:

 

 
 
  1. SoundEffectInstance.Pitch 
  2. //Pitch变调效果属性,是高低音平衡调节,该值在-1到1之间设置 
  3. //当往-1调节时,即往低音调调节 
  4. //当往+1调节时,即往高音调调节 
  5. //如果是0则正常音高 
  6.   
  7.   
  8.  
  9. SoundEffectInstance.Volume 
  10. //Volume属性是音量大小调节,该值范围是0-1 
  11.  
  12. SoundEffectInstance.Pan 
  13. //Pan声像调节属性,它用于调节该路声源在空间的分布图像。 
  14. //当往-1调节时,相当于把该路声源放在听音的左边。 
  15. //当往+1调节时,相当于把该路声源放在听音的右边。 
  16. //若把它置于中间位置0时,相当于把该路声源放在听音的正中。 
  17. //Pan属性是左右声道平衡,该值在-1到1之间设置 

        最后我们来看运行效果如下图,如果要听试听效果请点击 SL5SoundEffect.zip 下载源码。

silverlight 学习笔记 (三): silverlight中的数据绑定

silverlight 学习笔记 (三): silverlight中的数据绑定

在前面的笔记中讲过了在silverlight中作为UI层只负责界面的展示,而与viewmodel的联系是通过绑定方式,其绑定可以是数据的绑定也可以是事件的绑定。那么我们需要了解下究竟在UI中绑定的实现。

一、绑定语法

绑定可以在设计时绑定也可以在后台绑定,通常我们在设计时进行绑定,数据绑定语法是: 属性=“{Binding 类属性,Mode=绑定方式}”,如下:

<TextBox name="txUserid" Height="21" textwrapping="Wrap" DataContext="{Binding Source={StaticResource UserDataSource}}" Text="{Binding UserInfo.UserID,Mode=OneWay}"/>

当然在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中公布事件属性

public ICommand UpdateDataCommand { get; set; } public ICommand LoadDataCommand { get { return new Common.DelegateCommand(LoadData); } } 2、事件初始化:事件初始化往往是在viewmodel构造函数中定义

public User() { this.UpdateDataCommand = new Common.DelegateCommand(UpdateData); }此处的Common.DelegateCommand类是实现了ICommand接口的类
3、定义事件处理函数

public void LoadData(object param) { this.UserInfo = Model.User.LoadData(); }此处的事件处理方法中的参数类型为object类型,即可以接入所有类型的事件参数,在实际应用中我们往往需要传递某个类的实例作为事件处理函数的参数

4、在UI中定义事件绑定

<Button x:Name="button" Content="加载数据" HorizontalAlignment="Left" Margin="97,166,112" Width="83" Command="{Binding LoadDataCommand,Mode=OneWay}" DataContext="{Binding Source={StaticResource UserDataSource}}"/>如上,可以将Button的command事件绑定到viewmodel中公布的事件属性LoadCommand上,另外一种事件绑定方式是利用行为模式进行绑定如下代码,其实现与上面一致。

<Button x:Name="button" Content="加载数据" HorizontalAlignment="Left" Margin="97,112" Width="83"> <i:Interaction.Triggers> <i:EventTrigger EventName="Click"> <i:InvokeCommandAction Command="{Binding LoadDataCommand,Mode=OneWay}"/> </i:EventTrigger> </i:Interaction.Triggers> </Button> 以上介绍了silverlight中基本的数据绑定方式,由此可以看出在silverlight中绑定是如此灵活和强大,这也为MVVM模式将UI设计与后台逻辑分离的实现变得更为简单了,如果一个好的MVVM应用模式将会在View中不用写一行后置代码就能实现所有应有的功能。下面精彩还将继续!

关于Silverlight中调用麦克风模拟录音机设备,存储为WAV音频的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于11.Silverlight中为自定义控件添加鼠标双击属性,Silverlight模拟鼠标双击、Silverlight 2学习教程(六): Silverlight托管代码调用Javascript中的JSON对象、Silverlight 5 beta新特性系列:6.Silverlight 5新增低延迟声音效果类SoundEffect.支持wav音乐格式、silverlight 学习笔记 (三): silverlight中的数据绑定的相关信息,请在本站寻找。

本文标签: