星辰.Net技术社区论坛

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

附件: silverlight_isolatedstore_demo.rar
1
查看完整版本: 在Silverlight中使用IsolateStore隔离存储(上)