gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:14:36 24 4
gpt4 key购买 nike

我正在开发第一个针对以下内容的 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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com