图像不显示在Windows 8.1商店应用程序
问题描述:
我有一个Windows 8.1商店应用程序,并在我需要显示图像的意见之一。我已经在WPF桌面应用程序中做了这么多次,所以它应该很容易做到,但是我的图像不会显示。我从存储库中获取这个图像作为一个字节数组。我查看了我的ViewModel中显示的所有字节。但是,我没有看到它。这是我第一次尝试在Windows 8.1 Store应用程序中显示图像,所以我想知道事情是否完成不同。图像不显示在Windows 8.1商店应用程序
这里是我的XAML代码:
<Border Grid.Column="2" BorderBrush="White" BorderThickness="5" Margin="2">
<Image Source="{Binding ImageBuffer}" AutomationProperties.Name="{Binding CompanyName}"
Width="280" Height="190" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Border>
后面的代码包含了,就像我说的,正确地与图像的所有字节初始化的“ImageBuffer的”公共财产。
private byte[] _imageBuffer;
public byte[] ImageBuffer
{
get { return _imageBuffer; }
set { Set(() => ImageBuffer, ref _imageBuffer, value); }
}
我为我的项目使用MVVM Light Toolkit。
有什么建议吗?
谢谢, 埃迪
答
显然没有来自byte[]
没有自动类型转换到ImageSource
中的WinRT(因为它是在WPF)。你应该看到在Visual Studio中的输出窗口中的错误消息像
Error: Converter failed to convert value of type 'Windows.Foundation.IReferenceArray`1' to type 'ImageSource'; ...
所以,你应该用的结合转换器是这样的:
using System;
using System.IO;
using Windows.Storage.Streams;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Media.Imaging;
...
public class ImageConverter : IValueConverter
{
public object Convert(
object value, Type targetType, object parameter, string language)
{
var bitmap = new BitmapImage();
var buffer = value as byte[];
if (buffer != null)
{
using (var stream = new InMemoryRandomAccessStream())
{
stream.AsStreamForWrite().Write(buffer, 0, buffer.Length);
stream.Seek(0);
bitmap.SetSource(stream);
}
}
return bitmap;
}
public object ConvertBack(
object value, Type targetType, object parameter, string language)
{
throw new NotSupportedException();
}
}
然后用它在Image.Source
绑定是这样的:
<Page.Resources>
<local:ImageConverter x:Key="ImageConverter"/>
</Page.Resources>
...
<Image Source="{Binding ImageBuffer, Converter={StaticResource ImageConverter}}" ... />
谢谢你,克莱门斯。这真的起作用了。我在输出窗口看到了错误。当我发现某些东西不能按预期工作时,我也学会了去观察它。 – Eddie
对于尝试克莱门斯解决方案的人来说,另一个评论是“AsStreamForWrite”,它是一种只有在添加System.IO命名空间时才可用的扩展方法。这对我来说并不是很清楚,因为我的Visual Studio 2015中没有ReSharper,所以我不得不围绕一点点来了解该方法来自哪里。无论如何,一个很好的解决方案再次感谢克莱门斯。 – Eddie