C# 如何从UWP应用程序中的XmlDocument内容设置图像组件的SvgImageSource属性?
我有一个Windows 10 UWP应用程序——使用Prism MVVM——在其中我以编程方式——在C#中——在XML文档中创建一些SVG XML,我需要在现有图像组件中显示这些XML 在我的XAML中,我有: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
<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
);
}