如何根据 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
);
}
我有一个 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
);
}