在Win 8 App的安全沙箱內,除了使用文件選取器FileOpenPicker外,沒有其餘辦法調用某個盤符的數據。git
全新的Storage命名空間,借鑑了IOS與Android的設計。github
下面引用一個圖片綁定的簡單例子:安全
原來WPF咱們能夠這樣寫:app
1 <Grid Background="Red"> 2 <Image x:Name="bg1" Source="ms-appx:///Assets/shanghai.jpg"></Image> 3 </Grid>
也能夠在Code-Behind這樣寫:async
this.DataContext = new BitmapImage(new Uri("ms-appx:///Assets/shanghai.jpg"));
XAML:this
<Image x:Name="bg1" Source="{Binding}"></Image>
效果都是這樣:spa
下面咱們用Win8 App的Storage來重寫一下上面的代碼。設計
爲了舉例,咱們須要引用本地圖片庫的圖片文件。code
在AppPackage.appxmanifest中,加上配置blog
1 <Capabilities> 2 <Capability Name="picturesLibrary" /> 3 </Capabilities>
Code-Behind:
1 var file = KnownFolders.PicturesLibrary.GetFileAsync("shanghai.jpg").AsTask().Result; 2 3 this.DataContext = new BitmapImage(new Uri(file.Path));
運行程序,圖片並無顯示,這說明Storage是不支持Uri的。
解決方案1:經過讀取File的Stream,Set Image的Source,代碼以下:
1 var file = await KnownFolders.PicturesLibrary.GetFileAsync("shanghai.jpg"); 2 using (var fileStream = await file.OpenAsync(FileAccessMode.Read)) { 3 BitmapImage image = new BitmapImage(); 4 image.SetSource(fileStream); 5 this.DataContext = image; 6 }
解決方案2:經過WriteBitmap類實現,代碼以下:
1 async private void GetImage() { 2 var file = await KnownFolders.PicturesLibrary.GetFileAsync("shanghai.jpg"); 3 using (var stream = await file.OpenAsync(FileAccessMode.Read)) { 4 BitmapImage image = new BitmapImage(); 5 image.SetSource(stream); 6 stream.Seek(0); 7 backgroundBmp = new WriteableBitmap(image.PixelWidth, image.PixelHeight); 8 await backgroundBmp.SetSourceAsync(stream); 9 this.DataContext = backgroundBmp; 10 } 11 } 12 13 private WriteableBitmap backgroundBmp;
一樣,也能夠經過引用WriteableBitmapEx.WinRT簡化寫法,代碼以下:
1 async private void GetImage() { 2 var file = await KnownFolders.PicturesLibrary.GetFileAsync("shanghai.jpg"); 3 using (var stream = await file.OpenAsync(FileAccessMode.Read)) { 4 BitmapImage image = new BitmapImage(); 5 image.SetSource(stream); 6 stream.Seek(0); 7 backgroundBmp = await BitmapFactory.New(image.PixelWidth, image.PixelHeight).FromStream(stream); 8 this.DataContext = backgroundBmp; 9 } 10 } 11 12 private WriteableBitmap backgroundBmp;
解放方案1和2的區別,WriteableBitmap能夠精確指定生成的Image的區域,這樣就能夠經過WriteableBitmap實現圖片的縮放,裁剪。
代碼:戳