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

问题描述 投票:0回答:1

我有一个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 但我就是不知道该怎么做。

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

c# image uwp xmldocument
1个回答
1
投票

为了测试你的代码,我发现 memoryStream 参数是输出类型,但你发送的是空的 MemoryStream 的方法。所以,请尝试修改 WriteToSave 方法,可以确保内存流有内容。我把完整的 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
    );
}
© www.soinside.com 2019 - 2024. All rights reserved.