我有一个Windows 10 UWP应用程序--使用Prism MVVM--其中我用C#编程--在一个XmlDocument中创建一些SVG XML,我需要在一个现有的Image组件中显示。
在我的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类中,我有(在其他方法中):
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
);
}
在我的SVGG生成器类中,我有(在其他方法中): memoryStream.CopyTo(ramStream);
行不编译 - CS1503 C# Argument 1: 不能将'Windows.Storage.Streams.InMemoryRandomAccessStream'转换为'System.IO.Stream'-因为 MemoryStream
不能写信给 InMemoryRandomAccessStream
(或者换个说法,我也想不出怎么做)。
一些文本--例如 如何在windows 8中把字节数组转换为InMemoryRandomAccessStream或IRandomAccessStream。 - 我看到有人建议使用 memoryStream.AsRandomAccessStream()
但我不知道如何使用该软件的。.AsRandomAccessStream()
扩展方法(我没有这个方法,我也不知道从哪里得到它,因为现有的代码没有显示使用语句)。
其他文本--例如 https:/csharp.hotexamples.comexamplesWindows.Storage.StreamsInMemoryRandomAccessStreamAsStreamphp-inmemoryrandomaccessstream-asstream-method-examples.html。 - 建议使用 memoryStream.CopyTo(ramStream.AsStream());
而 .AsStream()
延期也是由于类似的原因无法使用。
我此刻正在兜圈子。
我想做的'所有'事情就是要么从一个新的文件中写出文本,要么从一个新的文件中写出文本。XmlDocument
直达 InMemoryRandomAccessStream
或复制内容的 MemoryStream
到一个 InMemoryRandomAccessStream
但我就是不知道该怎么做。
有谁能帮助我吗?我应该用另一种(更简单的)方式来做这件事吗?
为了测试你的代码,我发现 memoryStream
参数是输出类型,但你发送的是空的 MemoryStream
的方法。所以,请尝试修改 WriteTo
到 Save
方法,可以确保内存流有内容。我把完整的 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
);
}