如何根据 UWP 应用程序中 XmlDocument 的内容设置图像组件的 SvgImageSource 属性?

How can I set the SvgImageSource property of an Image component from the contents of an XmlDocument in a UWP app?

我有一个 Windows 10 UWP 应用程序——使用 Prism MVVM——我在其中以编程方式——在 C# 中——在我需要在现有图像组件中显示的 XmlDocument 中创建一些 SVG XML .

在我的 XAML 我有:

<Image
 Source="{x:Bind ViewModel.SvgSource, Mode=OneWay}"
 Stretch="Uniform" />

在我的 ViewModel 中我有:

private SvgImageSource _svgSource;
public SvgImageSource SvgSource
{
 get => _svgSource;
 set => _ = SetProperty(ref _svgSource, value);
}

...我通过以下方式在视图模型中设置源:

private SVGGenerator generator;
SvgSource = await generator.GetSourceAsync(_generationCancellationTokenSource.Token);

在我的 SVGGenerator class 中,我有(除其他方法外):

public async Task<IRandomAccessStream> GetSourceAsync(CancellationToken cancellationToken)
{
 return await Task.Run(() =>
   {
     using (var stringWriter = new StringWriter())
     {
       XmlWriterSettings settings = new XmlWriterSettings
       {
         Indent = true,
         Encoding = Encoding.UTF8
       };
       using (var memoryStream = new MemoryStream())
       {
         using (var xmlTextWriter = XmlWriter.Create(memoryStream, settings))
         {
           _document.WriteTo(xmlTextWriter);
           xmlTextWriter.Flush();
           var ramStream = new InMemoryRandomAccessStream();
           memoryStream.CopyTo(ramStream);
           ramStream.Seek(0);
           return ramStream;
         }
       }
     }
   }, cancellationToken
 );
}

memoryStream.CopyTo(ramStream); 行不编译 - CS1503 C# 参数 1:无法从“Windows.Storage.Streams.InMemoryRandomAccessStream”转换为 'System.IO.Stream' - 因为 MemoryStream 无法写入InMemoryRandomAccessStream(或者,换句话说,我不知道该怎么做)。

一些文本——例如How to convert byte array to InMemoryRandomAccessStream or IRandomAccessStream in windows 8 – 我看到建议使用 memoryStream.AsRandomAccessStream() 但我不知道如何使用 .AsRandomAccessStream() 扩展方法(我不可用,我不知道从哪里得到它因为可用代码不显示 using 语句)。

其他文本 – 例如https://csharp.hotexamples.com/examples/Windows.Storage.Streams/InMemoryRandomAccessStream/AsStream/php-inmemoryrandomaccessstream-asstream-method-examples.html – 建议使用 memoryStream.CopyTo(ramStream.AsStream()); 但由于类似原因 .AsStream() 扩展名不可用。

此刻我在兜兜转转

'All' 我想做的是将 XmlDocument 中的文本直接写入 InMemoryRandomAccessStream 或将 MemoryStream 的内容复制到 InMemoryRandomAccessStream 但我也不知道该怎么做。

有人可以帮我吗? 我应该用另一种(更简单的)方式来做这件事吗?

为了测试您的代码,我发现 memoryStream 参数是输出类型,但您向该方法发送了空的 MemoryStream。所以,请尝试将WriteTo修改为Save方法,确保memoryStream有内容。我post下面是完整的GetSourceAsync,大家可以直接使用

public async Task<IRandomAccessStream> GetSourceAsync(CancellationToken cancellationToken)
{
    return await Task.Run(async () =>
    {
        using (var stringWriter = new StringWriter())
        {
            XmlWriterSettings settings = new XmlWriterSettings
            {
                Indent = true,
                Encoding = Encoding.UTF8
            };
            using (var memoryStream = new MemoryStream())
            {
                using (var xmlTextWriter = XmlWriter.Create(memoryStream, settings))
                {
                    _document.Save(xmlTextWriter);
                    xmlTextWriter.Flush();
                    var ibuffer = memoryStream.GetWindowsRuntimeBuffer();
                    InMemoryRandomAccessStream randomAccessStream = new InMemoryRandomAccessStream();
                    await randomAccessStream.WriteAsync(ibuffer);
                    randomAccessStream.Seek(0);
                    return randomAccessStream;
                }
            }
        }
    }, cancellationToken
    );
}