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

C# 如何从UWP应用程序中的XmlDocument内容设置图像组件的SvgImageSource属性?,c#,image,uwp,xmldocument,C#,Image,Uwp,Xmldocument,我有一个Windows 10 UWP应用程序——使用Prism MVVM——在其中我以编程方式——在C#中——在XML文档中创建一些SVG XML,我需要在现有图像组件中显示这些XML 在我的XAML中,我有: <Image Source="{x:Bind ViewModel.SvgSource, Mode=OneWay}" Stretch="Uniform" /> …我通过以下方式在视图模型中设置源: private SVGGenerator generator; SvgSo

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

在我的XAML中,我有:

<Image
 Source="{x:Bind ViewModel.SvgSource, Mode=OneWay}"
 Stretch="Uniform" />
…我通过以下方式在视图模型中设置源:

private SVGGenerator generator;
SvgSource = await generator.GetSourceAsync(_generationCancellationTokenSource.Token);
在我的SVGGenerator类中,我有(除其他方法外):

公共异步任务GetSourceAsync(CancellationToken CancellationToken) { 返回等待任务。运行(()=> { 使用(var stringWriter=new stringWriter()) { XmlWriterSettings设置=新的XmlWriterSettings { 缩进=真, Encoding=Encoding.UTF8 }; 使用(var memoryStream=new memoryStream()) { 使用(var xmlTextWriter=XmlWriter.Create(memoryStream,settings)) { _document.WriteTo(xmlTextWriter); xmlTextWriter.Flush(); var ramStream=新的InMemoryRandomAccessStream(); memoryStream.CopyTo(ramStream); ramStream.Seek(0); 返回ramStream; } } } },取消代币 ); }
memoryStream.CopyTo(ramStream)行未编译-CS1503 C#参数1:无法从“Windows.Storage.Streams.InMemoryRandomAccessStream”转换为“System.IO.Stream”-因为
MemoryStream
无法写入
InMemoryRandomAccessStream
(或者,换句话说,我不知道如何执行)

一些文本–例如–我看到过建议使用
memoryStream.AsRandomAccessStream()
,但我不知道如何使用
.AsRandomAccessStream()
扩展方法(我不知道从哪里获得它,因为可用的代码没有显示using语句)

其他文本–例如–建议使用
memoryStream.CopyTo(ramStream.AsStream())
但是由于类似的原因,
.AsStream()
扩展不可用

我现在正在转圈转圈

“我所要做的就是将
XmlDocument
中的文本直接写入
InMemoryRandomAccessStream
,或者将
MemoryStream
中的内容复制到
InMemoryRandomAccessStream
中,但我都不知道该怎么做

有人能帮我吗?
我应该用另一种(更简单的)方法来做吗?

为了测试代码,我发现
memoryStream
参数是输出类型,但您将空
memoryStream
发送给该方法。因此,请尝试将
WriteTo
修改为
Save
方法,以确保memoryStream具有内容。我在下面发布了完整的
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
    );
}
公共异步任务GetSourceAsync(CancellationToken CancellationToken) { 返回等待任务。运行(异步()=> { 使用(var stringWriter=new stringWriter()) { XmlWriterSettings设置=新的XmlWriterSettings { 缩进=真, Encoding=Encoding.UTF8 }; 使用(var memoryStream=new memoryStream()) { 使用(var xmlTextWriter=XmlWriter.Create(memoryStream,settings)) { _document.Save(xmlTextWriter); xmlTextWriter.Flush(); var ibuffer=memoryStream.GetWindowsRuntimeBuffer(); InMemoryRandomAccessStream randomAccessStream=新建InMemoryRandomAccessStream(); 等待randomAccessStream.WriteAsync(ibuffer); randomAccessStream.Seek(0); 返回随机数据流; } } } },取消代币 ); }
在写入InMemoryRandomAccess流之前,将MemoryStream的位置设置为零。写入MemoryStream后,位置位于文件的末尾,因此当您读取MemoryStream时,不会得到任何数据:MemoryStream.position=0;谢谢你的提示,但是我应该更清楚地说,
memoryStream.CopyTo(ramStream)行未编译:CS1503 C#参数1:无法从“Windows.Storage.Streams.InMemoryRandomAccessStream”转换为“System.IO.Stream”。请参见以下MSDN示例:您能否共享有关
\u文档
的更多详细信息,我需要制作一个代码示例来重现此信息,您也可以为我们分享min示例,以便快速响应。jdweng:谢谢您的链接。这似乎让我走得更远了,但现在我又犯了一些我不明白的错误。(System.ObjectDisposedException:'对象已关闭。(HRESULT中的异常:0x8000013)')这是我第一次使用异步处理、SvgImageSource和InMemoryRandomAccessStream,因此在同时使用它们时,我很难找出问题的实际来源。无论如何,非常感谢。但是,在直接粘贴代码之后,我现在得到以下错误:在“var ibuffer=memoryStream.GetWindowsRuntimeBuffer();”行上,我得到“CS1061‘MemoryStream’不包含‘GetWindowsRuntimeBuffer’的定义,并且找不到接受‘MemoryStream’类型的第一个参数的可访问扩展方法‘GetWindowsRuntimeBuffer’。”(我无法添加“using System.Runtime.InteropServices.WindowsRuntime;”以获取扩展方法。)请参阅下一条评论……在“等待RealAccess Studio .Read SaveCyc(iBuffER)”;“我得到”CS00 12中,“IasyCycOctuffAccess”类型是在未被引用的程序集中定义的。您必须添加对程序集“Windows .Frase.Fuffic Stand,…”的引用。(我还不知道这意味着什么,但我认为这可能与UWP应用程序有关
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
 );
}
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
    );
}