图像不显示在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}}" ... /> 
+0

谢谢你,克莱门斯。这真的起作用了。我在输出窗口看到了错误。当我发现某些东西不能按预期工作时,我也学会了去观察它。 – Eddie

+0

对于尝试克莱门斯解决方案的人来说,另一个评论是“AsStreamForWrite”,它是一种只有在添加System.IO命名空间时才可用的扩展方法。这对我来说并不是很清楚,因为我的Visual Studio 2015中没有ReSharper,所以我不得不围绕一点点来了解该方法来自哪里。无论如何,一个很好的解决方案再次感谢克莱门斯。 – Eddie