正在将图像源绑定到页面
本文关键字:绑定 图像 | 更新日期: 2023-09-27 18:26:20
我正试图让一个图像出现在UWP应用程序中的图像中,这样我就可以向最终用户显示从图像选择器中选择的图像。我可以根据用户通过filepicker拾取图像来判断当前文件的设置是否正确,但表单上没有显示任何内容。有人能帮忙吗?
主页.xaml
<Border Grid.Row="1" BorderBrush="WhiteSmoke" BorderThickness="2" Margin="5">
<Image Source="{Binding CurrentFile}" Stretch="Fill" />
</Border>
主页视图Model.cs
public StorageFile CurrentFile {
get
{
return _currentFile;
}
set
{
SetValue(ref _currentFile, value);
}
}
您可以使用问题注释中提到的绑定转换器,或者将视图模型属性的类型更改为ImageSource
:
public ImageSource CurrentImage
{
get { return currentImage; }
set { SetValue(ref currentImage, value); }
}
然后,您将从StorageFile
创建一个BitmapImage
,并将其分配给如下属性:
var bitmap = new BitmapImage();
await bitmap.SetSourceAsync(await file.OpenReadAsync());
CurrentImage = bitmap;
当你在问题中提到"图像选择器"时,你可以像这样使用上面的代码:
var picker = new FileOpenPicker
{
SuggestedStartLocation = PickerLocationId.PicturesLibrary
};
picker.FileTypeFilter.Add(".jpg");
picker.FileTypeFilter.Add(".jpeg");
picker.FileTypeFilter.Add(".png");
var file = await picker.PickSingleFileAsync();
if (file != null)
{
var bitmap = new BitmapImage();
await bitmap.SetSourceAsync(await file.OpenReadAsync());
viewModel.CurrentImage = bitmap;
}
这里的问题是,类型
StorageFile
无法转换为图像的源。因此,您必须使用ValueConverter
或将类型StorageFile
更改为Image
因此属性将如下所示:
private Image _CurrentFile;
public Image CurrentFile
{
get
{
return _CurrentFile;
}
}
其中Image
在System.Windows.Controls
命名空间下
Per@Clemens,我不得不将属性的类型更改为图像源,然后在UI线程上异步加载它以获得要显示的图像。
在这种情况下,对于任何试图加载图像作为WPF Image
类型的源的人来说,答案是:
通过StorageFile集合方法中的UI Dispatcher运行它:
//Acquire storagefile via a picker or something
public StorageFile CurrentFile
{
get { return currentImage; }
set {
SetValue(ref currentImage, value);
CoreWindow.GetForCurrentThread().Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => SetCurrentImageAsync(value));
}
}
将图像异步加载到CurrentImage属性
public ImageSource CurrentImage
{
get { return currentImage; }
set { SetValue(ref currentImage, value); }
}
public async Task SetCurrentImageAsync(StorageFile file) {
var bitmap = new BitmapImage();
await bitmap.SetSourceAsync(await file.OpenReadAsync());
this.CurrentImage = bitmap;
}