Silverlight导航系统:页面状态保留、子窗口与框架导航详解
立即解锁
发布时间: 2025-08-26 01:20:19 阅读量: 4 订阅数: 13 

### Silverlight 导航系统:页面状态保留、子窗口与框架导航详解
#### 1. 页面状态保留
在设计允许用户频繁在复杂页面间导航的应用时,为每个页面创建一次实例并将其保留在内存中是个不错的选择。这样做不仅能提高性能,还能保持页面的当前状态,包括输入控件中的所有值。
为实现这一模式,首先需要一个系统来识别页面。使用枚举类型比字符串名称更能有效预防错误。以下是一个区分三个页面的枚举示例:
```csharp
public enum Pages
{
MainWindow,
ReviewPage,
AboutPage
}
```
可以在自定义应用程序类的私有字段中存储应用程序的页面,这里使用一个简单的字典来实现:
```csharp
private static Dictionary<Pages, UserControl> pageCache =
new Dictionary<Pages,UserControl>();
```
在 `Navigate()` 方法中,仅在需要时创建页面,即缓存页面集合中不存在相应对象时:
```csharp
public static void Navigate(Pages newPage)
{
// 获取当前应用程序对象并将其转换为自定义 (派生) App 类的实例。
App currentApp = (App)Application.Current;
// 检查页面是否已创建。
if (!pageCache.ContainsKey(newPage))
{
// 创建页面的第一个实例,并将其缓存以供将来使用。
Type type = currentApp.GetType();
Assembly assembly = type.Assembly;
pageCache[newPage] = (UserControl)assembly.CreateInstance(
type.Namespace + "." + newPage.ToString());
}
// 更改当前显示的页面。
currentApp.rootGrid.Children.Clear();
currentApp.rootGrid.Children.Add(pageCache[newPage]);
}
```
现在,可以使用 `Pages` 枚举指定要导航的页面:
```csharp
App.Navigate(Pages.MainWindow);
```
由于页面只创建一次并在应用程序的生命周期内保留在内存中,当用户导航离开再返回时,页面的所有状态都将保持不变。
#### 2. 浏览器历史记录
上述导航方法的一个局限性是浏览器无法感知页面的切换。如果希望用户能够返回上一页,需要自行添加相应的控件。浏览器的后退按钮只会将用户带回上一个 HTML 页面,从而退出 Silverlight 应用程序。若要创建与浏览器更有效集成并支持后退按钮的应用程序,需要使用后续会讨论的 `Frame` 和 `Page` 类。
#### 3. 子窗口
在许多情况下,不需要切换页面,只需临时显示一些内容,然后让用户返回主应用程序页面。例如,确认对话框就是一个典型的例子,Windows 和 Web 应用程序常使用弹出窗口来收集信息、显示基本程序信息和提供配置设置访问。
在 Silverlight 中,可以使用 `ChildWindow` 这个便捷的内容控件来实现这种设计。`ChildWindow` 本质上模仿了 Windows 平台上的模态对话框。当显示子窗口时,应用程序的其余部分将被禁用,并显示一个灰色遮罩层作为提示。子窗口将居中显示在页面顶部,用户完成任务后,代码关闭子窗口,应用程序的其余部分恢复响应。
以下是显示子窗口的流程:
1. **设计子窗口**:在 Visual Studio 中,右键单击解决方案资源管理器中的项目名称,选择“添加” -> “新建项”,然后选择 Silverlight 子窗口模板,输入名称并点击“添加”。Visual Studio 将创建新的 XAML 模板和代码隐藏文件,并添加对 `System.Windows.Controls.dll` 程序集的引用。
2. **设计子窗口内容**:可以像设计普通用户控件一样设计子窗口。Visual Studio 会在新的子窗口模板中自动创建一个两行的网格,并在底部行放置“确定”和“取消”按钮,同时附带关闭窗口的事件处理程序。
以下是一个子窗口的 XAML 标记示例:
```xml
<controls:ChildWindow x:Class="Navigation.UserInformation"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls=
"clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
Title="UserInformation">
<Grid x:Name="LayoutRoot" Margin="2">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBlock>First Name:</TextBlock>
<TextBox x:Name="txtFirstName" Grid.Column="1" Margin="3" Width="150"></TextBox>
<TextBlock Grid.Row="1">Last Name:</TextBlock>
<TextBox x:Name="txtLastName" Grid.Row="1" Grid.Column="1" Margin="3"></TextBox>
<Button Grid.Row="2" Margin="3" Width="75" Height="23"
HorizontalAlignment="Right" Con
```
0
0
复制全文
相关推荐










