我正在开发第一个针对以下内容的 PCL:WSA(Windows 应用商店应用程序)、WPF、WP7、WP8。我们可以说它是一种rolerdex 应用程序,你有联系人,他们有联系方式和图片。 (不是,但我无法提供有关该应用程序的详细信息,因此我使用了一个非常简单的示例)。以下是我的一些问题:)
如果是:
我没有使用数据库,也没有从外部服务下载图像 - 我想在本地、应用程序或 PCL 中保留图像(实际上并不多)。
编辑:
我只想显示图像。就是这样。这是一个静态的角色索引,你不能添加新的人。我只想显示 5 个人及其图像(在 PCL 中)。如果是 Windows 应用商店应用程序,我该如何引用图像?
我有一个绑定(bind),并且 DataContext 设置为 PCL 中的 ViewModel。 ViewModel 聚合要从模型显示的数据。我绑定(bind)的属性是 MyImage。忽略其他平台,Uri 会是什么样子?其他一切正常。
我真的只是想要这三个问题的帮助,虽然我真的很感激所有的答案!!!
最佳答案
在很多情况下,图像是特定于平台的。它们需要满足设备本身的尺寸和 DPI,并且需要适合应用程序的外观和感觉。对于这些情况,我会让 View 本身决定向用户显示哪些图像,这可能基于 ViewModel 提供的某种状态/模式。
但是,在这些情况下,图像需要来自 ViewModel,例如,在邮件应用程序中显示的发件人缩略图的情况。在这些情况下,我让 ViewModel 返回某种与平台无关的图像概念(例如 byte[]),然后让特定于平台的项目将其转换为它们的 UI 堆栈可以理解的内容(在 XAML 中,这将是一个 ImageSource)。
代码看起来像这样:
便携项目 :
using System.IO;
using System.Reflection;
namespace Portable
{
public class ViewModel
{
private byte[] _image = LoadFromResource("Image.png");
public byte[] Image
{
get { return _image; }
}
private static byte[] LoadFromResource(string name)
{
using (Stream stream = typeof(ViewModel).GetTypeInfo().Assembly.GetManifestResourceStream("Portable." + name))
{
MemoryStream buffer = new MemoryStream();
stream.CopyTo(buffer);
return buffer.ToArray();
}
}
}
}
注:您需要根据目标平台删除或添加 GetTypeInfo()。
在这里,我们从嵌入式资源(属性 -> 构建操作 -> 嵌入式资源)中读取数据,但您可以想象这是来自网络或其他地方。
Windows 应用商店应用项目:
在 Windows 应用商店应用程序中,您将有一个值转换器可以从 byte[] -> ImageSource 进行转换:
using System;
using System.IO;
using Windows.Storage.Streams;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Media.Imaging;
namespace App
{
public class ByteToImageSourceValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
InMemoryRandomAccessStream s = new InMemoryRandomAccessStream();
byte[] bytes = (byte[])value;
Stream stream = s.AsStreamForWrite();
stream.Write(bytes, 0, bytes.Length);
stream.Flush();
stream.Seek(0, SeekOrigin.Begin);
BitmapImage source = new BitmapImage();
source.SetSource(s);
return source;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
}
在 View 后面的代码中,设置 DataContext:
DataContext = new ViewModel();
然后在 View 本身绑定(bind)到 ViewModel.Image 属性,并设置转换器:
<Page.Resources>
<local:ByteToImageSourceValueConverter x:Name="ImageConverter"/>
</Page.Resources>
<Grid >
<Image HorizontalAlignment="Left" Height="242" Margin="77,10,0,0" VerticalAlignment="Top" Width="278" Source="{Binding Image, Converter={StaticResource ImageConverter}}"/>
</Grid>
关于wpf - 如何处理面向 Windows 应用商店应用程序和 WP7、WP8、WPF 的可移植类库中的图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12512239/