【问题标题】:XAML - Base64 ImageSource is not supported by BlendXAML - Blend 不支持 Base64 ImageSource
【发布时间】:2019-10-10 00:56:03
【问题描述】:

我必须在 WPF 应用程序中显示 SVG 图像。 尝试不使用第 3 方库,我手动(通过 Inkscape)将 SVG 图像转换为 XAML。

我现在的问题是 XAML 文件显示不正确。

如果我在 VisualStudio Designer 中查看这些 XAML 文件,我可以看到有一些图像使用 base64 字符串作为“源”。 Designer 在“源”上显示警告“Blend 中不支持的文件类型”。

例如

  <Image xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Name="image4856" Source="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAVCAYAAABVAo5cAAAACXBIWXMAAAsSAAALEgHS3X78AAAB9ElEQVRIS72VW26DQAxFTwiBNI9W3UL3v7dKbRIgEOiHfTtmGvispSseY82xB9tspmniP6306wfwAhyAI7B3VcDO/QrXxiWbXKNrAHqgdV2Bm18bAfcY6Ow6YgFE6Na1BHy4eqADGgykYCdgFPAFOAGvwLvfn5hDI7Ag2cgc2JEyuwTfBzAIeMAAbxjwDYMr0xqLtGQZOLhaLLtvLFj59MBdwMoXD9iRvmLQMylLfcs1YI/BatIx6mhroBJw5y9UOCcS+ODvY/Hk3zAWS+V+CuKCBVwDZQQKumdesTpW+Sxl2Lu0pkqtCdUu4BaLaueLdVBskdgeMrVD6fsoW4GqsFYIqKgLUjUqozLcr2W48WuZSfsVZMCoIrt/9hxtzNaif9TvpJkyjdl9/hztmW98FzUDyjFOjJ5UfTqypW8ovyGT9hsJk0aLd1dHmhjb4LNjuS0UYONqfY87af8ZUCA1auWbK/p8iMvyDBtsrGloC9wTRluEXUmZqL86UtWtNf5ACvgba/oZVMAI2zOHxVmq8n4GfPB3ln6RoB1hljakX9CGdDSCxeZd+z3p07QY5AJ8YuAr0EagNpuwaJRt/B/G/pLFloj/Q0G/sGxvZEDBHjyZgcwbOrfYVmqN+F+8uToBWxJMx6lRFkdTnp0sz1IVq+NV0XQ/ErcAB5MZ6bUAAAAASUVORK5CYII=" Width="27" Height="20">
    <Image.RenderTransform>
      <TranslateTransform X="310" Y="279.5"/>
    </Image.RenderTransform>
  </Image>

如前所述,XAML 文件直接在图形设计软件 (Inkscape - SaveAs XAML) 中进行转换。 VisualStudio 是否支持 base64 字符串作为 XAML 中的图像源? 有没有人可以解决这个问题?

【问题讨论】:

  • 这样的? stackoverflow.com/a/16243638/1136211。或者,将 base64 字符串放入资源中(例如,在 Window.Resources 中)并使用返回 ImageSource 的 IValueConverter 绑定到它。
  • 我想按原样使用这些文件。在您的示例中,我将不得不修改 XAML 文件。
  • 您也许可以替换 Image 的 Source 属性的 TypeConverter。让我看看……
  • 替换 ImageSource 类的 TypeConverter 似乎不起作用。将其替换为 Source 属性 doesn't seem to be easy
  • 另一种选择是自定义MarkupExtension

标签: c# wpf xaml imagesource


【解决方案1】:

由于 Base64 字符串包含一个编码的图像缓冲区,该缓冲区可以由 WPF 的 BitmapDecoder 之一解码并通过 MarkupExtension 传递给图像对象。

public class Base64Image : MarkupExtension
{
    public string Source { get; set; }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        using (var stream = new MemoryStream(Convert.FromBase64String(Source)))
        {
            return BitmapFrame.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
        }
    }
}

在 Xaml 中:

<Image Source="{markupExtensions:Base64Image Source='...'}" Width="176.3889" Height="44.097225" Stretch="Fill"/>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多