WinRT/Metro: 从StorageFile中显示图像
做一个小程序,进入程序后,选择一个文件夹,然后从StorageFolder中读取StorageFile,筛选图片文件,最后将图片显示在GridView中。
界面上很简单,一个准备弹出FolderPicker的按钮,还有一个GridView,GridView的Template直接绑定ItemsSource的图像:
<GridView Name="grid">
<GridView.ItemTemplate>
<DataTemplate>
<Image Source="{Binding}" Stretch="Fill" Width="400" Height="200"/>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
执行逻辑就在按钮点击的事件代码中。首先注意需要要入如下额外的命名空间:
using Windows.Storage.Pickers;
using Windows.UI.Xaml.Media.Imaging;
using System.Threading.Tasks;
接着需要两个辅助方法,一个将StorageFile转换成ImageSource,另一个用来字符串比较(在判断图像扩展名时用到):
//将StorageFile转换成ImageSource
static async Task<ImageSource> ImageFromFile(StorageFile file)
{
var bitmapImage = new BitmapImage();
var stream = await file.OpenReadAsync();
{
bitmapImage.SetSource(stream);
return bitmapImage;
}
}
//用于判断扩展名
static bool CheckExtension(string str, params string[] exts)
{
foreach (var ext in exts)
if (str.Equals(ext, StringComparison.CurrentCultureIgnoreCase))
return true;
return false;
}
最后按钮Click执行代码:
private async void Button_Click_1(object sender, RoutedEventArgs e)
{
//创建FolderPicker
var folderpicker = new FolderPicker();
folderpicker.FileTypeFilter.Add("*");
//用户选择的文件夹
var targetDir = await folderpicker.PickSingleFolderAsync();
//筛选图像文件
var imgFiles = (await targetDir.GetFilesAsync()).Where(f => CheckExtension(f.FileType, ".jpg", ".jpeg", ".png", ".gif", ".bmp"));
//将StorageFile转换成ImageSource
var imgs = imgFiles.Select(f => ImageFromFile(f).Result);
//设置ItemsSource
grid.ItemsSource = imgs;
}
TAG: