深入探索Silverlight应用导航系统
立即解锁
发布时间: 2025-08-26 01:20:20 阅读量: 4 订阅数: 14 

### 深入探索Silverlight应用导航系统
在Silverlight应用开发中,导航系统是一个关键部分,它涉及到用户如何在应用的不同页面之间进行切换,以及如何与浏览器进行交互等多个方面。下面将详细介绍Silverlight导航系统的相关内容。
#### 1. 深度链接与搜索引擎优化
通过多付出一点努力,你可以将深度链接作为搜索引擎优化(SEO)的起点。基本思路是创建多个HTML或ASP.NET页面,这些页面指向Silverlight应用的不同部分。每个页面都指向同一个XAP文件,但URI会链接到应用内的不同页面。这样,网络搜索引擎就可以为你的应用添加多个索引条目,每个指向应用的HTML或ASP.NET页面都对应一个索引条目。
#### 2. URI集成带来的问题及解决方案
##### 2.1 页面有多个框架时的情况
URI片段指示了应该在框架中显示的页面,但它不包含框架名称。实际上,这种系统仅适用于具有单个框架的Silverlight应用(包含两个或更多框架的应用相对较少)。
如果有多个框架,它们将共享相同的导航路径。当代码在一个框架中调用`Navigate()`方法,或者用户输入包含页面名称作为片段的URI时,相同的内容将加载到每个框架中。为避免此问题,你必须选择一个代表应用主内容的框架,该框架将控制URI和浏览器历史记录列表。其他框架将负责私下跟踪其导航,不与浏览器交互。要实现此设计,将每个额外框架的`JournalOwnership`属性设置为`OwnJournal`。从那时起,在这些框架中执行导航的唯一方法是通过调用`Navigate()`方法的代码。
```csharp
// 示例代码,设置JournalOwnership属性
frame1.JournalOwnership = JournalOwnership.OwnJournal;
```
##### 2.2 启动页面不包含框架控件时的情况
如果应用的根视觉中没有框架,应用可能无法加载请求的内容,这是导航系统使用URI时的另一个潜在问题。例如,使用动态用户界面技巧(如使用代码创建`Frame`对象或交换包含框架的页面)时会出现这种情况。在这种情况下,应用正常启动,但由于没有可用的框架,URI的片段部分将被忽略。
为解决此问题,你可以简化应用,使框架在启动时可在根视觉中使用,或者添加响应`Application.Startup`事件的代码,并检查URI的文档片段部分,示例代码如下:
```csharp
string fragment = System.Windows.Browser.HtmlPage.Document.DocumentUri.Fragment;
```
如果你发现URI包含片段信息,可以手动添加代码将应用恢复到以前的状态。如果不想提供此服务,可以通过将`JournalOwnership`属性设置为`OwnJournal`来完全禁用URI系统。
#### 3. 安全问题及应对措施
URI系统就像应用的一个巨大后门。例如,用户可以输入指向你不希望他们访问的页面的URI,即使你从未使用`Navigate()`方法加载该页面,Silverlight也不会施加任何安全措施来限制这种情况。
为解决此问题,有以下几种方法:
- **分离框架与URI系统**:将`JournalOwnership`属性设置为`OwnJournal`,但这会放弃使用描述性URI的能力,并移除与浏览器历史记录列表的集成。
- **处理`Frame.Navigating`事件**:在该事件中,你可以检查URI(通过`NavigatingCancelEventArgs`对象),并选择性地取消导航。示例代码如下:
```csharp
private void mainFrame_Navigating(object sender, NavigatingCancelEventArgs e)
{
if (e.Uri.ToString().ToLower().Contains("RestrictedPage.xaml"))
{
e.Cancel = true;
}
}
```
此代码不匹配整个URI,仅检查受限页面名称的存在,以避免潜在的规范化问题。
- **创建自定义内容加载器**:检查请求的URI是否在允许页面的集合中。这种方法类似于处理`Frame.Navigating`事件,但更通用且更复杂。
#### 4. 历史记录支持
`Frame`控件的导航功能与浏览器集成。每次调用`Navigate()`方法时,Silverlight会在历史记录列表中添加一个新条目。应用的第一页以HTML入口页面的标题显示在历史记录列表中,后续页面以用户控件文件名显示。
浏览器的历史记录列表按预期工作,用户可以点击“后退”或“前进”按钮,或选择历史记录列表中的条目来加载以前的页面,且不会导致应用重启。但如果用户访问另一个网站后返回,Silverlight应用将重新加载,`Application.Startup`事件将触发,然后Silverlight会尝试将请求的页面加载到框架中。
你可以连续多次调用`Frame.Navigate()`方法加载不同页面,用户最终会停留在最后一页,其他页面会添加到历史记录列表中。如果页面已加载,`Navigate()`方法不会添加重复条目。
#### 5. 导航失败的处理
Silverlight在使用导航时处理“后退”按钮存在一个问题。如果使用浏览器历史记录列表返回不包含URI片段部分的页面,会收到`ArgumentException`,提示“无法加载URI的内容”。
有两种简单的方法来处理此问题:
- **处理`Frame.NavigationFailed`事件**:检查异常对象(通过`NavigationFailedEventArgs.Exception`属性),并将`NavigationFailedEventArgs.Handled`属性设置为`true`,以优雅地忽略此问题并继续。
```csharp
private void mainFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
{
e.Handled = true;
}
```
- **使用`UriMapper`设置框架的初始内容**:将普通的空URI映射到一个有效页面,该页面将显示在框架中(该页面可以为空)。
#### 6. URI映射
片段URI系统将页面名称放在URI中,在某些情况下,你可能不想让这个细节过于明显。例如,你可能不想暴露真实的页面名称,不想添加可能令人困惑的`.xaml`扩展名,或者希望使用更容易记忆和手动输入的URI。在这些情况下,可以使用URI映射来定义不同、更简单的URI,这些URI映射到目前
0
0
复制全文
相关推荐










