2012年9月28日星期五

WinRT/Metro: 从StorageFile中显示图像

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: