【问题标题】:Image not being displayed in Windows 8.1 Store application图像未显示在 Windows 8.1 应用商店应用程序中
【发布时间】:2016-09-23 22:16:20
【问题描述】:

我有一个 Windows 8.1 应用商店应用程序,我需要在其中一个视图中显示图像。我已经在 WPF 桌面应用程序中做了一百万次,所以它应该很容易做到,但我的图像没有显示。我从存储库中获取此图像作为字节数组。我检查了一下,在我的视图显示时我的 ViewModel 中有所有字节。然而,我没有看到它。这是我第一次真正尝试在 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。

有什么建议吗?

谢谢, 埃迪

【问题讨论】:

    标签: c# wpf image mvvm


    【解决方案1】:

    显然在 WinRT 中没有从 byte[]ImageSource 的自动类型转换(就像在 WPF 中一样)。您应该已经在 Visual Studio 的输出窗口中看到了一条错误消息,例如

    错误:转换器无法转换类型的值 'Windows.Foundation.IReferenceArray`1' 输入 '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.SourceBinding中使用它:

    <Page.Resources>
        <local:ImageConverter x:Key="ImageConverter"/>
    </Page.Resources>
    ...
    <Image Source="{Binding ImageBuffer, Converter={StaticResource ImageConverter}}" ... />
    

    【讨论】:

    • 谢谢你,克莱门斯。那真的奏效了。我在输出窗口中看到了错误。当某些事情没有按预期工作时,我也学会了查看它。
    • 对于尝试 Clemens 解决方案的人们的另一条评论,“AsStreamForWrite”是一种扩展方法,只有在添加 System.IO 命名空间时才可用。这对我来说不是很清楚,因为我的 Visual Studio 2015 中没有 ReSharper,所以我不得不稍微挖掘一下以找出该方法的来源。无论如何,一个很好的解决方案。再次感谢克莱门斯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多