将图像源绑定到页面

时间:2015-12-11 01:03:10

标签: c# xaml windows-store-apps uwp

我正在尝试让图像显示在UWP应用中的图像内部,这样我就可以将所选图像从图像选择器显示给最终用户。我可以根据用户通过filepicker选择图像来判断当前文件是否正确设置,但表单上没有显示任何内容。有人可以帮忙吗?

MainPage.xaml中

        <Border Grid.Row="1" BorderBrush="WhiteSmoke" BorderThickness="2" Margin="5">
            <Image Source="{Binding CurrentFile}" Stretch="Fill" />
        </Border>

MainPageViewModel.cs

    public StorageFile CurrentFile {
        get
        {
            return _currentFile;
        }
        set
        {
            SetValue(ref _currentFile, value);
        }
    }

3 个答案:

答案 0 :(得分:3)

您可以使用问题评论中提到的绑定转换器,或者将视图模型属性的类型更改为ImageSource

public ImageSource CurrentImage
{
    get { return currentImage; }
    set { SetValue(ref currentImage, value); }
}

然后,您将从BitmapImage创建StorageFile并将其分配给该属性,如下所示:

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;
}

答案 1 :(得分:0)

  

问题在于,StorageFile类型无法转换为   图像的来源。所以你必须使用ValueConverter或   将类型StorageFile更改为Image

所以该属性将如下所示:

private Image _CurrentFile;    
public Image CurrentFile
{
    get
    {
       return _CurrentFile;
    }
}

其中Image位于System.Windows.Controls名称空间

答案 2 :(得分:0)

Per @Clemens,我不得不将属性的类型更改为图像源,然后在UI线程上异步加载它以使图像显示。

在这种情况下,任何尝试加载图片作为WPF Image类型来源的人的答案是:

通过StorageFile set方法中的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;
}