共用方式為


本文章是由機器翻譯。

可從 MSDN 程式庫 的程式碼下載
瀏覽線上的程式碼

剪下緣

管理動態內容的傳遞,在 Silverlight,第 2 部

Dino Esposito

內容

永久的快取的動機
foundations 的隔離儲存區
隔離儲存區 API
建立封裝的資料永久快取
到期原則
所有在一起將它
一些最後的筆記

上個月我會討論如何在啟動時] 和 [點播案例中,甚至提供 Silverlight 應用程式某些動態產生的內容。許多範例都存在有以示範如何使用 WebClient 類別和其非同步呼叫模型下載 URL 為主的資源。尤其,我會著重於所花費下載 XAP 套件,其中包含 XAML 和 Managed 程式碼 (請參魷 \ cs6 \ f1 \ cf6 \ lang1024,1 月 2009 的期,Cutting Edge 的.

基本概念,是您下載壓縮的資料流,並再擷取您需要的任何組件。接下來,您具現化任何類別需要所包含的組件。類別是 XAML 使用者控制項) 的整個 XAML 視覺樹狀結構片段 —,您可以再將附加到任何預留位置中,目前 XAML 文件物件模型 (DOM)。

在的瀏覽器可完全無法分別的從任何其他型別資源的任何下載的 XAP 資源。因此,瀏覽器快取 XAP 封裝,如同任何其他下載的資源。這個內建機制,提供最佳化,以儲存您的第一個層級會重複以取得相同的套件,不斷地來回存取。WebClient 類別-downloader 元件上個月的專欄中討論的核心 — 以瀏覽器的連線引擎為基礎,不下載可用資源而不是在本機尚未過期。

在日期結尾必須 downloader 延遲載入任何外部的套件,您可能需要的元件。另外您也有可用快取功能,動態地下載的任何資源。除了其他的功用外,您可能想要新增永久本機的快取套件,也能夠處理動態變更視覺化樹狀結構。看看如何在達到這個目的。

永久的快取的動機

對於動態的 Silverlight 內容時,有兩個主要方面,您想要的取得某些更多的控制項。

第一個都是下載內容的到期原則。您可能要控制,完全當指定的封裝過期,並需要重新下載。此外,您可以將繫結至某些外部事件,例如特定的使用者動作的到期日] 或 [其他快取的資源的變更。如果您知道如何在 ASP.NET 快取的運作方式就會知道我什麼。

ASP.NET 快取記憶體事實,可讓您快取資料,並提供其自己的到期原則的每個快取的項目,根據檔案變更,日期 / 時間或甚至其他的快取項目的變更。一個類似的引擎不存在於 [Silverlight 2,但大、 動態,和高度的可自訂的應用程式會獲得明顯的好處,從它]。

標準 Silverlight 資源快取,第二個方面,您可能要變更會將您的套件的使用者的活動曝露機會。換句話說,儲存在瀏覽器的快取任何 XAP 套件,是在使用者的 「 掌。如果使用者會清除快取瀏覽器的介面上之,則所有您 XAP 套件將會無可避免地遺失。

應用程式管理永久快取可解決兩個問題。XAP 封裝儲存在這個永久快取就不會受到清除瀏覽器的快取使用者。永久儲存 Silverlight XAP 封裝,您需要存取本機檔案系統。基於安全性的理由,Silverlight 不允許存取整個的本機檔案系統的應用程式。不過,隔離儲存區 API 是以下 [說明]。如需有關 Silverlight 的安全性的詳細資訊,請參閱 <深究 CLR: Silverlight 2 安全性."

foundations 的隔離儲存區

隔離儲存區未特別建立的 Silverlight。隔離儲存區 1.0 版後已 Microsoft.NET Framework 的一部分。針對部分信任的應用程式,隔離儲存區可讓這類應用程式,在完整的方面,任何進行中的安全性原則的本機電腦上儲存資料。在傳統完全信任,.NET 應用程式可能會有過通過儲存自己的資料隔離儲存區圖層不需要但部分信任的應用程式隔離儲存區的資料儲存在用戶端上唯一的選項。

從 Silverlight 觀點來看隔離儲存區 (Isolated Storage 也是一個功能強大的工具以跨瀏覽器的方式而限制,例如,影響 HTTP Cookie 的任何保存較大資料區塊,只可能方式。瞭解這一點很重要: 在 Silverlight,隔離儲存區會是只有您可以在本機電腦上的快取資料的可能性。如果 Silverlight 應用程式需要儲存一些資料 — 任何種類的資料 — 本機,然後它只能執行,透過隔離儲存區。此外,有了隔離儲存區每個應用程式可以將自己從任何其他的應用程式或站台外任何其他應用程式所隔離的資料。

如果您是希望在 [一般]、.NET 導向隔離儲存區和簡介其最常見的使用方式案例,您應該閱讀,.NET Framework Developer ' s Guide to 隔離儲存區. 本文提及的幾個案例,使用隔離儲存區不適合。尤其,指引會假設您應該不使用隔離儲存區來儲存敏感性資料、 程式碼或組態設定 (而非使用者喜好設定)。這類的指導方針源自於在一般的安全性認知,和不一定表示任何使用隔離儲存區中固有的危險中。

所以,可以您安全地儲存您下載到 Silverlight 隔離儲存區的 XAP 套件中?在 Silverlight,與不同的是在桌上型電腦的 CLR 任何可執行的程式碼片段預設不受信任並不允許叫用重要的方法,或提高權限的呼叫堆疊。在 Silverlight,您儲存供稍後執行任何程式碼將無法執行任何危險。這是沒有其他風險比在執行任何其他 Silverlight 的程式碼片段。建置 Silverlight 封裝的永久快取,您結束設定儲存在本機地執行您的 Silverlight 應用程式的區段。

在 Silverlight,隔離儲存區的角色是類似 — 只要持續性是攸關 — 傳統的 Web 應用程式中的 HTTP Cookie 的角色。在 Silverlight,您應該查看隔離儲存區為一組較大可以包含任何種類的資料,包括可執行的程式碼的 Cookie。在這種情況下透過,Silverlight 的核心 CLR 提供保護。Silverlight 的安全性型號,事實,核心 CLR 將例外狀況任何的時間,應用程式的程式碼要執行重要的方法。HTTP 的 Cookie 在 Silverlight 的隔離儲存區未連結至網路 I / O 與任何內容傳輸的要求。

隔離儲存區中的資料由應用程式隔離,並沒有其他的 Silverlight 應用程式都可以存取存放區]。資料儲存在本機檔案系統上,但是,在電腦的系統管理員是當然可以存取它。

再次,在整體的模型不真正不同怎樣使用 HTTP Cookie。系統管理員可以永遠尋找,並甚至變更 Cookie 的內容。如果是值得的在您的內容中您可以使用加密,加入的資料保護的另一個層級。

如果您仍然擔心需要把您的電腦解決一些下載可執行程式碼,您應該重新整理您對 Silverlight 的安全性模型的瞭解。在簡單,Silverlight 的核心 CLR 會擲回任何時間] 下的應用程式程式碼嘗試執行重要的方法例外狀況。Silverlight 的基底類別庫 (BCL) 中的方法] 和 [類別,執行需要高權限的作業是使用特殊的 SecurityCritical 屬性標記。請注意這是 System.IO 命名空間的大部分的內容與大小寫。

Silverlight 的安全性會確認某些類別可能需要將安全的平台會呼叫重要的方法。這類的類別和方法是再以 SecuritySafeCritical 屬性標記。是這樣,使用.IO.IsolatedStorage API 中的類別 (請參閱 [圖 1 )。有關 Silverlight 的安全性重點,是沒有應用程式的程式碼片段可以曾經以 SecurityCritical 或 SecuritySafeCritical 屬性標記。這個屬性會保留組件經過 Microsoft 數位簽署和載入到從 Silverlight 的安裝目錄的記憶體中的類別。

fig01.gif

[圖 1 在隔離儲存區 API 內瀏覽

您可以看到即使在很不幸 (和不太可能) 的情況下某些惡意的傢伙 penetrates 您的電腦,和取代下載 Silverlight 內容,損毀的內容僅限於在透明模式中執行的一般作業。

隔離儲存區 API

在 Silverlight BCL 隨附 tailor-made Web 案例中,隔離存放區的自己實作而定。隔離儲存區提供存取整個本機檔案系統的樹狀子目錄,並沒有方法或屬性允許執行程式碼以找出 「 檔案存放區實際所在使用者電腦上。Silverlight 應用程式不允許使用隔離儲存區透過的絕對檔案系統路徑。同樣地,磁碟機資訊沒有可用和不支援並相同套用包含像這一個省略符號的相對路徑:

\..\..\myfile.txt 

隔離儲存區樹狀子目錄是根目錄位於目前的使用者路徑資料夾中。例如,在 Windows Vista,[隔離儲存區資料夾的根目錄位於下方的使用者目錄。

Silverlight 應用程式將取得您,透過方法呼叫,應用程式特定的隔離儲存區進入點的存取:

using (IsolatedStorageFile iso = 
       IsolatedStorageFile.GetUserStoreForApplication()) 
{
  ...
}

靜態方法 GetUserStoreForApplication 傳回語彙基元,您用於任何進一步的存取,隔離儲存區。 在第一個 GetUserStoreForApplication 呼叫,應用程式特定樹狀子目錄會建立,如果它已經不存在。

Silverlight 的隔離儲存區 API 提供了類別,以使用檔案與受保護的檔案系統樹狀子目錄內的目錄。 幸好,您需要知道的類別的清單是很短,; 您會發現它們列在 [圖 2

fig02.gif

IsolatedStorageFile 類別中, 有很多方法,以建立和刪除檔案和檢查存在的檔案和目錄,和要讀取和寫入新檔案的目錄。 您使用資料流使用的檔案。 選擇性地,您可以包裝資料流上的是更舒適的物件使用的資料流讀取器。 [圖 3 ] 顯示如何建立使用資料流的寫入器的隔離儲存區檔案的一個簡短的範例。

[圖 3] 建立的隔離儲存區檔案

using (IsolatedStorageFile iso = 
      IsolatedStorageFile.GetUserStoreForApplication())
{
    // Open or create the low level stream
    IsolatedStorageFileStream fileStream;
    fileStream = new IsolatedStorageFileStream(fileName, 
        FileMode.OpenOrCreate, iso);

    // Encapsulate the raw stream in a more convenient writer
    StreamWriter writer = new StreamWriter(stream);

    // Write some data
    writer.Write(DateTime.Now.ToString());

    // Clean up
    writer.Close();
    stream.Close();
}

一旦您包裝低階的資料流在方便的資料流寫入器或讀取器,程式碼您用來寫入 (或讀取) 某些資料都將是幾乎與在傳統的.NET 應用程式中會使用您的程式碼。 看看如何在利用隔離儲存區 API 以儲存任何下載的 XAP 封裝在本機,並在稍後重新載入它。

建立封裝的資料永久快取

在上個月的專欄,我使用了 downloader 包裝函式類別來隱藏部分,您需要下載 XAP 套件,並擷取組件和其他資源的現成程式碼。 在 Downloader 類別,但是,是不只是一個 Helper 類別。 就概念上來說,它表示您想要的其他部分的原因很多應用程式程式碼隔離的邏輯的重要一。

第一個原因想到的念頭的會是 testability。 藉由公開 downloader 元件透過介面的功能,您可以取得快速且有效地進行測試 mocking,downloader 可能的性。 此外的介面代表您利用以取代更簡單的 downloader 工具複雜的其中一個,也許,只會發生支援封裝的快取。 [圖 4 ] 顯示您應該目標的設計的架構。

fig04.gif

[圖 4] [: Downloader 元件和應用程式的其餘

fig05.gif

[圖 5 擷取介面

在上個月的原始程式碼 Downloader 類別會是一個整合型程式碼片段)。 在更具彈性的設計讓我們來擷取的介面。 [圖 5 ] 顯示,Visual Studio 有內容功能表,雖然不為豐富的商業重整的工具不會提供某些說明與類別的介面的解壓縮。

現在,您的 Silverlight 應用程式的核心會討論到 IDownloader 介面,封裝的快取的所有邏輯必須都請只在實際的 downloader 類別中:

interface IDownloader
{
    void LoadPackage(string xapUrl, string asm, string cls);
    event EventHandler<Samples.XapEventArgs> XapDownloaded;
}

尤其,LoadPackage 方法將會重新寫入成加入邏輯,會檢查存在指定的 XAP 封裝在隔離儲存區內的並它從網際網路下載否則。 [圖 6 ] 顯示一個大型 Downloader 類別的程式碼區段。 方法會先嘗試取得 XAP 封裝的資料流,從內部快取。 如果這個嘗試失敗,方法進行,並從主應用程式伺服器下載套件。 (這是只我詳細討論最後一個月)。

[圖 6 Downloader) 元件的快取支援

public void LoadPackage(string xap, string asm, string cls)
{
    // Cache data within the class
    Initialize(xap, asm, cls, PackageContent.ClassFromAssembly);

    // Have a look in the cache
    Stream xapStream = LookupCacheForPackage();
    if (xapStream == null)
        StartDownload();
    else
    {
        // Process and extract resources
        FindClassFromAssembly(xapStream);
    }
}

protected Stream LookupCacheForPackage()
{
    // Look up the XAP package for the assembly.
    // Assuming the XAP URL is a file name with no HTTP information
    string xapFile = m_data.XapName;

    return DownloadCache.Load(xapFile);
}

protected void StartDownload()
{
    Uri address = new Uri(m_data.XapName, UriKind.RelativeOrAbsolute);
    WebClient client = new WebClient();

    switch (m_data.ActionRequired)
    {
        case PackageContent.ClassFromAssembly:
            client.OpenReadCompleted += 
                new OpenReadCompletedEventHandler(OnCompleted);
            break;
        default:
            return;
    }
    client.OpenReadAsync(address);
}

private void OnCompleted(object sender, OpenReadCompletedEventArgs e)
{
    // Handler registered at the application level?
    if (XapDownloaded == null)
        return;

    if (e.Error != null)
        return;

    // Save to the cache
    DownloadCache.Add(m_data.XapName, e.Result);

    // Process and extract resources
    FindClassFromAssembly(e.Result);
}

private void FindClassFromAssembly(Stream content)
{
    // Load a particular assembly from XAP
    Assembly a = GetAssemblyFromPackage(m_data.AssemblyName, content);

    // Get an instance of the specified user control class
    object page = a.CreateInstance(m_data.ClassName);

    // Fire the event
    XapEventArgs args = new XapEventArgs();
    args.DownloadedContent = page as UserControl;
    XapDownloaded(this, args);
}

在 Silverlight,下載。 的非同步的處理序使內部的方法 StartDownload 」 完成時引發事件,套件完全可以,在用戶端上 事件處理常式先將儲存到本機檔案的 XAP 封裝資料流的內容,並然後再從它中擷取資源。 請注意範例程式碼中我只擷取組件,; 在您想要擴充一般元件中快取功能,以任何其他類型的資源 (例如,XAML 的動畫、 影像或其他輔助的檔案]。

在 LoadPackage 方法,在 Downloader 類別中的可下載 Silverlight­user 控制項,在目前的 XAML 樹狀目錄中插入。 因為 XAP 封裝多個檔案的容器,您必須指定哪個組件都包含使用者控制項和類別名稱。 [圖 6 中的程式碼會直接從封裝中,擷取指定的組件,、 在目前的 AppDomain 載入它,然後建立指定的包含類別的執行個體。

如果組件會有某些相依性? [圖 6 中的程式碼就不會遮住這種情況。 結果如果至 LoadPackage,當做引數傳遞的組件會 (甚至在相同的 XAP 封裝) 內的另一個組件上具有相依性,您收到例外狀況只要執行流程到達相依性組件中的類別。 重點是在封裝中所有的組件應該在記憶體中載入。 若要發生您需要存取,資訊清單的檔案請閱讀有關已部署的組件,並處理它們]。 [圖 7 ] 如何在資訊清單檔案中所參考的所有組件都載入到記憶體顯示。

[圖 7 載入所有的組件資訊清單中

private Assembly GetAssemblyFromPackage(
     string assemblyName, Stream xapStream)
{
    // Local variables
    StreamResourceInfo resPackage = null;
    StreamResourceInfo resAssembly = null;

    // Initialize
    Uri assemblyUri = new Uri(assemblyName, UriKind.Relative);
    resPackage = new StreamResourceInfo(xapStream, null);
    resAssembly = Application.GetResourceStream(
                              resPackage, assemblyUri);

    // Extract the primary assembly and load into the AppDomain 
    AssemblyPart part = new AssemblyPart();
    Assembly a = part.Load(resAssembly.Stream);

    // Load other assemblies (dependencies) from manifest
    Uri manifestUri = new Uri("AppManifest.xaml", UriKind.Relative);
    Stream manifestStream = Application.GetResourceStream(
        resPackage, manifestUri).Stream; 
    string manifest = new StreamReader(manifestStream).ReadToEnd();

    // Parse the manifest to get the list of referenced assemblies
    List<AssemblyPart> parts = ManifestHelper.GetDeploymentParts(manifest);

    foreach (AssemblyPart ap in parts)  
    {
        // Skip over primary assembly (already processed) 
        if (!ap.Source.ToLower().Equals(assemblyName))
        {
            StreamResourceInfo sri = null;
            sri = Application.GetResourceStream(
                resPackage, new Uri(ap.Source, UriKind.Relative));
            ap.Load(sri.Stream);
        }
    }

    // Close stream and returns
    xapStream.Close();
    return a;
}

資訊清單檔案是 XML 檔案,如下所示:

<Deployment EntryPointAssembly="More" EntryPointType="More.App" 
            RuntimeVersion="2.0.31005.0">
  <Deployment.Parts>
    <AssemblyPart x:Name="More" Source="More.dll" />
    <AssemblyPart x:Name="TestLib" Source="TestLib.dll" />
  </Deployment.Parts>
</Deployment> 

要剖析這個檔案,您可以使用 LINQ-to-XML。 原始程式碼會包含範例 ManifestHelper 類別使用方法,傳回 AssemblyPart 物件 (請參閱 [圖 8 ) 的清單。 值得注意的是在 Beta 版 Silverlight 2,您無法使用 XamlReader 類別来剖析資訊清單檔部署物件:

// This code throws in Silverlight 2 RTM
Deployment deploy = XamlReader.Load(manifest) as Deployment;

[圖 8 剖析使用 LINQ-to-XML 資訊清單

public class ManifestHelper
{
   public static List<AssemblyPart> GetDeploymentParts(string manifest)
   {
      XElement deploymentRoot = XDocument.Parse(manifest).Root;
      List<AssemblyPart> parts = 
          (from n in deploymentRoot.Descendants().Elements() 
           select new AssemblyPart() { 
                Source = n.Attribute("Source").Value }
          ).ToList();

          return parts;
   }
}

在版本部署物件具有已轉換成單一而後續它無法被用來動態載入組件。 資訊清單中的 XML 因此必須剖析以手動方式。

到期原則

組件快取實為止作是永久而不讓使用者以取得更新的套件。 唯一可能的解決方法是在電腦系統管理員 」 會找出應用程式的隔離儲存區檔案,並透過 Windows 檔案總管手動刪除它們。

讓我們來看看需要新增的 [下載之後的時間在指定時間之後,使任何快取的 XAP 檔案已過時的一個簡單的到期原則。 在適當設定的到期原則就是為] 中的 [圖 6 DownloadCache 類別。 當您將 XAP 檔加入至快取時,您需要儲存一些下載時間的相關資訊。 當您存取快取以挑選封裝時, 您應該確認封裝是否已過期 (請參閱 [圖 9 ) 中。

[圖 9 的到期日的測試

public bool IsExpired(string xapFile)
{
    bool expired = true;
    if (m_ItemsIndex.ContainsKey(xapFile))
    {
        DateTime dt = (DateTime)m_ItemsIndex[xapFile];

        // Expires after 1 hour
        expired = dt.AddSeconds(3600) < DateTime.Now;    
        if (expired)
            Remove(xapFile);
    }

    return expired;
}

這類的明顯簡單的演算法的實作會減慢的一個重要的事實。 在 Silverlight,有沒有方法可以存取檔案屬性,例如上次的更新或建立。 這表示您是負責管理時間資訊。 也就是說當您將一個 XAP 加入快取時您也建立的項目,以追蹤已下載的套件時某些自訂和永續性字典中。 不用,說這項資訊對保存方式隔離儲存區。 [圖 10 ] 說明此概念。

[圖 10 保存至隔離儲存區下載詳細資料

public static Stream Load(string file)
{
    IsolatedStorageFile iso;
    iso = IsolatedStorageFile.GetUserStoreForApplication();

    if (!iso.FileExists(file))
    {
        iso.Dispose();
        return null;
    }

    // Check some expiration policy
    CacheIndex m_Index = new CacheIndex();
    if (!m_Index.IsExpired(file))
        return iso.OpenFile(file, FileMode.Open);

    // Force reload
    iso.Dispose();
    return null;
}

CacheIndex 將是您,Helper 類別使用 Silverlight 的原生應用程式設定 API 保存 XAP 名稱的字典,並在隔離儲存區中下載時間。 m_ItemIndex 成員將是您,執行個體化 CacheIndex 建構函式中如 [圖 11 ] 所示純文字的字典物件。

[圖 11: CacheIndex 類別

public class CacheIndex
{
    private const string XAPCACHENAME = "XapCache";
    private Dictionary<string, object> m_ItemsIndex; 
    public CacheIndex()
    {
      IsolatedStorageSettings iss;
      iss = IsolatedStorageSettings.ApplicationSettings;
      if (iss.Contains(XAPCACHENAME))
         m_ItemsIndex = iss[XAPCACHENAME] as Dictionary<string, object>;
      else
      {
         m_ItemsIndex = new Dictionary<string, object>();
         iss[XAPCACHENAME] = m_ItemsIndex;
         iss.Save();
      }
   }
  ...
}

ApplicationSettings 將是您,Silverlight 2 的一個很棒的功能。 它基本上是字串 / 物件字典所組成,並自動從儲存在應用程式載入並儲存到儲存在關機時讀取。 會自動保存任何 (可序列化) 的物件,您將新增至字典]。

您可以建立一個 XAPCACHENAME 項目字典您安排保存 XAP 字典的內容中。 如 [圖 12 XAP 字典會包含一個項目,每個下載的套件搭配使用的的下載時間。 請注意 ApplicationSettings API 也提供您儲存方法,強制應用程式關閉之前的持續性。

[圖 12 加入下載資訊

public void Add(string xapFile)
{
    m_ItemsIndex[xapFile] = DateTime.Now;
    IsolatedStorageSettings iss;
    iss = IsolatedStorageSettings.ApplicationSettings;
    iss.Save();                
}

public void Remove(string xapFile)
{
    m_ItemsIndex.Remove(xapFile);
    IsolatedStorageSettings iss;
    iss = IsolatedStorageSettings.ApplicationSettings;
    iss.Save();
}

所有在一起將它

背後的公用類別,帷幕發生在所有的變更和到目前為止所討論的詳細資訊 — Downloader 類別。 藉由將 Silverlight 應用程式中的,這個類別,您會取得多層級的單一的擷取畫面中快取。 以適當程式碼您可以快取下載的應用程式工作階段持續期間使用者控制項。 如果您下載到,說的內容,索引標籤的項目,您可以再隱藏並顯示索引標籤項目重複而不需要不斷地下載套件。

如果下載透過 WebClient 類別 (為在上個月的專欄中) 您控制項通過瀏覽器引擎,並取得快取的瀏覽器的層級。 任何已下載的 XAP 封裝在使用者的電腦上存在,直到使用者清除瀏覽器快取。 最後,Downloader 類別,您使用這個資料行取得所支援的隔離儲存區到永久快取。 這表示您透過 WebClient,下載任何時間 XAP 封裝也儲存至本機儲存區。

在 Downloader 類別,但是,還提供挑選 XAP 檔案從儲存區,如果找不到有效的封裝。 請注意這是可跨應用程式工作階段。 您一次下載套件您工作,然後您關閉應用程式。 When Resume,封裝會重新載入從儲存區,如果它不是已過期。 如果封裝過期? 在這種情況下,downloader 通過 WebClient。 但這時候 WebClient 可能只是傳回先前的瀏覽器快取將相同的套件。

這是原本設計。 略過層級的瀏覽器快取,您必須停用它做為上個月討論在原始 HTTP 要求中。 您必須將快取在頁面層級的屬性,或透過,您可以設定到期原則更精確地說而不影響頁面的其他資源的 HTTP 處理常式中取得套件。

一些最後的筆記

快取 XAP 套件並不表示快取個別的資源,例如 XAML 的動畫的 DLL 或多媒體內容。 在目前的實作資源會解壓縮從 XAP 封裝每一次使用它們。 不過,這是您可以進一步改善,與 Downloader 類別的外觀。 同樣地,套件會提供使用者控制項,但不會追蹤使用者可以強制在其使用者介面的變更。 追蹤 [XAML] 樹狀目錄的動態變更,是另一個主題,而且應得自己的文章。

有二種存取本機使用者的機器上為 Silverlight 私密的檔案系統方法。 所有在程式碼片段中這個資料行中,,我會使用方法 GetUserStoreForApplication IsolatedStorageFile 類別上。 這個方法會傳回可存取區段,以每表示所有和只組件關聯的應用程式會使用相同的存放區的應用程式隔離的檔案系統的語彙基元。 您也可以選取一個儲存區,並裝載在相同的網站上的所有應用程式間共用。 在這種情況下您會透過方法 GetUserStoreForSite 取得語彙基元。

太請注意本機存放區可以是管理透過 [Silverlight 組態] 對話方塊 (在一個 Silverlight 應用程式上按一下滑鼠右鍵),而且甚至完全停用。 在這種情況下嘗試取得語彙基元時, 將引發例外狀況。 磁碟配額也會套用到針對每個網域的本機存放],; 它的預設值是 1 MB。 時規劃永久的 Silverlight 快取,請記住這個選項。

您提出問題或意見,請以 Dino 寄 cutting@Microsoft.com.

Dino Esposito 將是 IDesign 和合著 Microsoft .NET: Architecting Applications for the Enterprise (Microsoft Press 2008) 的架構設計人員。 基礎的義大利,Dino 都是在世界各地的產業活動經常演講者簡報。 您可以加入在他的部落格 weblogs.asp。 net / despos.