动手试验:在 Silverlight 应用程序中动态加载新网页
您可以采用多种方式将内容以动态方式加载到 Microsoft Silverlight 应用程序中。在此过程中会创建有关内容页的各个对象,并加载其中的一个对象,以便在用户单击某个按钮时显示相应的内容。您可以在 MSDN 上的 Silverlight documentation(Silverlight 文档)以及 Silverlight community website(Silverlight 社区网站)上找到其他解决方案。
在运行时加载页面
在包含多个内容页的 Silverlight 项目中,打开启动页(通常为 Page.xaml)。在此过程中,假定您有名为 UserControl1.xaml 和 UserControl2.xaml 的两个内容页。
提示: 若要添加新的内容页,请单击“文件”菜单中的“新建项”。
在“工具”面板中,单击“资产”,然后选择“边框”版式面板 。在美工板上用鼠标绘制边框对象。
提示: 在选中这一新绘制的边框对象的情况下,可以在“属性”面板的“画笔”和“外观”下设置相应的属性以更改此对象的外观。例如,可以将“BorderBrush”属性设置为“纯色画笔” ,并将“BorderThickness”属性设置为 2。
在“对象和时间线”面板中,右键单击“[Border]”对象,然后选择“重命名”将其名称更改为“PageContainer”,以便稍后在代码隐藏文件中引用此对象。
在“对象和时间线”面板中,单击“LayoutRoot”对象,使其成为活动对象。此时,“LayoutRoot”将带有黄色边框,而且您在美工板上新绘制的所有对象都将成为“LayoutRoot”的子对象。
在“工具”面板中,单击“按钮”,然后在美工板上“PageContainer”对象的外侧绘制一个按钮。
提示: 在绘制了显示文本的控件后,您可以按 F2 进入文本编辑模式来修改所显示的文本。若要退出文本编辑模式,请按 ESC。
在“对象和时间线”面板中,选择“[Button]”对象。
在“属性”面板中,单击“事件” 以从属性视图切换至事件视图。
提示: 若要从“属性”面板切换回属性视图,请单击“属性”。
双击 Click 事件旁边的文本框。Microsoft Expression Blend 便可生成事件处理程序的名称 (Button_Click),当用户在所运行的程序中单击该按钮时将会调用此事件处理程序。
如果您安装了 Microsoft Visual Studio 2008,Expression Blend 便会将此事件处理程序的代码复制到“剪贴板”中,然后在此应用程序中打开您的项目。
如果您未安装代码编辑器,便会在文本编辑器中打开与用户控件相关的代码隐藏文件,并粘贴下列代码:
private void Button_Click(object sender, RoutedEventArgs e) { }
Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) End Sub
有关 Visual Studio 2008 与 Expression Blend 的互操作性的详细信息,请参阅修改代码隐藏文件。
若要在“PageContainer”边框对象中所要显示的两个内容页之间进行切换,请在内存中创建这两个页面的实例,然后在事件处理程序中将其中一个页面添加到“PageContainer”中。例如,将下列粗体显示的代码粘贴到代码隐藏文件中。“UserControl1”和“UserControl2”是项目中的其他两个内容页的名称。
提示: 边框控件只能拥有一个子对象。对于可能包含多个子对象的控件(例如“网格”版式面板 ),代码将会略有不同。
private UserControl1 uc1 = new UserControl1(); private UserControl2 uc2 = new UserControl2(); private bool atUC2 = false; private void Button_Click(object sender, RoutedEventArgs e) { if (atUC2) { this.PageContainer.Child = uc1; } else { this.PageContainer.Child = uc2; } atUC2 = !atUC2; }
Private uc1 As UserControl1 = New UserControl1() Private uc2 As UserControl2 = New UserControl2() Private atUC2 As Boolean = False Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) If atUC2 Then Me.PageContainer.Child = uc1 Else Me.PageContainer.Child = uc2 End If atUC2 = Not atUC2 End Sub
对项目进行测试 (F5),然后单击按钮来观察加载到“PageContainer”边框中的 UserControl1 和 UserControl2。
疑难解答
如果您在 的“事件”面板中双击时,遇到“无法更改代码隐藏文件。找不到下列类”错误,则可能需要切换至外部代码编辑器(通常为 Microsoft Visual Studio)来重载该解决方案。重新加载后便会加入定义缺失类的新文件。
如果您在 Visual Studio 2008 中遇到“无法加载该解决方案”错误,则可能尚未安装 Microsoft Silverlight Tools for Visual Studio 2008(适用于 Visual Studio 2008 的 Microsoft Silverlight 工具)。安装相关工具,然后尝试在 Expression Blend 的“事件”面板中双击。
如果看不到动态加载页的内容,可能是“PageContainer”边框过小容不下所有的加载内容。尝试加大“PageContainer”边框,或者按照下列设置来设置动态加载页中的布局属性:
“Width”= Auto
“Height”= Auto
“Margin”属性 = 0
如果在您单击按钮时并未显示按钮,您可能是将该按钮对象添加为“PageContainer”的子对象,而不是“LayoutRoot”的子对象。(您所添加的代码将取代“PageContainer”边框对象的子对象。)在“对象和时间线”面板中,您可以将该按钮对象拖到“LayoutRoot”面板中,将其移出“PageContainer”边框。
如果您创建新的对象来触发页面加载(而不是按钮对象),并在 Expression Blend 中将 Button_Click 事件处理程序的名称复制到“属性”面板的“事件”视图 中的新对象,当您测试 (F5) 项目时可能会在 Web 浏览器中遇到错误。这可能是由事件处理程序的签名不对,与新建对象的类型不匹配造成的。例如,按钮 Click 的事件处理程序所对应的签名类似下面这样:
private void Button_Click(object sender, RoutedEventArgs e)
Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
MouseLeftButtonDown 事件处理程序的签名类似下面这样:
private void Path_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
Private Sub Path_MouseLeftButtonDown(ByVal sender As System.Object, ByVal e As System.Windows.Input.MouseButtonEventArgs)
您可以采取以下方式来解决此问题:在“属性”面板的“事件”视图 中,双击位于相应的事件处理程序旁边的文本框,以在代码隐藏文件中使用正确的签名来创建新的方法。
后续步骤
- 在 Silverlight community website(Silverlight 社区网站)上,您可以找到有关具体任务的详细信息。