wpf - 如何处理面向 Windows 应用商店应用程序和 WP7、WP8、WPF 的可移植类库中的图像?

标签 wpf microsoft-metro windows-runtime portable-class-library

我正在开发第一个针对以下内容的 PCL:WSA(Windows 应用商店应用程序)、WPF、WP7、WP8。我们可以说它是一种rolerdex 应用程序,你有联系人,他们有联系方式和图片。 (不是,但我无法提供有关该应用程序的详细信息,因此我使用了一个非常简单的示例)。以下是我的一些问题:)

  • 我应该在 PCL 中有图像吗?

  • 如果是:
  • 如何在 WSA 中引用图像以供使用?
  • 在不同项目中使用时,如何最好地解决缩放限定符等问题?

  • 我没有使用数据库,也没有从外部服务下载图像 - 我想在本地、应用程序或 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/

    相关文章:

    c# - Webbrowser 禁用所有音频输出 - 从在线广播到 youtube

    带有突出显示日期的 wpf 日期选择器

    c# - 将 WinForm 应用程序中的异常冒泡到 WPF 应用程序中。是否可以?

    windows-runtime - UWP AppUriHandler 不起作用

    c# - VisualStateManager.GoToState() 忽略 useTransitions

    c# - DataGrid 不能输入逗号或点作为值?

    javascript - 设置 super 按钮对话框隐藏在主应用程序下方?

    c# - 在 Windows Phone 8.1 中继续以最小化状态运行函数

    c# - VS2012资源 "X"无法解析

    c++ - 从 WinRT C++ 组件访问 COM 对象