2014-01-27 89 views
3

我是在更新我的Windows Phone應用使用新的WP8文件存儲API(LocalFolder)的過程映像路徑,而不是WP7的API(IsolatedStorageFile)。如何獲得保存到WP8本地文件夾活瓷磚

老的工作方法

這裏是我成功的將圖像保存到使用IsolatedStorageFile方法/共享/ ShellContent文件夾(保存圖像時,注意到/Shared/ShellContent/前綴,也是isostore:/Shared/ShellContent/更新動態磁貼時的前綴。

using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication()) 
{ 
    if (myIsolatedStorage.FileExists("/Shared/ShellContent/LiveTileImagePath.jpg")) 
    { 
      myIsolatedStorage.DeleteFile("/Shared/ShellContent/LiveTileImagePath.jpg"); 
    } 

    IsolatedStorageFileStream copyFileStream = myIsolatedStorage.CreateFile("/Shared/ShellContent/LiveTileImagePath.jpg"); 
    wb.SaveJpeg(copyFileStream, wb.PixelWidth, wb.PixelHeight, 0, 100); 
    copyFileStream.Close(); 

    //UpdateTile 
    ShellTile tile = ShellTile.ActiveTiles.First(); 

    if (tile != null) 
    { 
      FlipTileData tileData = new FlipTileData() 
      { 
       Title = "title", 
       BackTitle = "backtitle", 
       BackContent = "", 
       WideBackContent = "", 
       SmallBackgroundImage = new Uri("/Images/SmallIconBW.png", UriKind.RelativeOrAbsolute), 
       BackgroundImage = new Uri("/Images/MediumKiss336.png", UriKind.RelativeOrAbsolute), 
       BackBackgroundImage = new Uri("isostore:/Shared/ShellContent/LiveTileImagePath.jpg", UriKind.RelativeOrAbsolute), 
       WideBackgroundImage = new Uri("/Images/MediumKiss336.png", UriKind.RelativeOrAbsolute), 
       WideBackBackgroundImage = new Uri("isostore:/Shared/ShellContent/LiveTileImagePath.jpg", UriKind.RelativeOrAbsolute) 
       }; 

       tile.Update(tileData); 
      } 
} 

要解決的問題

當我使用新方法保存圖像時出現問題。我似乎無法找到正確的圖像路徑來更新瓦片。這裏是我的新方法來保存圖像(注意fileStream是一個MemoryStream,包含我從該方法中的一個WriteableBitmap生成的jpeg圖像。它可以很好地存儲在應用程序中使用的存儲,但不存儲到共享文件夾)

StorageFile liveTileImageFile = await localFolder.CreateFileAsync("/Shared/ShellContent/LiveTileImagePath.jpg", CreationCollisionOption.ReplaceExisting); 

fileStream.Seek(0, SeekOrigin.Begin); 

using(Stream sharedFolderStream = await liveTileImageFile.OpenStreamForWriteAsync()) 
{ 
    await fileStream.CopyToAsync(sharedFolderStream); 
} 

ShellTile tile = ShellTile.ActiveTiles.First(); 

if (tile != null) 
{ 
    FlipTileData tileData = new FlipTileData() 
    { 
     Title = "Kiss Dictionary", 
     BackTitle = "name", 
     BackContent = "", 
     WideBackContent = "", 
     SmallBackgroundImage = new Uri("/Images/SmallIconBW.png", UriKind.RelativeOrAbsolute), 
     BackgroundImage = new Uri("/Images/MediumKiss336.png", UriKind.RelativeOrAbsolute), 
     BackBackgroundImage = new Uri("isostore:/Shared/ShellContent/LiveTileImagePath.jpg", UriKind.RelativeOrAbsolute), 
      WideBackgroundImage = new Uri("/Images/MediumKiss336.png", UriKind.RelativeOrAbsolute), 
      WideBackBackgroundImage = new Uri("isostore:/Shared/ShellContent/LiveTileImagePath.jpg", UriKind.RelativeOrAbsolute) 
     }; 

     tile.Update(tileData); 
} 

的問題是,我無法將圖像保存到共享/ ShellFolder,我得到這個異常消息:

文件名,目錄名或卷標語法不正確。 (異常來自HRESULT:0x8007007B)

如果已經更新您的應用程序的更新LiveTile,請解釋一下你用來保存路徑和你分配給您的LiveTile圖像文件路徑。

UPDATE:

羅布的回答以下修復異常,並讓我保存的文件夾。我做的改變對我的瓷磚更新中使用的文件路徑(感謝Scott洛夫格羅夫的建議):

,而不是舊的方式:

BackBackgroundImage = new Uri("isostore:/Shared/ShellContent/LiveTileImagePath.jpg", UriKind.RelativeOrAbsolute) 

我用這個成功

BackBackgroundImage = new Uri("isostore:shared\\shellcontent\\LiveTileImagePath.jpg", UriKind.RelativeOrAbsolute) 
+0

就這樣,我們很清楚你是說它吹起來的CreatFileAsync行嗎?\ –

+1

是的,問題是,它不會遞歸獲取文件夾。羅布的答案通過自己獲取每個文件夾,然後在最後一個文件夾中創建文件來解決該問題。 –

回答

4

這是醜陋的,但它的工作原理......你需要深入到每個孤立存儲目錄。你不能只放在完整的路徑(這太容易了)。

所以不是:

StorageFile liveTileImageFile = await localFolder.CreateFileAsync("/Shared/ShellContent/LiveTileImagePath.jpg", CreationCollisionOption.ReplaceExisting); 

你應該有:

var sharedFolder = await localFolder.GetFolderAsync("Shared"); 
var shellContentFolder = await sharedFolder.GetFolderAsync("ShellContent"); 
var liveTileImageFile = await shellContentFolder.CreateFileAsync("LiveTileImagePath.jpg", CreationCollisionOption.ReplaceExisting); 

希望有所幫助。

+0

這工作,謝謝。另外,如果有其他人關心,沒有任何可察覺的表演命中。檢查我更新的問題以獲得最終總結。 –