隔离存储(Isolate Store) 是一个虚拟的文件系统 . 它可用于保存本地(客户端文件)。下面是微软的一些解释:
虚拟文件系统根目录对于每个机器当前登陆用户不同的, 它是一个隐藏的文件夹,存在于物理文件系统中. 每个
application的不同标识将会使其映射到不同的文件夹中, 也就是说,将分配给每个不同的application 一个属于它的
虚拟文件系统. .NET Framework version 2.0中的文件夹节构和隐藏架构同样在.NET Framework for Silverlight中
也用到了.
而在silverlight开发中,允许我们使用Isolate Store(位于System.IO.IsolatedStorage名空间),其下有几个
主要的类如:
IsolatedStorageSettings (以Dictionary<<(TKey, TValue)>> 键值对的方式来存储数据,本文DEMO的演示内容)
IsolatedStorageFile (返回一个包括路径和文件的虚拟区域, 用于管理目录,文件等, 会在下一篇中演示)
IsolatedStorageFileStream (以流的方式读写指定路径的文件, 会在下一篇中演示)
下面就先演示一下IsolatedStorageSettings的使用方法:
假设我们有一个应用,它是一个本地邮件管理和发送程序(如OutLook等).而我们写完一封EMAIL时可能不会立即将
其发送出去,而是还生成一个Draft(草稿,以便日后进行编辑),当我们认为可以发送时才会去SEND。
下面就是这个应用的一个原型, 如下图:
我们可以在输入了相关信息之后,先将其保存为草稿. 当我们下次再运行这个应用时,做自动加载当前的草稿, 以
便我们进行编辑操作.当工作完成之后,就可以将其发送到Server端. 如果认为内容不好,我们也可以从Isolate Store
区中将该项内容删除.
下面就是它的page.xaml代码:
<
Grid
x:Name
="LayoutRoot"
Background
="AliceBlue"
>
<
Grid.RowDefinitions
>
<
RowDefinition
Height
="40"
/>
<
RowDefinition
Height
="40"
/>
<
RowDefinition
Height
="231"
/>
<
RowDefinition
Height
="*"
/>
</
Grid.RowDefinitions
>
<
Grid.ColumnDefinitions
>
<
ColumnDefinition
Width
="122"
/>
<
ColumnDefinition
Width
="*"
/>
</
Grid.ColumnDefinitions
>
<
TextBlock
Grid.Row
="0"
Grid.Column
="0"
Margin
="5,5,57,5"
HorizontalAlignment
="Stretch"
>
<
Run
Text
="收件人:"
/>
</
TextBlock
>
<
TextBox
x:Name
="Recipient"
Width
="200"
Grid.Row
="0"
Grid.Column
="1"
HorizontalAlignment
="Left"
Margin
="5,5,0,5"
/>
<
TextBlock
Grid.Row
="1"
Grid.Column
="0"
Margin
="5,5,57,5"
HorizontalAlignment
="Stretch"
>
<
Run
Text
="主 题:"
/>
</
TextBlock
>
<
TextBox
x:Name
="Subject"
Width
="200"
Grid.Row
="1"
Grid.Column
="1"
HorizontalAlignment
="Left"
Margin
="5,5,0,5"
/>
<
TextBlock
Grid.Row
="2"
Grid.Column
="0"
Margin
="5,5,57,36"
HorizontalAlignment
="Stretch"
>
<
Run
Text
="内 容:"
/>
</
TextBlock
>
<
TextBox
x:Name
="Body"
TextWrapping
="Wrap"
Grid.Row
="2"
Grid.Column
="1"
HorizontalAlignment
="Stretch"
Margin
="5,5,8,5"
Grid.RowSpan
="1"
/>
<
StackPanel
Grid.ColumnSpan
="2"
Grid.Row
="3"
Orientation
="Horizontal"
Grid.Column
="0"
HorizontalAlignment
="Stretch"
VerticalAlignment
="Stretch"
Margin
="8,23.5,64,8"
>
<
Button
x:Name
="SaveToDraft"
Margin
="5,5,5,5"
Content
=" 保存为草稿(本地) "
Click
="SaveToDraft_Click"
/>
<
Button
x:Name
="SaveToServer"
Margin
="5,5,5,5"
Content
=" 上传到服务器 "
Click
="SaveToServer_Click"
/>
<
Button
x:Name
="DeleteDraft"
Margin
="5,5,5,5"
Content
=" 删除当前草稿(本地) "
Click
="DeleteDraft_Click"
/>
</
StackPanel
>
</
Grid
>
而相应的page.xaml.cs(位于源码包中的IsolatedStore_Demo文件夹)代码如下:
public
partial
class
Page : UserControl
{
private
IsolatedStorageSettings appSettings
=
IsolatedStorageSettings.ApplicationSettings;
//
获取当前应用(silverlight Application) IsolatedStorageSettings 实例,范围在当前应用
//
IsolatedStorageSettings appSettings =
//
IsolatedStorageSettings.SiteSettings;
//
获取当前应用(silverlight Application) IsolatedStorageSettings 实例,范围在当前域
public
Page()
{
InitializeComponent();
this
.Loaded
+=
new
RoutedEventHandler(Page_Loaded);
}
void
Page_Loaded(
object
sender, RoutedEventArgs e)
{
try
{
//
加载相应节点信息,首次运行时会报为空的错误
Recipient.Text
=
(
string
) appSettings[
"
Recipient
"
];
Subject.Text
=
(
string
)appSettings[
"
Subject
"
];
Body.Text
=
(
string
)appSettings[
"
Body
"
];
}
catch
(System.Collections.Generic.KeyNotFoundException ex)
{
HtmlPage.Window.Alert(ex.Message);
}
}
private
void
SaveToDraft_Click(
object
sender, RoutedEventArgs e)
{
try
{
//
添加相应节点信息
appSettings.Add(
"
Recipient
"
, Recipient.Text);
appSettings.Add(
"
Subject
"
, Subject.Text);
appSettings.Add(
"
Body
"
, Body.Text);
HtmlPage.Window.Alert(
"
已存入本地隔离存储区
"
);
}
catch
(ArgumentException ex)
{
HtmlPage.Window.Alert(ex.Message);
}
}
private
void
DeleteDraft_Click(
object
sender, RoutedEventArgs e)
{
try
{
//
移除相当节点信息
appSettings.Remove(
"
Recipient
"
);
appSettings.Remove(
"
Subject
"
);
appSettings.Remove(
"
Body
"
);
HtmlPage.Window.Alert(
"
已从本地隔离存储区中删除该草稿
"
);
}
catch
(ArgumentException ex)
{
HtmlPage.Window.Alert(ex.Message);
}
}
private
void
SaveToServer_Click(
object
sender, RoutedEventArgs e)
{
//
创建EMAIL信息类,以此作为上传数据
EmailInfo emailInfo
=
new
EmailInfo()
{
Recipientk__BackingField
=
Recipient.Text,
Subjectk__BackingField
=
Subject.Text,
Bodyk__BackingField
=
Body.Text
};
EmailClient emailClient
=
new
EmailClient();
//
调用WCF方法
emailClient.AcceptCompleted
+=
new
EventHandler
<
AcceptCompletedEventArgs
>
(email_AcceptCompleted);
emailClient.AcceptAsync(emailInfo);
}
void
email_AcceptCompleted(
object
sender, AcceptCompletedEventArgs e)
{
if
(e.Result)
{
HtmlPage.Window.Alert(
"
上传成功
"
);
}
else
{
HtmlPage.Window.Alert(
"
上传失败
"
);
}
}
}
上面代码中就是将subject(主题),Recipient(收件人),Body(邮件内容)以键值对的方式存储在Isolate Store
虚拟存储区中.而相应的WCF服务这里只是一种象征性的发送,并无什么实质内容,它在调用成功后会将结果以Bool型传
递回来,以便进行接下来其它操作.
好了,今天的内容就到这里了:)
源代码下载链接,请点击这里:)