在本文中,我们将为您详细介绍总结Silverlight与HTML页面交互基本方法(js调用Silverlight方法/属性和Silverligth调用页面js方法)的相关知识,此外,我们还会提供一些关
在本文中,我们将为您详细介绍总结Silverlight与HTML页面交互基本方法(js调用Silverlight方法/属性 和Silverligth调用页面js方法)的相关知识,此外,我们还会提供一些关于Silverlight 2学习教程(五):JavaScript与Silverlight托管代码相互调用、Silverlight 5 beta新特性探索系列:1.安装Silverlight 5 beta环境以及OOB模式下Silverlight 5 多窗口支持、Silverlight Navigation-Silverlight页面间自定义导航、Silverlight 确保您的 Silverlight 应用程序能与 Silverlight 4 一起工作的有用信息。
本文目录一览:- 总结Silverlight与HTML页面交互基本方法(js调用Silverlight方法/属性 和Silverligth调用页面js方法)
- Silverlight 2学习教程(五):JavaScript与Silverlight托管代码相互调用
- Silverlight 5 beta新特性探索系列:1.安装Silverlight 5 beta环境以及OOB模式下Silverlight 5 多窗口支持
- Silverlight Navigation-Silverlight页面间自定义导航
- Silverlight 确保您的 Silverlight 应用程序能与 Silverlight 4 一起工作
总结Silverlight与HTML页面交互基本方法(js调用Silverlight方法/属性 和Silverligth调用页面js方法)
本文和大家总结一下Silverlight与HTML页面交互基本方法,其中包含有js调用Silverlight的方法,挺不错哦。
Silverlight与Html页面的交互功能是通过统称为HTML Bridge的一组类型和方法来实现的。要启用交互功能需要在创建Silverlight控件时指定enableHtmlAccess参数为true,否则很多方法的使用都会引发异常。
在object标签式创建方法中为:
<param name="enableHtmlAccess" value="true" />
Silverlight直接控制HTML
在Silverlight中可以使用System.Windows.Browser命名空间中的类和方法来操作HTML,主要涉及以下几个类:
- BrowserInformation - 代表浏览器及客户端操作系统相关信息
- HtmlDocument - 代表浏览器中的HTML文档
- HtmlElement - 代表了一个HTML元素
- HtmlPage - 提供了操作DOM的方法
- HtmlWindow - 代表JavaScript中的window
其中,最重要的就是HtmlPage类,它提供了一组静态方法来获取其他类的实例,如:
- 取得browserinformation:
browserinformation browserInfo = HtmlPage.browserinformation; - 取得HtmlDocument:
HtmlDocument htmlDocument = HtmlPage.Document; - 取得HtmlWindow:
HtmlWindow htmlWindow = HtmlPage.Window;
下面列举一些常用操作:
- 在新窗口中打开网页:
HtmlPage.Window.Navigate(new Uri("https://www.google.com"),"__blank"); - 修改页面标题:
HtmlPage.Document.SetProperty("title","New Title"); - 修改、取得页面元素属性:
HtmlElement elem = HtmlPage.Document.GetElementByID("elem1");
elem.SetAttribute("value","haha");
string value = elem.GetAttribute("value"); - 注册HTML元素事件:
elem.AttachEvent("onclick",delegate(object sender,HtmlEventArgs he)
{
// ...
}); -
JavaScript中调用Silverlight方法/属性
要从JavaScript中调用Silverlight方法,Silverlight必须首先注册ScriptableObject。这可以通过给要暴露给js的类型加上ScriptableTypeAttribute,这样就会暴露该类型的所有属性、方法和事件;如果只要暴露一部分成员,也可以仅给这一部分成员标记ScriptableMemberAttribute(在过去的版本中仅有ScriptableAttribute)。这个标记是非常宽松的,只要类中有成员是Scriptable的,就可以使用HtmlPage.RegisterScriptableObject方法来注册这个类使其能被js访问。比如:
Code [http://www.xueit.com]public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
HtmlPage.RegisterScriptableObject( " Page " , this );
}
[ScriptableMember]
public string Process( string arg)
{
return " Called from js: " arg;
}
}在html页面则可以用如下js代码调用Process方法:
Code [http://www.xueit.com]function callSL() {
var slHost = document.getElementById( " SilverlightControl " );
var page = slHost.Content.Page;
alert(page.Process( ' param from js ' ));
}将callSL方法注册到按钮的onclick上:
<input type="button" value="Call SL" onclick="callSL()" />
点击运行结果如下:
Silverlight属性的调用方法同理。
(附带一提,这里的"SilverlightControl"是Silverlight控件的id,即Silverlight的object标签ID。)
-
JavaScript注册Silverlight中的事件
无参数事件
Silverlight中,事件用ScriptableMemberAttribute标记或者包含事件的类用ScriptableTypeAttribute标记后,再用HtmlPage.RegisterScriptableObject注册该类,在JavaScript中就可以访问该事件。比如Silverlight暴露如下事件:
public event EventHandler ButtonClicked;
那么在js中可以用下面的代码注册该事件:
Code [http://www.xueit.com]function onSilverlightLoad() {
var slHost = document.getElementById( " SilverlightControl " );
var page = slHost.Content.Page;
page.ButtonClicked = function () {
alert( " Button clicked in SL. " );
};}那么当用户点击Silverlight中的按钮时,就会执行注册的js代码:
值得注意的是,这段js并不能放在页面的onload事件中执行,因为那时Silverlight控件可能还没加载完成,应该放在Silverlight控件的onload事件中。在Silverlight的标签中添加onLoad参数:
<param name="onLoad" value="onSilverlightLoad" />
带参数事件
然后是如何传递事件参数的问题,网上许多人说指定自定义参数时,在js中无法获取,提示不支持指定的方法或属性,其实只要将EventArgs类本身也指定为ScriptableType即可(当然也可将成员指定为ScriptableMember)。示例如下。
事件参数类:
Code [http://www.xueit.com][ScriptableType]
public class ButtonClickedEventArgs : EventArgs
{
public string Message { get ; set ; }
}MainPage类:
Code [http://www.xueit.com]public partial class MainPage : UserControl
{ …
private void Button_Click( object sender,System.Windows.RoutedEventArgs e)
{ // 引发ButtonClicked事件并传入事件参数
OnButtonClicked( new ButtonClickedEventArgs() { Message = " Message from SL. " });
}
#region [ButtonClicked Event]
[ScriptableMember]
public event EventHandler < ButtonClickedEventArgs > ButtonClicked;
[System.Diagnostics.DebuggerStepThrough]
protected virtual void OnButtonClicked(ButtonClickedEventArgs e)
{
if ( null != ButtonClicked)
{
ButtonClicked( this ,e);
}
}
#endregion
}将js的事件处理函数改成:
page.ButtonClicked = function (sender,args) { alert(args.Message);};
如此,当点击SL中按钮时结果如下:
可见event args被成功传递了出来。
Under the Hood
至此基本已满足一般使用的需要了。其实不论是从js调用Silverlight方法/属性,或者注册Silverlight事件,其本质问题都是如何将托管对象传给JavaScript,这里面就有一个对象marshal的问题。Marshal遵循以下原则:
- 托管类型通过传递引用的方式传给JavaScript
- JavaScript类型要传入Silverlight,必须要先进行一层托管的封装
- 如果将托管类型marshal到JavaScript过程发生错误,抛出InvalidOperationException
- 如果将JavaScript数据marshal入Silverlight时发生错误,JavaScript调用者将得到一个异常,异常文本描述了发生的错误
基本类型(即所谓的Primitive types)
以下类型属于基本类型,即不需要标记ScriptableTypeAttribute或者ScriptableMemberAttribute而可以直接在Silverlight和js之间传递的类型:
除此之外,基本的C#数组或者实现了IList接口的类型,可以直接转换为JavaScript中的array;实现了IDictionary的类型也可以直接转为JavaScript中的dictionary。
反过来,JavaScript中的数组传入Silverlight时,一般会被转为object[];dictionary则被转为Dictionary<string,object>.
复杂类型
对于用户创建的复杂类型,则需要通过标记ScriptableTypeAttribute或者ScriptableMemberAttribute,使其能够正确地传递给JavaScript.
对于Silverlight和JavaScript间的Marshal,以上依然只描述了各种最基本的情形。我也不想做那种照翻MSDN的事情,对于更加复杂的情形,以及各种注意事项,可自行参考Silverlight and JavaScript Marshaling。
Silverlight 2学习教程(五):JavaScript与Silverlight托管代码相互调用
要实现JavaScript调用Silverlight程序里面的托管代码,需要先在应用程序的启动(Application_Startup)事件里注册要进行访问的对象,而要从Silverlight的托管代码里访问HTML页面对象或者页面中的JavaScript,使用HtmlPage的Document/HtmlElement和HtmlWindow即可。
下面,我们就以例子来说明两者相互访问的方法,代码里面有很详细的注释,这里不再累述。
Page.xaml:
xmlns ="http://schemas.microsoft.com/client/2007"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
Width ="400" Height ="300" >
< 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 ="36" ></ TextBlock >
< Button Click ="Button_Click" Content ="单击我" FontSize ="24" Width ="160" Height ="60" x:Name ="BtnTest" Canvas.Top ="160" Canvas.Left ="20" ></ Button >
</ 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;
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 里面的方法。 " ;
}
}
}
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());
}
// 定义Silverlight插件对象
var SilverlightPlugin = null ;;
function pluginLoaded(sender)
{
SilverlightPlugin = sender.get_element();
}
// ]]>
</ script >
</ 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" />
</ 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 ="400px" Height ="300px" />
</ div >
</ form >
</ body >
</ html >
运行结果:
Silverlight 5 beta新特性探索系列:1.安装Silverlight 5 beta环境以及OOB模式下Silverlight 5 多窗口支持
Silverlight 5 beta版本总算于昨日放出,怀着激动的心情今天将开发环境更新为Silverlight 5 beta版本,并且接触Silverlight 5 beta的第一个新特性:OOB模式下的多窗口的弹出显示。
现在我们开始Silverlight 5 Beta版本的安装,首先需要为VS2010打一个VS2010 SP1补丁,然后我们再下载Silverlight 5 Beta Tools for Visual Studio SP1,一步一步安装完毕,最后我们下载Silverlight 5 Features Document 新特性的文档。至此我们即可踏上Silverlight 5开发的征程。
对于Silverlight 5 beta版本下面的新窗口的支持是基于OOB模式下的,所以我们首先新建一个Silverlight 5的应用程序,然后右键项目属性-->"允许浏览器外运行应用程序"勾中-->点击"浏览器外设置"-->"在浏览器外运行时需要提升 的信任"勾上。如下图所示:
然后我们在后台代码中键入以下代码即可弹出一个窗口,点击窗口中的按钮我们可以继续弹出窗口,实现了无限制的弹出窗口。当然所有弹出的子窗口都是依赖于父 窗口而存在的。(Tip:在Silverlight 4.0中的Window类修改的大小都是自身窗口的大小,并不能弹出窗口)
- public partial class MainPage : UserControl
- {
- public MainPage()
- {
- InitializeComponent();
- PopWindow(400.0, 20.0, "第"+Flag+"个实例窗口");
- }
- public static int Flag = 0;
- private void PopWindow(double left,double top,string title )
- {
- //设置Window的通用属性
- Window testwindow = new Window();
- testwindow.Height = 400;
- testwindow.Width = 500;
- testwindow.Top = top;
- testwindow.Left = left;
- testwindow.Title = title;
- testwindow.Visibility = Visibility.Visible;
- //添加一个内部有按钮的Canvas,设置Canvas的背景色为白色
- Button btn=new Button();
- btn.Width=80.0;
- btn.Height=30.0;
- btn.Content="点 击";
- btn.Margin = new Thickness(5, top + Flag * 10, 0, 0);
- btn.Click += new RoutedEventHandler(btn_Click);
- Canvas canvas = new Canvas();
- canvas.Children.Add(btn);
- canvas.Background = new SolidColorBrush(Colors.White);
- testwindow.Content = canvas;
- //窗口默认值是WindowState.normal正常情况
- testwindow.WindowState = WindowState.normal;
- //WindowState.Maximized; 窗口最大化
- //WindowState.Minimized; 窗口最小化
- //WindowState.normal; 普通窗口
- void btn_Click(object sender, RoutedEventArgs e)
- {
- PopWindow(400.0, "第"+Flag+"个实例窗口");
- }
- }
本实例采用VS2010 +Silverlight 5 beta制作,如需源码请点击 SL5First.zip 下载。
Silverlight Navigation-Silverlight页面间自定义导航
关于Silverlight Navigation导航我一直想写一篇文章总结一下在项目中实际应用. Navigation导航是关联一个应用程序中实现功能多样化最基本需求. 导航也可以详细分为应用程序导航[应用中多为Page之间],外部导航,集成浏览器导航等. Silverlight 发展今天版本4 当然也在这个方面做出很多努力. 从1.1 2.0 NavigationService到今天出现Frame控件,导航框架等. 逐渐丰富加强这方面运用. 本篇的目的自定义一个导航帮助类 实现Silverlight 中页面间导航操作. 先看看效果[稍微有点大]:
在项目中使用 新建三个测试页面 分别命名为:NvgTestPageOne /Two/Three.xaml,默认初始页TestPageone.xaml,可以从TestPageone跳转Two 跳转后可以通过Back按钮返回上一页. 当然各个页面间也支持直接跳转,整个流程如图:
实现步骤: 自定义导航帮助类-NavigationHelper
A:引用空间
- using System.Collections;
- using System.Collections.Generic;
- using System.Reflection;
B:在NavigationHelper声明变量:
- //声明
- private static Grid FrameGrid = new Grid();//用存储导航页面和实现操作
- private static Dictionary<string, string> getFrameDic = new Dictionary<string, string>();//记录整个跳转流程
C:从当前页面跳转到一个新页面:
- /// <summary>
- /// 跳转新页面
- /// </summary>
- public static void NavigationFrame(UserControl sendpage)
- {
- App getcurentapp = Application.Current as App;
- if (getcurentapp != null)
- {
- //保存老页面
- Grid rootgrid=getcurentapp.RootVisual as Grid;
- UserControl getoldpageCon = rootgrid.Children[0] as UserControl;
- //测试发现问题:SendPage.Name有可能为空. 换利用Type的属性值
- //添加时注意键不能重复
- bool isreply = false;
- foreach (keyvaluePair<string, string> getkey in NavigationHelper.NavigationHelp.getFrameDic)
- {
- if (getkey.Key.Equals(sendpage.GetType().Name + "old"))
- {
- isreply = true;//已经存在
- }
- }
- if (!isreply)
- {
- NavigationHelp.getFrameDic.Add(sendpage.GetType().Name + "old", getoldpageCon.GetType().Name);
- }
- //跳转新页面
- rootgrid.Children.Clear();
- rootgrid.Children.Insert(0, sendpage);
- getcurentapp.RootVisual = rootgrid;
- }
- }
这个方法参数就是要跳转到页面UserControl. 通过操作App.RootVisual中Grid. 把新页面作为子控件添加到Grid.Children集合中. 当然跳转后如果Back返回操作. 我们必须记录这个跳转流程在Dictionary<string, string>中. 页面间记录识别模式如下:
D:返回到上一页
- /// <summary>
- /// 自动跳转到上一页 类似IE的历史记录
- /// </summary>
- public static void NavigationBackFrame(UserControl CurrentPage)
- {
- bool isexit = false;//是否存在上一页 或是判断是否是根目录
- string backpage = string.Empty;
- foreach (keyvaluePair<string,string> getkey in NavigationHelp.getFrameDic)
- {
- if (getkey.Key.Equals(CurrentPage.GetType().Name+"old"))
- {
- isexit = true;//存在
- backpage =getkey.Value;
- //MessageBox.Show(backpage); 测试成功
- }
- }
- if (!string.IsNullOrEmpty(backpage))
- {
- //返回上一页
- UserControl getbackControl = NavigationHelp.NavigationGetControlByName(backpage);
- if (getbackControl != null)
- {
- App getcurentapp = Application.Current as App;
- Grid rootgrid = getcurentapp.RootVisual as Grid;
- //跳转
- rootgrid.Children.Clear();
- rootgrid.Children.Insert(0, getbackControl);
- getcurentapp.RootVisual = rootgrid;
- }
- }
- else
- {
- //不存在或是已经是根目录
- MessageBox.Show("当前已经是根目录!");
- }
- }
BackFram如上方法参数是当前页Control 传入后在Dictionary中查找对应跳转流程上一页记录. 然后跳转. 其中获取对应各页Control利用Assembly发射原理.具体方法实现如下:
F:获得一个具体页面Control:
- /// <summary>
- /// 通过Control的名称利用反射获取 UserContol实例对象./
- /// </summary>
- public static UserControl NavigationGetControlByName(string controlname)
- {
- //获取当前Assembly
- UserControl getpageControl = null;
- Assembly getcurrentass = Assembly.GetExecutingAssembly();
- foreach (Type gettype in getcurrentass.GetTypes())
- {
- if (gettype.Name.Equals(controlname))
- {
- //存在该Control
- getpageControl = Activator.CreateInstance(gettype) as UserControl;
- }
- }
- return getpageControl;
- }
G:调用方式
如从Testpageone跳转到TestpageTwo页面 如下:
- //调用导航帮助类下公开当行方法 跳转到TestpagetTwo
- UserControl sendpageCon=NavigationHelper.NavigationHelp.NavigationGetControlByName("NvgTestPageTwo");
- NavigationHelper.NavigationHelp.NavigationFrame(sendpageCon);
如果从TestPageTwo页面返回到TestpageOne 调用如下:
- //调用导航帮助类 返回记录上一页
- UserControl currentControl = NavigationHelper.NavigationHelp.NavigationGetControlByName("NvgTestPageTwo");
- NavigationHelper.NavigationHelp.NavigationBackFrame(currentControl);
直接跳转就更简单 同方式一类似.
如上一个简单方式实现Silverlight页面间跳转自定义帮助类. 简便快捷.当然如上只是简单跳转.实际运用中涉及到页面间参数的传递,值状态保留等问题. 完全可以在这个基础之上加以扩展即可.关于更多的Silverlight Navigation实现方式 稍后会有介绍.
关于Silverlight Navigation项目源代码下载见附件。
Silverlight 确保您的 Silverlight 应用程序能与 Silverlight 4 一起工作
Silverlight 确保您的 Silverlight 应用程序能与 Silverlight 4 一起工作 在 Silverlight 3 和 Silverlight 4 之间,针对 Silverlight 运行时和 Silverlight 工具做出了一些更改。对于这些更改,以下原则适用: * 无需任何更改,多数 Silverlight 3 应用程序都可与 Silverlight 4 一起使用。 * 要求重大更改时,Silverlight 将通过使用“突发模式”尽量同时保持对旧行为和新行为的支持。 即便如此,对 Silverlight 组件所做的某些更改仍可能导致旧的基于 Silverlight 的应用程序失败(在编译时、XAML 加载时或可能在设计时)或操作异常。 本主题介绍在 Silverlight 3 和 Silverlight 4 之间所做的更改。本主题不介绍 Silverlight 4 的新功能或增强功能。有关 Silverlight 4 中的新增功能的信息,请参见 Silverlight 4 中的新增功能。 注意说明: 有关对本主题的更正和增补,请参见 Silverlight SDK blog(Silverlight SDK 博客)。 本主题包含以下各节: * XAML 分析器更改 本节介绍 Silverlight 4 中的 XAML 分析器更改。 * 自 Silverlight 3 以来的重大更改 本节中介绍的更改可能会破坏用户在 Silverlight 4 运行时上运行的为 Silverlight 3 编写的应用程序,即便应用程序清单的目标为 Silverlight 3 也是如此。 * 突发模式行为 本节介绍运行时或其 API 中的哪些部分包括特定于版本的行为差异。这些行为差异基于应用程序的目标运行时版本。这些更改往往代表针对 Silverlight 4 的错误修复,但 Silverlight 3 行为作为特定的突发模式仍然可以访问,仅在应用程序的目标是 Silverlight 3 运行时的情况下才可以使用突发模式。在应用程序的逻辑依赖于 Silverlight 3 行为时才这样做。 * 升级重大更改 本节介绍在您重新编译 Silverlight 3 应用程序并准备面向 Silverlight 4 时涉及的相关更改。 * 自 Silverlight 4 Beta 以来的重大更改 本节介绍专门为 Silverlight 4 Beta(Silverlight 运行时的最新公开发布版本)编译的应用程序才会涉及的相关更改。没有可用于 Silverlight 4 Beta 运行时行为的突发模式。 XAML 分析器更改 Silverlight 4 引入了更新的 XAML 分析器。同时为保持兼容性,Silverlight 4 运行时还保留了原始 Silverlight 3 XAML 分析器,并用它来分析面向 Silverlight 3 的任何应用程序的 XAML。这意味着如果您继续以 Silverlight 3 为目标,对 Silverlight 3 有效的任何原始 XAML 行为仍将有效,只要该 XAML 行为与“升级重大更改”一节中所列的特定重大更改没有冲突。其实际效果与用于 XAML 加载的突发模式相似。 如果将以前面向 Silverlight 3 的 Silverlight 项目升级为现在面向 Silverlight 4,则可能需要更改您的 XAML。如果要升级 Silverlight 4 Beta 项目,则可能需要更改您的 XAML。Silverlight 4 Beta XAML 分析器行为与 Silverlight 3 XAML 分析器行为大体相同。 影响您应用程序的 XAML 的 XAML 行为差异涉及面太广,无法在此一一列出,改为在其他主题中介绍。有关更多信息,请参见 Silverlight 3 和 Silverlight 4 之间的 XAML 处理差异或 Silverlight 版本和 WPF 之间的 XAML 处理差异。 自 Silverlight 3 以来的重大更改 本节介绍的更改可能会破坏 Silverlight 3 应用程序。其中许多更改实际上是错误修复。 不过,如果您的 Silverlight 3 应用程序已经针对这些错误添加了解决方法,您可能不得不取消这些解决方法,这样在 Silverlight 4 运行时上运行时,您的应用程序才能正常工作。 当应用程序属性与新的 Silverlight 4 属性冲突时,出现 XAML 分析 AmbiguousMatchException 如果您在 XAML 中设置属性且两个不同的属性具有相同的简单名称,Silverlight XAML 分析器(特别是处理兼容性的并行 XAML 分析器)将引发 AmbiguousMatchException。如果一个属性名称匹配候选者是基类的成员,另一个候选者是派生类的成员,就可能引发异常。在根据 Silverlight 3 内核生成应用程序时,可能只存在应用程序定义的属性。但是,如果高版本的 Silverlight(如 Silverlight 4)添加具有相同简单名称的属性且该属性在通过新基类定义继承的内核运行时成员定义中存在,则该属性名称现在对于 XAML 分析器有歧义。 例如,Silverlight 3 应用程序可能从 TextBox 派生并针对自定义类声明名为 Watermark 的 XAML 可访问的新属性。在 Silverlight 3 中,TextBox 不具有名为 Watermark 的属性,因此在 Silverlight 3 中应用程序进行 XAML 分析时不会出现名称歧义。但是,TextBox 的 Silverlight 4 内核库定义引入了名为 Watermark 的属性,因此在根据 Silverlight 4 内核运行时执行时,简单属性名称的 Silverlight 3 XAML 查找进程现在有歧义。 此问题只影响 XAML 使用;在这种情况下使用代码中的属性没有歧义。仅当两个属性定义类型之间存在子类/超类关系时,才存在此问题。例如,MyButton.Watermark 属性不会有问题,因为 MyButton 不是 TextBox 的子类。 此问题只影响基于 Silverlight 2 和 Silverlight 3 生成的应用程序。Silverlight 4 应用程序使用新的 XAML 分析器,该分析器可以解决此类名称歧义的问题。真正的 Silverlight 3 运行时中存在同样的 XAML 分析器问题。如果 Silverlight 2 应用程序定义并使用在 Silverlight 3 中添加的属性名称,将出现 AmbiguousMatchException。 以下章节列出在 Silverlight 4 中添加到通用基类(DependencyObject、UIElement、FrameworkElement、Control 和 System.Windows.dll 中的 Control 子类)的属性。每个属性表示是子类中名称歧义候选者的属性名称。 * FrameworkElement.FlowDirection * FrameworkElement.Unloaded * 拖放 API(AllowDrop、dragenter、DragLeave、DragOver、Drop) * 操作 API(ManipulationCompleted、ManipulationDelta、ManipulationStarted) * UIElement.MouseRightButtonDown,UIElement.MouseRightButtonUp * IME API(TextInput、TextInputStart、TextInputUpdate) * 其他文本控件 API(几个与文本相关的类型的 BaselineOffset、TextBox.InputScope、TextBox.Watermark、ButtonBase.Command、ButtonBase.CommandParameter) * Selector.SelectedValue,Selector.SelectedValuePath 遇到此问题的应用程序必须使用 Silverlight 4 重新编译和生成目标文件;重新编译后的应用程序使用新的 XAML 分析器,可以正确解析。 切换全屏模式现在将重新运行命中测试 切换全屏模式现在将重新运行命中测试。这样做是为了允许在切换之前处于鼠标之下的控件更新其 MouSEOver 状态。 在切换全屏模式时,鼠标指针很可能因 Silverlight 插件大小的更改“跳转”到其他位置。在退出全屏模式时,鼠标指针可能位于插件之外。在以往,不会发出鼠标消息以通知控件鼠标指针不再位于这些控件上方。现在,在切换全屏模式后完成布局时,将引发鼠标事件以重新运行命中测试,并允许控件按需更改状态。 有关更多信息,请参见全屏支持。 更改 ItemControl 的 displayMemberPath 和 ItemTemplate 属性现在将重新创建所有容器 在 Silverlight 3 中,设置项模板的 ItemTemplate 和 displayMemberPath 属性(如在下面的代码中)在完成 ListBox 测量后没有任何效果。 XAML 复制 <ListBox x:Name="lb" ItemTemplate="{StaticResource lbItem}"> VB C# C++ F# JScript 复制 lb.ItemTemplate = lbItemTemplate; lb.displayMemberPath = itemdisplayPath; 在 Silverlight 4 中,此代码将使所有已实现的容器无效,并重新创建它们,即便是在测量完容器后。 共享的 BitmapImage 源 当两个 BitmapImage 控件共享同一 BitmapImage 源,并且二者均未显式设置 Width/Height(均使用自然大小),第二个 Image 不在 Silverlight 3 中呈现其 BitmapImage。此行为在 Silverlight 4 中已纠正,现在两个 Image 控件均应正确呈现其内容。 IronPython 2.0.2 和更早版本 Silverlight 4 不能与 IronPython 的早期版本一同工作,请升级为 IronPython 2.0.3 或更高版本,这些版本可通过 http://ironpython.codeplex.com/ 来下载。 Microsoft.Jscript.Compiler.dll / Microsoft.Jscript.Runtime.dll Silverlight 4 不能与 Microsoft.Jscript.Compiler.dll / Microsoft.Jscript.Runtime.dll(亦称“DLR Jscript”,有时也称为“托管 Jscript”)一同工作。最近发布的试用 DLR Jscript 是作为 Dynamic Languages SDK 0.4.0 Alpha 的一部分发布的。此功能因不能完全发挥作用已被取消,不再使用。有关详细信息,请参见 http://dlr.codeplex.com/Thread/View.aspx?ThreadId=58121。(不应将 DLR Jscript 与更常用的基于浏览器的 Silverlight 的 JavaScript API 相混淆,后者一直有效) DRM 和操作系统位于 fat32 分区的客户端 在 Silverlight 3 中,DRM 可以在操作系统安装在 fat32 驱动器或分区的客户端系统上正常工作。(对于特意不使用安装或操作系统转换默认设置的少量 Windows XP 操作系统存在这种情况。) 在 Silverlight 4 中,DRM 功能在操作系统安装在 fat32 驱动器或分区的客户端系统上不能正常工作。 建议的用户解决方法是转换到 NTFS。请参见 http://support.microsoft.com/kb/314097/。 突发模式更改 Silverlight 团队曾想要在 Silverlight 4 中修复若干 Silverlight 3 错误。但在修复其中一些错误后,某些现有的 Silverlight 3 应用程序可能会被破坏。为了避免此问题,Silverlight 团队通过为运行时行为创建“突发模式”来解决这些可能产生问题的更改。突发模式更改是这样一种更改:如果 Silverlight 4 运行时检测到应用程序面向 Silverlight 3,该运行时将使其行为产生分支。这样,Silverlight 4 将成为“错误兼容的”运行时。但是,如果您面向 Silverlight 4 重新编译应用程序,则可能需要重新检查所指出的突发模式行为。 如果您的应用程序的 RuntimeVersion 指定 Silverlight 3,则运行时将在突发模式下运行。处于突发模式下时,运行时回退到与突发模式更改关联的 Silverlight 3 行为,并在这些情况下始终这样操作,就像该运行时实际上是未升级的 Silverlight 3 运行时一样。 Silverlight 4 运行时通过使用 RuntimeVersion 检测应用程序是否是为 Silverlight 3 设计的。RuntimeVersion 设置为 XAP 文件的 AppManifest.xaml 中的属性: 复制 <Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" EntryPointAssembly="ElevatorSilverlight" EntryPointType="ElevatorSilverlight.App" RuntimeVersion="3.0.31005.0"> <Deployment.Parts> <AssemblyPart x:Name="ElevatorSilverlight" Source="ElevatorSilverlight.dll" /> </Deployment.Parts> </Deployment> RuntimeVersion 反映在编译应用程序时位于开发人员计算机上的 Silverlight 的内部版本号。 如果使用 Silverlight 4 工具编译您的应用程序并且将目标专门设定为 Silverlight 3,您就潜在地调用了突发模式,就像是使用 Silverlight 3 工具编译了应用程序一样。 范围和容器中的正确空白处理 Silverlight 3 中的 TextBlock(以及 Silverlight 4 Beta 中的 RichTextArea)��� <Span> 或 <Run> 部分中存在错误,此时 XAML 中的空白(通常用于格式设置)实际上用作内容。这有时会要求限制在 XAML 源中使用换行符,导致 XAML 的可读性较差。此行为对于 Silverlight 3 是突发的,作为 Silverlight 3 和 Silverlight 4 之间的 XAML 处理差异中所述更大 XAML 分析器行为的一部分。 Silverlight 4 中的文本容器接受文本内容,并在对象模型中为任何“innertext”文本内容创建隐式文本运行。这样才能在由 CRLF 分隔的文本元素之间生成空白。例如: 复制 <Run>Some</Run> <Run>Text</Run> 转换为: 复制 <Run>Some</Run><Run> </Run><Run>Text</Run> Silverlight 4 中放宽了裁剪前导和尾随空白的条件。以往的行为会裁剪隐式 Run 元素的前导空白,除非 Run 的前面有一个显式 Run。Silverlight 4 行为会裁剪前导空白,除非隐式 Run 的前面有一个并非 Run 的显式文本元素(例如:Span、InlineUIContainer、Hyperlink)或有一个显式 Run。 面板的 Clear 方法现在调用 InvalidateMeasure 在 Silverlight 4 中,当调用 Panel 项集合的 Clear 方法时,现在会引发针对 InvalidateMeasure 的调用。这将在下一个计时周期开始时触发布局。在 Silverlight 3 中,调用 Clear 仍将对 Panel 布局没有任何影响。 VirtualizingStackPanel.MouseWheelUp 和 VirtualizingStackPanel.MouseWheelDown 现在滚动三行 在 Silverlight 3 已编译应用程序中,MouseWheelUp 和 MouseWheelDown 方法仍将滚动一行。但是在 Silverlight 4 应用程序中,这些方法将滚动三行。 ImageBrush.ImageSource 现在返回 ImageSource 对象而不是 UriSource 在 Silverlight 3 应用程序中,ImageBrush.ImageSource 返回其 ImageSource 的 UriSource(字符串)。这与 Silverlight 1.0 中的最初 JavaScript 行为是相同的。 在 Silverlight 4 中,将返回实际 ImageSource 对象,该对象可以是 WriteableBitmap 或 BitmapImage。 在动画期间更改基值现在可发挥预期作用 在 Silverlight 3 中,如果在某个活动的动画中间对某个属性调用了 SetValue,结果仅适用于该计时周期。SetValue 将正确地更改该值,但是在活动动画的下一计时周期,该动画将覆盖设置的值。这种情况看上去常常就像什么都没有发生(对新值的更改太快,使用户难以觉察)。SetValue 调用并不更改动画的基值(GetAnimationBaseValue 的结果)。停止动画时,基值将返回给在开始动画之前属性所具有的值,忽略 SetValue。 在 Silverlight 4 中,如果在活动动画的中间发生属性值更改,SetValue 调用将修改动画的基值。停止动画时,该动画将使用新的基值。这与 WPF 中的行为相同。(请注意,HoldEnd 动画不一定受此更改影响)。 当动画有效时 ReadLocalValue 返回本地值 在 Silverlight 3 中,对属性进行动画处理并且动画正在运行时,针对 ReadLocalValue 的调用将返回经过动画处理的值。 在 Silverlight 4 中,针对 ReadLocalValue 的调用将返回本地值。这与 WPF 中的行为相同。如果需要经过动画处理的值,请调用 GetValue。 在样式中的重复 setter 全部引用同一附加属性时,不会调用这些 setter 在 Silverlight 3 中,可以使用多个 Style Setter 对同一附加属性设置两次。特定的方案会用到此特性。 在 Silverlight 4 中,不再支持此行为。在 Setters 中两次设置同一附加属性并不属于语法错误。但是,只有最后一个引用附加属性的 Setter 才会被 Silverlight 样式子系统实际调用,任何其他 setter 的结果都是无操作 (no-op)。此行为与 WPF 行为相同。 浏览器缩放和 Content.Resized 在 Silverlight 4 中,如果应用程序与 Resized 事件挂钩,Silverlight 内容区域的视图将在浏览器缩放级别更改时自动缩放。如果 Silverlight 4 应用程序要禁用自动浏览器缩放,该应用程序必须将 EnableAutoZoom 属性显式设置为 false。 Silverlight 3 认定侦听 Resized 的应用程序自己会处理浏览器缩放,所以禁用自动浏览器缩放。因此,如果应用程序面向 Silverlight 3,则突发模式行为是:没有任何缩放行为与 Resized 关联。 MEF API 更改 以下是对 Silverlight MEF 组件(System.ComponentModel.Composition 程序集和相关组件)中存在的托管扩展框架 (MEF) API 的特定更改: * PartCreator<T> 已重命名为 ExportFactory<T>,移到 System.ComponentModel.Composition.Initialization.dll * Partinitializer 已重命名为CompositionInitializer * CompositionHost.InitializeContainer 已重命名为CompositionHost.Initialize * PackageCatalog 已替换为DeploymentCatalog 字符串比较和 CultureInfo String 和 Char 类的某些字符串比较 API 对于如何获取有效 CultureInfo 使用不同的逻辑,具体取决于应用程序在 Silverlight 3 还是 Silverlight 4 上运行。这仅适用于重载未传递特定 CultureInfo 的情况。该行为是突发的,因此 Silverlight 3 应用程序不必纠正它。下表列出了 API 差异: API Silverlight 3 Silverlight 4 EndsWith Ordinal CurrentCulture IndexOf Ordinal CurrentCulture LastIndexOf Ordinal CurrentCulture StartsWith Ordinal CurrentCulture ToLower InvariantCulture CurrentCulture toupper InvariantCulture CurrentCulture ToLower InvariantCulture CurrentCulture toupper InvariantCulture CurrentCulture 从 IList、IList<T> 填充 ItemsControl 在 Silverlight 3 中,如果使用 IList 或 IList<T> 填充 ItemsControl,系统使用枚举器执行填充。在 Silverlight 4 中,系统使用专用索引器(和 Count)执行填充。 升级重大更改 如果将项目升级为面向 Silverlight 4 运行时,则往往需要先解决此类别中所列的问题,然后才能重新编译您的应用程序。您可能还需要重新检查您的应用程序逻辑,该逻辑可能一直依赖突发模式行为。 有关更多信息,请参见上文中的“突发模式更改”一节。 项目更改 如果将以前面向 Silverlight 3 的 Silverlight 项目升级为专门面向 Silverlight 4,则可能需要对项目结构进行某些更改。还可能需要对该项目所用的文件和资源进行更改。在某些情况下,这是因为某些行为允许作为 Silverlight 3 突发行为,但在改为面向 Silverlight 4 后不再允许这样做。 一些类型已从 Silverlight SDK 移至核心运行时 以下类型已从 Silverlight SDK 移至核心运行时: * System.ComponentModel.IEditableCollectionView * System.ComponentModel.NewItemPlaceholderPosition * System.Windows.Data.CollectionViewGroup * System.Windows.Data.PropertyGroupDescription 旧程序集:System.Windows.Data.dll 新程序集:System.Windows.dll 现有的 Silverlight 3 应用程序应该能照常工作,因为 System.Windows.Data.dll 客户端程序集通常在 XAP 文件中分发。 如果使用 Silverlight 4 工具编译您的应用程序,使其面向 Silverlight 4,该应用程序将使用核心运行时库中的类。 而且,在 Silverlight 4 Beta 和 Silverlight 4 之间,System.Windows.Navigation 命名空间中的某些(不是全部)API 已从 System.Windows.Controls.Navigation.dll 移到内核 System.Windows.dll。现在位于 System.Windows 中的 API 有:NavigatedEventHandler、NavigatingCancelEventArgs、NavigatingCancelEventHandler、NavigationEventArgs、NavigationMode。 修复了 TabControl 键盘导航 Silverlight 3 在 TabControl 的键盘导航模式中,按上箭头键激活的是下一个 TabItem,按下箭头键激活的是上一个 TabItem。这在 TabStripPlacement 设置为 Left 或 Right 时将导致与直观行为相悖的行为。在这种情况下,按上箭头键激活的是当前活动的 TabItem 之下的 TabItem,按下箭头键激活的是当前活动的 TabItem 之上的 TabItem。此行为仍存在于 Silverlight 3 应用程序中;TabControl 位于 System.Windows.Controls.dll 程序集中,该程序集是一个客户端库,经常打包到 XAP 文件中。 Silverlight 4 在 Silverlight 4 中按上箭头键激活的是上一个 TabItem(即:当 TabStripPlacement 设置为 Left 或 Right 时,垂直布局模式中的当前活动 TabItem 之上的项)。按下箭头键激活的是下一个 TabItem(垂直布局模式中的当前活动 TabItem 之下的项)。如果引用或分发 Silverlight 4 System.Windows.Controls.dll 程序集,则这是更新的行为。 控件现在具有内置的鼠标滚轮支持 在 Silverlight 4 中,以下控件现在具有内置的 MouseWheel 事件支持: * ListBox * TextBox * ComboBox * ScrollViewer * Calendar * DatePicker * DataGrid 在 Silverlight 3 中,没有内置的 MouseWheel 支持。 如果将应用程序从 Silverlight 3 升级到 Silverlight 4,您可能要删除以前所有的应用程序级别的特定鼠标滚轮事件处理,有可能需要在 HTML DOM 中删除。这可能适用于以下任意控件:ListBox、TextBox、ComboBox 和 ScrollViewer。有关更多信息,请参见鼠标轮输入。 注意说明: 还有一些具有 MouseWheel 支持的控件未在此处列出,因为它们不存在于 Silverlight 3 中。一个示例是 RichTextBox。检查各个控件引用页,看是否存在有关 MouseWheel 处理的 OnMouseWheel 重写或其他备注。 DataGrid 中的货币更改时的 DataGridCell 对象和自动化焦点 当 DataGrid 中的货币更改时,Silverlight 4 中的 DataGridCell 对象接收自动化焦点,焦点不再保留在 DataGrid 本身上。 一些详细信息:UI 自动化客户端原先不获取有关当前具有焦点的单元格的信息,因为 DataGridCell 对象不是可获得焦点的控件(尝试的 Focus 返回 false)。这一点没有变化。DataGridCell 对象在 UI 中仍不可获得焦点。但是,对于 Silverlight 4,这些对象将在 DataGrid 货币更改时接收“自动化焦点”。现在当您按 Tab 键进入 DataGrid 并使用箭头键更改货币时,自动化焦点将移至各个单元格同级,以便 UI 自动化客户端能够接收这些单元格的特定自动化属性信息。以前,自动化焦点保留在 DataGrid 上;它基于 Silverlight 3 System.Windows.Controls.Data.dll 作为 Silverlight 3 行为保留。 System.ServiceModel.PollingDuplex.dll 程序集已重构 如果此前引用过 System.ServiceModel.PollingDuplex.dll 程序集,在将项目升级到 Silverlight 4 之后,您必须手动添加对 System.ServiceModel.Extensions.dll 扩展程序集的引用。最初的程序集已被重构,有些类已移至新程序集。 自 Silverlight 4 Beta 以来的重大更改 如果您创建了 Silverlight 4 Beta 应用程序,Silverlight 4 Beta 与 Silverlight 4 之间存在一些重大更改,下面各节将对此进行介绍。 RichTextArea 已重���名为 RichTextBox RichTextArea 已重命名为 RichTextBox。CLR 命名空间和程序集位置保持不变。 针对 DRM API 的更改 自 Silverlight 4 Beta 以来更改了一些与 DRM 相关的 API。 以前 复制 public class DomainAcquirer { public void DomainJoinAsyncCancel(); public void DomainLeaveAsyncCancel(); public event EventHandler<DomainoperationCompletedEventArgs> DomainoperationCompleted; } public class LicenseAcquirer { public void AcquireLicenseAsyncCancel(); public string CustomData; } public class MediaLicense { public DateTime ExpirationDate; } public enum ContentKeyType { AES128Bit, Cocktail } 之后 复制 public class DomainAcquirer { public void CancelAsync(); public event EventHandler<DomainJoinCompletedEventArgs> DomainJoinCompleted; public event EventHandler<DomainLeaveCompletedEventArgs> DomainLeaveCompleted; } public class LicenseAcquirer { public void CancelAsync(); public string ChallengeCustomData; } public class MediaLicense { public Nullable<DateTimeOffset> ExpirationDate; } public enum ContentKeyType { Aes128Bit, Cocktail } TextSelection.SetPropertyValue 已重命名为 TextSelection.ApplyPropertyValue 如果您的代码关联到 RichTextArea/RichTextBox(使用 TextSelection.SetPropertyValue 设置选定文本的格式),您必须将此代码改为调用 TextSelection.ApplyPropertyValue。 INotifyDataErrorInfo 和 DataErrorsChangedEventArgs 移至 System.Windows.dll Silverlight 4 Beta 中添加了 INotifyDataErrorInfo 和 DataErrorsChangedEventArgs。这些类型在 Silverlight 4 中已从 System.dll 移至 System.Windows.dll。如果您使用这些类型,则必须重新编译您的项目,并且可能需要调整您的引用程序集。 Webbrowser.ScriptNotify 签名更改 复制 public event NotifyEventHandler ScriptNotify; 更改为: 复制 public event EventHandler<NotifyEventArgs> ScriptNotify; 而且,Webbrowser.LoadCompleted 现在使用更具体的委托:LoadCompletedEventHandler。您可以继续使用 EventHandler,您的应用程序仍将编译,但是应用程序可能要升级以接收 NavigationEventArgs 事件数据。 NotificationWindow API 更改 在 NotificationWindow API 中: 复制 public bool Visible { get; } public event EventHandler<EventArgs> Closed; 更改为: 复制 public Visibility Visibility { get; } public event EventHandler Closed; 网络摄像机和输出保护 API 的更改 存在一些与网络摄像机和输出保护相关的 API 更改。 * 针对音频/视频捕获设备的集合以及支持的格式现在返回 ReadOnlyCollection<T> 格式的不可变的集合。这将影响对 GetAvailableAudioCaptureDevices、GetAvailableVideoCaptureDevices 或 VideoCaptureDevice 方法的所有调用。 * Connectors 重命名为 VideoOutputConnectors 且返回的集合不可变:ReadOnlyCollection<VideoOutputConnector>。 * 若干枚举的大小写已更改: 复制 VGA -> Vga DVI -> Dvi HDMI -> Hdmi LVDS -> Lvds SDI -> Sdi UDIExternal -> UdiExternal UDIInternal -> UdiInternal * CanEnablehdcp 重命名为 CanEnablehdcp,CanEnableCGMSA 重命名为 CanEnableCgmsa。 * VideoFormat.Height 重命名为 VideoFormat.PixelHeight。VideoFormat.Width 重命名为 VideoFormat.PixelWidth。 * WaveFormatType.PCM 重命名为 WaveFormatType.Pcm。 * ContentKeyType.AES128Bit 重命名为 ContentKeyType.Aes128Bit。 * AsyncCaptureImage 的使用模式已更新为基于标准 .NET 事件的异步模式。在 Silverlight 4 中,您调用 CaptureImageAsync 并且处理 CaptureImageCompleted。所需的图像是事件数据的 Result 值,且和以前一样是一个 WriteableBitmap。 复制 // Old usage void CallbackFunc(WriteableBitmap img) { //... } myCaptureSource.AsyncCaptureImage(CallbackFunc); // New usage. void CallbackFunc(object sender,CaptureImageCompletedEventArgs args) {//...} myCaptureSource.ImageCaptureCompleted += CallbackFunc; myCaptureSource.ImageCaptureAsync(); COM 互操作 API 更改 用于 Silverlight 4 中的 COM 互操作的类型已移至新的命名空间,并且类型名称已更改。 复制 namespace System.Windows.Interop { public sealed class ComAutomationEvent public sealed class ComAutomationEventArgs : EventArgs public delegate void ComAutomationEventHandler(object sender,ComAutomationEventArgs e) public static class ComAutomationFactory } 更改为: 复制 namespace System.Runtime.InteropServices.Automation { public sealed class AutomationEvent public sealed class AutomationEventArgs : EventArgs public static class AutomationFactory } RichTextBox.textwrapping 默认值现已设置为 Wrap 对于 Silverlight 4,textwrapping 的默认值为 textwrapping.Wrap。以前的默认值为 textwrapping.Nowrap。 在 XAML 中设置 Binding 且目标为 DependencyObject 时的行为更改 在 Silverlight 4 中,在 XAML 中对 DependencyObject 的依赖项属性设置的绑定将向这些属性附加一个 BindingExpression 而不是设置 Binding 对象。 在 Silverlight 3 中,绑定目标必须是一个 FrameworkElement,所以不会出现上述情况。在 Silverlight 4 Beta 中添加了对任何 DependencyObject 依赖项属性的绑定。 如果存在以下任何情况,则您不会受到此更改的影响: * 应用程序面向 Silverlight 3 编译或以此为目标。 * 目标对象是一个 FrameworkElement(在与 UI 相关的绑定中使用的多数对象都是 FrameworkElement 派生类) * 目标属性是 CLR 属性而不是依赖项属性 在这一更改前: 复制 <local:MyDependencyObject MyProperty="{Binding MyItem}" /> 这将 MyProperty 设置为具有路径 MyItem 的 Binding 对象。 在这一更改后: 复制 <local:MyDependencyObject MyProperty="{Binding MyItem}" /> 这会将 BindingExpression 附加到侦听路径 MyItem 的 MyProperty(类似调用 SetBinding)。想要设置 Binding 对象的行为的 Silverlight 4 应用程序应将目标属性设置为 CLR 属性而不是 DependencyProperty。这与 FrameworkElement 行为是一致的。 HtmlBrush 已重命名为 WebbrowserBrush 将针对 HtmlBrush 的所有引用更改为 WebbrowserBrush。CLR 命名空间和程序集位置保持不变。 ListBoxItem 可视状态已重命名 ListBoxItem 已对它的两个指定可视状态进行重命名。 * Silverlight 4 Beta 中的 Loaded 可视状态现在名为 AfterLoaded * Silverlight 4 Beta 中的 Unloaded 可视状态现在名为 BeforeUnloaded 如果您已经为包括这些可视状态的项控件编写模板,则此更改对您有影响。应该更改这些模板,以使用新的状态名称。如果您编写的 visualstatemanager 逻辑使用 ItemsControl 中定义的状态名称,则此更改也可能对您有影响。 新状态名称反映在针对 ListBoxItem 类型的 CLR 特性中。相关状态在 Silverlight 3 ListBoxItem 中不存在。 不支持样式 Setter 中的绑定 在 Silverlight 4 Beta 中,样式 setter 中的绑定(Setter.Property 值)在语法上是允许的(尽管与等效的 WPF 用法相比,这些绑定不能发挥预期作用)。 在 Silverlight 4 中,样式 setter 中的绑定现已在语法级别上禁用。在 Silverlight 3 中也同样禁用。 CultureNotFoundException API 更改 以下 API 存在于 Silverlight 4 Beta 的 CultureNotFoundException 中,但是已从 Silverlight 4 中删除: 复制 public CultureNotFoundException(string message,int invalidCultureId,Exception innerException); public CultureNotFoundException(string paramName,string message); public virtual Nullable`1<int> InvalidCultureId { get; } Contract.ContractFailed API 更改 System.Diagnostics.Contracts.Contract.ContractFailed 存在于 Silverlight 4 Beta 中,但是已从 Silverlight 4 中删除。还删除了 ContractFailedEventArgs。 Action 和 Func (T5+) API 更改 .NET Framework 包含几个 Action 和 Func 委托的元数。这个重大更改专门影响具有至少 5 个输入参数(T5 的参数名称存在)的 Silverlight Action 和 Func 委托,这些委托对于 .NET Framework 4 也是新的。所有这些委托在 Silverlight 4 Beta 和 4 RC 中以前都位于程序集 System.Core 中。现在它们已移到 mscorlib 中。如果在 Beta/RC 中使用了这些委托,必须使用 Silverlight 4 RTM 位重新编译。 请参见 任务 如何创建新 Silverlight 项目 概念 Silverlight 的 JavaScript API XAML 概述 其他资源 Silverlight 4 中的新增功能
今天关于总结Silverlight与HTML页面交互基本方法(js调用Silverlight方法/属性 和Silverligth调用页面js方法)的分享就到这里,希望大家有所收获,若想了解更多关于Silverlight 2学习教程(五):JavaScript与Silverlight托管代码相互调用、Silverlight 5 beta新特性探索系列:1.安装Silverlight 5 beta环境以及OOB模式下Silverlight 5 多窗口支持、Silverlight Navigation-Silverlight页面间自定义导航、Silverlight 确保您的 Silverlight 应用程序能与 Silverlight 4 一起工作等相关知识,可以在本站进行查询。
本文标签: