原文地址:http://social.microsoft.com/Forums/zh-CN/silverlightzhchs/thread/749a2ce1-dfd8-4d11-88ee-537dd4a37842/
请问老师:
我在VS2008中新建了一个Silverlight项目。里面有个.xaml 文件,一个是Page.xaml,另一个是Page1.xaml文件。我如何在default.aspx和default2.aspx中分别用Page.xaml 和Page1.xaml.也就是说default.aspx用Page.xaml 而default2.aspx用Page1.xaml。默认的全部是用Page.xaml.
1.答复:
你的SilverLight2的项目默认编译为1个xap,默认的初始控件入口是Page.xaml.如果你想要显示两个不同的SilverLight可以添加两个SilverLight2的项目到你个工程中, Default.aspx引用 slapp1.xap,Default2.aspx引用slapp2.xap.一个SilverLight xap只有一个入口.
抽象个概念,就好比一个WinForm程序,你想要在机器1上执行这个exe显示界面1,机器2上执行这个.exe显示界面2,也不是不可以实现,就是你还要判断你的页面路径是什么,如果是Default.aspx默认显示page.xaml,如果是Defalut1.aspx,那么Page.Xaml载入Page1.Xaml.一般不推荐这种方法,容易造成你程序的混乱.
2.答复:
你可以直接在ASP.NET项目中添加两个XAML文件(如果是仅仅用XAML文件就可以的话),在ASPX页面把Silverlight控件的Source属性指为你要加载的页面即可,如果不使用Silverlight控件,可以在JavaScript代码中指定Source参数如:
function createSilverlight()
{
var scene = new SilverlightSite1.Page();
Silverlight.createObjectEx({
source: "xaml/MYXAML1.xaml",
parentElement: document.getElementById("silverlightControlHost"),
id: "SilverlightControl",
properties: {
width: "100%",
height: "100%",
version: "1.0"
},
events: {
onLoad: Silverlight.createDelegate(scene, scene.handleLoad),
onError: function(sender, args) {
var errorDiv = document.getElementById("errorLocation");
if (errorDiv != null) {
var errorText = args.errorType + "- " + args.errorMessage;
if (args.ErrorType == "ParserError") {
errorText += "<br>File: " + args.xamlFile;
errorText += ", line " + args.lineNumber;
errorText += " character " + args.charPosition;
}
else if (args.ErrorType == "RuntimeError") {
errorText += "<br>line " + args.lineNumber;
errorText += " character " + args.charPosition;
}
errorDiv.innerHTML = errorText;
}
}
}
});
3.答复:
如果你建立的是SilverLight2的Application 就很不方便在两个不同的页面调用一个SilverLight2项目中的两个不同的UserControl
如果想用这种方法解决办法基本有:
1.建立两个SilverLight2 Application两个页面分别引用不同的xap
2.一个SilverLight2 Application后台需要添加一些代码,读取当前是哪个页面调用,建立两个UserControl,对应的页面显示对应的UserControl
3.用超哥说的,如果你只是Xaml描述,或者基于SilverLight 1.0标准就是Xaml+Javascript的,可以两个页面分别引用两个Xaml文件,不用引用xap
方法1最为方便
方法2适合你大范围的应用,如果你只有两个页面这么用的话,我觉得就不适宜,如果是n个页面的情况可以进一步考虑
方法3最为灵活,但是你SilverLight2的很多特性不能应用进去
4.答复:
第一步
<div>
<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
<param name="source" value="ClientBin/yourapp.xap"/>
<param name="initParams" value="1" />
<param name="onerror" value="onSilverlightError" />
<param name="background" value="white" />
<param name="minRuntimeVersion" value="2.0.31005.0" />
<param name="autoUpgrade" value="true" />
<a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;">
<img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none"/>
</a>
</object>
</div>
第二步
private void Application_Startup(object sender, StartupEventArgs e)
{
if (e.InitParams.Count == 0)
{
this.RootVisual = new StartPage();
}
else
{
string para=e.InitParams[0].ToString();
if(para=="1")
{
this.RootVisual = new Page1();
}
if(para=="2")
{
this.RootVisual = new Page2();
}
}