如何将指向硬盘(而不是Assets)的Uri转换为ImageSource?

时间:2016-05-30 03:26:54

标签: uwp

我需要一个转换器才能将Uri转换为BitmapImage的ImageSource。如果我用这个:

Uri dummyUri = new Uri(@"ms-appx:///Assets/EmptyImage.png");
return new BitmapImage(dummyUri);

一切正常,但我的真实' url指向复制到LocalState文件夹下的下载目录中的文件。 Uri是:

file:///downloads/eni^mp270a^tablet test/DSC_5517.jpg

我无法使这种格式有效!非常感谢任何帮助。我必须打开/读取文件吗?我不能使转换方法异步,这样会使它变得棘手。

1 个答案:

答案 0 :(得分:0)

  

我的“真实”网址指向复制到LocalState文件夹下的下载目录中的文件。 Uri是:file:/// downloads / eni ^ mp270a ^ tablet test / DSC_5517.jpg

众所周知,我们的应用程序的本地文件夹名为LocalState文件夹,我们可以在app的代码后面访问该文件夹。但这里的Uri不正确,问题实际上是“如何在本地文件夹中获取文件的路径。”

您可以使用StorageFile.Path | path property在此处获取文件的完整文件系统路径。例如,我在这里使用ListView来显示从文件的Uri转换的所有BitmapImage。这很奇怪,因为url可以直接用作Image的源代码,但在这里我只是根据需要使用转换器将url转换为BitmapImage

<Page.Resources>
    <local:UriToBitmapImageConverter x:Key="cvt" />
</Page.Resources>

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid.RowDefinitions>
        <RowDefinition Height="50" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <Button Content="Get Picture" Click="Button_Click" />
    <ListView Grid.Row="1" ItemsSource="{x:Bind urlcollection}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <Image Source="{Binding url, Converter={StaticResource cvt}}" Width="300" Height="300" />
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>
代码背后的代码:

private ObservableCollection<ImageUri> urlcollection = new ObservableCollection<ImageUri>();

public MainPage()
{
    this.InitializeComponent();
}

private async void Button_Click(object sender, RoutedEventArgs e)
{
    StorageFolder local = ApplicationData.Current.LocalFolder;
    StorageFolder downloads = await local.GetFolderAsync("downloads");
    if (downloads != null)
    {
        var files = await downloads.GetFilesAsync();
        foreach (var file in files)
        {
            urlcollection.Add(new ImageUri { url = new Uri(file.Path) });
        }
    }
}

转换器是这样的:

public class UriToBitmapImageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        var url = (Uri)value;
        return new BitmapImage(url);
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

ImageUri类很简单:

public class ImageUri
{
    public Uri url { get; set; }
}