我需要一个转换器才能将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
我无法使这种格式有效!非常感谢任何帮助。我必须打开/读取文件吗?我不能使转换方法异步,这样会使它变得棘手。
答案 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; }
}