数据控件与文件访问技术解析
1. PivotViewer控件使用
PivotViewer 是一个强大的数据展示控件,在设置好数据模板和透视属性后,可通过为
ItemsSource
属性提供集合来加载数据,如同操作其他数据绑定控件一样。加载完成后,你可以探索集合、应用筛选设置并选择项目。
PivotViewer 会触发标准的
SelectionChanged
事件,当用户选择特定项目时通知你;还有新的
ItemDoubleClick
事件,当用户双击项目时触发,此时你可以启动其他任务。以下是
ItemDoubleClick
事件的示例代码:
Private Sub pivotViewer_ItemDoubleClick(ByVal sender As Object, _
ByVal e As System.Windows.Controls.Pivot.PivotViewerItemDoubleClickEventArgs)
Dim product As Product = (CType(e.Item, Product))
MessageBox.Show("You clicked " & product.ModelName & ".")
End Sub
你还可以关注
FilterChanged
、
SortPivotPropertyChanged
和
ViewChanged
等事件,以响应 PivotViewer 中的变化。此外,PivotViewer 提供了类似图表的条形显示效果,你可以点击控件右上角的小条形图图标,从平铺视图切换到图形视图。之后,你可以点击特定的数据条进行聚焦,或使用排序列表根据不同的透视属性拆分图形。
2. PivotViewer 定制
PivotViewer 还支持一些定制操作。简单的定制如调整其属性来改变整体配色方案;较复杂的定制包括使用新的控件模板更改筛选窗格或详细信息窗格,或使用
PivotViewerMultiScaleSubImageHost
在模板中以 DeepZoom 的性能托管高分辨率图像。
虽然网上有大量关于 PivotViewer 的信息,但很多是针对其第一个版本的,该版本随 Silverlight 控件工具包发布,使用不同的数据模型。未来,Microsoft 的 PivotViewer 网站(www.microsoft.com/silverlight/pivotviewer)将更新为适用于 Silverlight 5 版本的 PivotViewer,该网站包含丰富的有用信息和示例,但对于宣传视频需保持一定的批判性。
3. 文件访问概述
普通的 Silverlight 应用程序不允许在文件系统的任意位置进行读写操作。需要永久存储数据的 Silverlight 应用程序必须使用隔离存储(Isolated Storage)。隔离存储为你提供了一小段硬盘空间,但有一定限制,例如你不知道文件的确切存储位置,也无法读取其他 Silverlight 应用程序或其他用户留下的文件。
不过,Silverlight 最近添加了三种绕过隔离存储规则的方法:
-
OpenFileDialog 和 SaveFileDialog
:用户在对话框中明确选择文件后,应用程序可直接访问该文件。例如,用户在
OpenFileDialog
中选择文件,应用程序获得读取该文件内容的权限;在
SaveFileDialog
中选择文件,应用程序可写入该文件,但无法获取文件的具体信息,也不能访问同一位置的其他文件。
-
拖放功能
:用户将文件拖到应用程序的某个元素上并放下,应用程序可处理
Drop
事件并读取文件内容。
-
提升信任级别
:提升信任级别的应用程序需用户显式安装,并显示安全提示以请求额外权限。在文件访问方面,此类应用程序可以读写当前用户文档文件夹中的文件。
4. 隔离存储介绍
隔离存储提供了一个虚拟文件系统,允许你将数据写入特定于用户和应用程序的小空间。硬盘上的实际存储位置是模糊的,默认空间限制仅为 1 MB,但你可以请求用户授予更多空间。
隔离存储类似于普通网页中的持久 Cookie,允许在特定位置存储少量信息,并采取了防止恶意攻击的控制措施。
4.1 隔离存储的范围
每个用户和应用程序的组合都会创建一个唯一的存储位置。同一台计算机上,同一应用程序可为不同用户创建多个隔离存储位置;同一用户也可为每个 Silverlight 应用程序拥有多个隔离存储位置。隔离存储不受浏览器影响,Windows 用户从 Internet Explorer 切换到 Firefox 时,在两个浏览器中获得的隔离存储位置相同。
影响 Silverlight 应用程序隔离存储的关键因素是 XAP 文件的 URL,具体情况如下:
|情况|隔离存储情况|
|----|----|
|同一 Web 服务器和同一文件夹中的不同 XAP 文件|有不同的隔离存储|
|在不同域上托管的网站|每个实例有自己的隔离存储|
|在同一位置使用同一应用程序的不同测试页面|共享相同的隔离存储|
|重命名 XAP 文件或其所在文件夹|获得新的隔离存储|
|更改 Silverlight 应用程序的 GUID、版本或其他程序集元数据|保留相同的隔离存储|
|用具有相同 XAP 文件名的另一个应用程序替换现有应用程序|获取前一个应用程序的隔离存储|
4.2 适合存储在隔离存储中的内容
隔离存储适合存储少量非必要信息,如用户特定细节、用户偏好和近期用户操作信息。它也是很好的临时存储方式,例如在多页表单应用程序中,用户在各页面间切换时,可将当前数据保存到隔离存储,操作完成并成功提交数据到 Web 服务后再删除。
但隔离存储不适合存储重要文档,因为这些文档不会备份,容易删除和丢失;也不适合缓存资源,它旨在作为有限大小的数据存储位置,而非 HTTP 缓存的替代品。
5. 使用隔离存储
隔离存储使用方便,因为它采用了与普通 .NET 文件访问相同的基于流的模型,你可以使用
System.IO.IsolatedStorage
命名空间中的类型,这些类型是 Silverlight 运行时的核心部分。
5.1 打开隔离存储
Silverlight 会自动创建隔离存储。要与隔离存储进行交互,可使用
IsolatedStorageFile
类。通过调用共享方法
IsolatedStorageFile.GetUserStoreForApplication()
可获取当前用户和应用程序的
IsolatedStorageFile
对象:
Dim store As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication()
通常,这会为你提供一个特定于应用程序和用户的存储位置。
IsolatedStorageFile
类还有一个类似但略有不同的共享方法
GetUserStoreForSite()
,它提供了一个可被同一网站域上所有 Silverlight 应用程序访问的存储位置,但这些设置仍特定于用户。如果你正在开发一组 Silverlight 应用程序并希望它们共享一些个性化信息,可以选择使用域范围的隔离存储。
5.2 文件管理
IsolatedStorageFile
类提供了一系列文件管理方法,类似于在完整的 .NET 应用程序中使用
File
和
Directory
类的方法,如下表所示:
|方法|描述|
|----|----|
|
CreateDirectory()
|在隔离存储中创建指定名称的新文件夹|
|
DeleteDirectory()
|删除隔离存储中指定的文件夹|
|
CreateFile()
|创建指定名称的新文件,并返回一个
IsolatedStorageFileStream
对象,用于向文件写入数据|
|
DeleteFile()
|删除隔离存储中指定的文件|
|
Remove()
|移除隔离存储及其所有文件和目录|
|
OpenFile()
|打开隔离存储中的文件,并返回一个
IsolatedStorageFileStream
对象,用于操作文件。通常用于以读取模式打开现有文件,也可提供不同的
FileMode
和
FileAccess
值来创建新文件或覆盖现有文件|
|
FileExists()
|根据指定文件是否存在于隔离存储中返回
True
或
False
。可使用重载版本在特定子文件夹中查找或使用通配符(? 和
)匹配文件|
|
DirectoryExists()
|根据指定文件夹是否存在于隔离存储位置返回
True
或
False
|
|
GetFileNames()
|返回隔离存储根目录中每个文件的字符串数组。可使用重载版本指定要搜索的子文件夹或搜索表达式(使用通配符 ? 和
)|
|
GetDirectoryNames()
|返回隔离存储根目录中每个子文件夹的字符串数组。可使用重载版本获取特定目录中的子文件夹或指定搜索表达式(使用通配符 ? 和 *)|
5.3 读写数据
使用上述方法创建文件后,你可以使用流来读写数据。通常,你不会直接处理
IsolatedStorageFileStream
类,而是使用
System.IO
命名空间中更强大的包装流的类:
-
StreamWriter 和 StreamReader
:用于以普通文本字符串的形式读写数据。你可以分块写入数据,并使用
StreamReader.ReadToEnd()
逐行或一次性读取数据。
-
BinaryWriter 和 BinaryReader
:用于更严格(且更紧凑)地写入数据。读取数据时,需要使用相应的数据类型方法,如
BinaryReader.ReadInt32()
读取 32 位整数,
BinaryReader.ReadString()
读取字符串等。
以下是一个将当前日期写入隔离存储文件
date.txt
的示例代码:
' Write to isolated storage.
Try
Using store As IsolatedStorageFile = _
IsolatedStorageFile.GetUserStoreForApplication()
Using stream As IsolatedStorageFileStream = store.CreateFile("date.txt")
Dim writer As New StreamWriter(stream)
writer.Write(DateTime.Now)
writer.Close()
End Using
lblStatus.Text = "Data written to date.txt"
End Using
Catch err As Exception
lblStatus.Text = err.Message
End Try
读取数据也很简单,只需以读取模式打开
IsolatedStorageFileStream
对象:
' Read from isolated storage.
Try
Using store As IsolatedStorageFile = _
IsolatedStorageFile.GetUserStoreForApplication()
Using stream As IsolatedStorageFileStream = store.OpenFile("date.txt", _
FileMode.Open)
Dim reader As New StreamReader(stream)
lblData.Text = reader.ReadLine()
reader.Close()
End Using
End Using
Catch err As Exception
' An exception will occur if you attempt to open a file that doesn't exist.
lblStatus.Text = err.Message
End Try
在 Windows Vista 或 Windows 7 计算机上,
date.txt
文件的路径可能如下:
C:\Users\[UserName]\AppData\LocalLow\Microsoft\Silverlight\is\[Unique_Identifier]
你可以使用 Visual Studio 调试器查看当前隔离存储的路径,在中断模式下将鼠标悬停在
IsolatedStorageFile
对象上,查找非公共的
RootDirectory
属性。不过,你无需担心隔离存储的目录结构,可使用
IsolatedStorageFile
的方法(如
GetFileNames()
和
OpenFile()
)检查和检索文件。
5.4 请求更多空间
每个 Silverlight 应用程序最初在隔离存储中获得 1 MB 的空间,你可以检查
IsolatedStorageFile.AvailableFreeSpace
属性来了解剩余的可用空间。但如果应用程序作为浏览器外应用程序安装,其配额会自动增加到 25 MB,无论应用程序是在独立窗口中启动还是通过浏览器运行,都使用相同的隔离存储。
如果应用程序需要更多空间,可以使用
IsolatedStorageFile
的
IncreaseQuotaTo()
方法。调用该方法时,你需要请求所需的字节数。Silverlight 会显示一个消息框,显示应用程序当前在隔离存储中使用的字节数(而非当前配额限制)和新请求的空间量,同时显示 Silverlight 应用程序的 URL。
使用
IncreaseQuotaTo()
方法有两个限制:
- 必须在响应用户操作的事件处理程序中使用(如按钮点击事件),否则调用将被忽略,这是为了防止用户在确认对话框突然获得焦点时无意中接受大配额。
- 必须请求高于当前配额的值,否则会引发异常,因此不能使用该方法确保有一定的可用空间,而需要显式检查是否有足够的空间。
你可以通过检查
IsolatedStorageFile.Quota
属性确定当前配额大小,通过
IsolatedStorageFile.AvailableFreeSpace
属性查找隔离存储中剩余的空间。以下是使用
IncreaseQuotaTo()
方法的示例代码:
Using store As IsolatedStorageFile = _
IsolatedStorageFile.GetUserStoreForApplication()
' In an application that writes 1000 KB files, you need to ask for an increase
' if there is less than 1000 KB free.
If store.AvailableFreeSpace < 1000*1024 Then
If store.IncreaseQuotaTo( _
store.Quota + 1000*1024 - store.AvailableFreeSpace) Then
' The request succeeded.
Else
' The request failed.
lblError.Text = "Not enough room to save temporary file."
Return
End If
End If
' (Write the big file here.)
End Using
上述示例使用计算请求精确的空间量,但每次需要更多空间时都要向用户提出新请求。为避免这种情况,可请求一个远高于当前需求的空间量。
你可以通过以下步骤查看每个 Silverlight 应用程序分配的隔离存储空间:
1. 浏览到包含 Silverlight 内容的页面。
2. 右键单击 Silverlight 内容区域,选择 Silverlight。
3. 在弹出的选项卡式对话框中,点击“Application Storage”选项卡,这里会显示当前用户运行的所有使用隔离存储的 Silverlight 应用程序列表,以及每个应用程序的最大空间配额和当前使用的空间量。
数据控件与文件访问技术解析
6. 操作流程总结
为了更清晰地展示使用隔离存储进行文件操作的流程,下面给出一个 mermaid 格式的流程图:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([开始]):::startend --> B{是否需要打开隔离存储}:::decision
B -- 是 --> C(调用 GetUserStoreForApplication 或 GetUserStoreForSite):::process
B -- 否 --> D(跳过打开步骤):::process
C --> E{是否需要创建文件或文件夹}:::decision
D --> E
E -- 是 --> F(使用 CreateFile 或 CreateDirectory):::process
E -- 否 --> G{是否需要读写数据}:::decision
F --> G
G -- 是 --> H(使用 StreamWriter/Reader 或 BinaryWriter/Reader):::process
G -- 否 --> I{是否需要请求更多空间}:::decision
H --> I
I -- 是 --> J(调用 IncreaseQuotaTo 方法):::process
I -- 否 --> K(结束操作):::process
J --> K
K --> L([结束]):::startend
这个流程图展示了使用隔离存储的主要操作流程,从打开隔离存储开始,根据不同的需求进行文件创建、数据读写和空间请求等操作。
7. 总结与注意事项
-
PivotViewer 控件
:它是一个功能丰富的数据展示控件,能通过
ItemsSource属性加载数据,提供了多种交互事件和视图模式。在使用时,要注意网上信息可能针对旧版本,未来可关注 Microsoft 的 PivotViewer 网站获取新版本信息。 -
隔离存储
:是 Silverlight 应用程序存储数据的重要方式,具有用户和应用程序特定性。使用时需注意以下几点:
-
初始空间有限,可根据需求请求更多空间,但要遵循
IncreaseQuotaTo()方法的使用限制。 - 适合存储少量非必要信息和临时数据,不适合存储重要文档和缓存资源。
-
虽然文件路径可通过调试器查看,但无需关注具体目录结构,使用
IsolatedStorageFile的方法进行文件操作即可。
-
初始空间有限,可根据需求请求更多空间,但要遵循
8. 常见问题及解决方法
在使用 PivotViewer 控件和隔离存储时,可能会遇到一些常见问题,以下是一些解决方法:
| 问题 | 解决方法 |
|---|---|
IncreaseQuotaTo()
方法调用无效
| 确保在响应用户操作的事件处理程序中调用该方法,并且请求的空间量高于当前配额。 |
| 读取隔离存储文件时出现异常 |
检查文件是否存在,可使用
FileExists()
方法进行判断。
|
| 无法切换 PivotViewer 的视图模式 | 检查是否正确设置了数据模板和透视属性,确保数据加载正常。 |
9. 未来展望
随着技术的不断发展,PivotViewer 控件和隔离存储技术可能会有更多的改进和扩展。例如,PivotViewer 可能会提供更强大的数据可视化功能,支持更多的数据类型和交互方式;隔离存储可能会增加更多的安全机制和更大的默认空间配额,以满足应用程序不断增长的需求。开发者可以持续关注相关技术的发展,以便更好地应用这些技术来开发出更优秀的 Silverlight 应用程序。
10. 实战案例
为了帮助大家更好地理解和应用上述技术,下面给出一个简单的实战案例:开发一个 Silverlight 应用程序,使用 PivotViewer 展示产品数据,并将用户对产品的选择信息存储到隔离存储中。
10.1 步骤一:设置 PivotViewer
首先,设置 PivotViewer 的数据模板和透视属性,并加载产品数据:
' 假设 products 是一个产品集合
pivotViewer.ItemsSource = products
10.2 步骤二:处理选择事件
当用户选择产品时,将选择信息存储到隔离存储中:
Private Sub pivotViewer_SelectionChanged(ByVal sender As Object, _
ByVal e As System.Windows.Controls.SelectionChangedEventArgs)
Dim selectedProduct As Product = CType(pivotViewer.SelectedItem, Product)
If selectedProduct IsNot Nothing Then
Try
Using store As IsolatedStorageFile = _
IsolatedStorageFile.GetUserStoreForApplication()
Using stream As IsolatedStorageFileStream = store.CreateFile("selected_product.txt")
Dim writer As New StreamWriter(stream)
writer.Write(selectedProduct.ModelName)
writer.Close()
End Using
End Using
Catch err As Exception
MessageBox.Show("保存选择信息时出错:" & err.Message)
End Try
End If
End Sub
10.3 步骤三:读取选择信息
在应用程序启动时,读取隔离存储中的选择信息:
Private Sub Application_Startup(ByVal sender As Object, _
ByVal e As StartupEventArgs) Handles Me.Startup
Try
Using store As IsolatedStorageFile = _
IsolatedStorageFile.GetUserStoreForApplication()
If store.FileExists("selected_product.txt") Then
Using stream As IsolatedStorageFileStream = store.OpenFile("selected_product.txt", FileMode.Open)
Dim reader As New StreamReader(stream)
Dim selectedProductName As String = reader.ReadLine()
' 根据选择信息进行相应操作
MessageBox.Show("上次选择的产品是:" & selectedProductName)
reader.Close()
End Using
End If
End Using
Catch err As Exception
MessageBox.Show("读取选择信息时出错:" & err.Message)
End Try
End Sub
通过这个实战案例,你可以看到如何结合 PivotViewer 控件和隔离存储技术,实现数据展示和数据存储的功能。在实际开发中,你可以根据具体需求对代码进行扩展和优化。
超级会员免费看
11万+

被折叠的 条评论
为什么被折叠?



